文章目录
- 一.基础概念
- 1.什么是MyBatis
- 2.添加MyBatis依赖
- 3.配置MyBatis中的xml路径
- 二.MyBatis的使用
- 1.添加用户实体类
- 2.添加 mapper 接⼝
- 3.配置xml
- 4.接口实现
- 5.添加Service
- 6.添加Controller
- 三.其它情况下Mybatis的使用
- 1.返回自增主键值
- 2.数据库字段和类属性不匹配
- 四.动态SQL
- 1.参数占位符 #{} 和 ${}
- 2.<if>标签
- 3. \<trim>标签
- 4.\<where>标签
- 5. \<foreach>标签
一.基础概念
1.什么是MyBatis
MyBatis是一个持久层框架,简单来说 MyBatis是更简单的操作和读取数据库⼯具。
2.添加MyBatis依赖
<!-- 添加 MyBatis 框架 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version>
</dependency><!-- 添加 MySQL 驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version><scope>runtime</scope>
</dependency>
如果是SpringBoot项目可以直接在创建项目的时候进行勾选
3.配置MyBatis中的xml路径
配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件 application.yml#连接数据库
spring:datasource:url: jdbc:mysql://localhost:3306/mycnblog?characterEncoding=utf8&useSSL=falseusername: rootpassword: ""driver-class-name: com.mysql.cj.jdbc.Driver#配置mybatis
mybatis:mapper-locations: classpath:mybatis/**Mapper.xml
二.MyBatis的使用
1.添加用户实体类
属性名称要和数据库的字段名称对应
@Datapublic class User {private Integer id;private String username;private String password;private String photo;private Date createTime;private Date updateTime;
}
2.添加 mapper 接⼝
@Mapperpublic interface UserMapper {public List<User> getAll();
}
3.配置xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybati
s.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">//curd</mapper>
namespace指的就是接口类的位置
4.接口实现
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybati
s.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.demo.mapper.UserMapper"><select id="getAll" resultType="com.example.demo.model.User">select * from userinfo</select>
</mapper>
- resultType: 返回的数据格式
- id: 接口的方法名称
5.添加Service
@Servicepublic class UserService {@Resourceprivate UserMapper userMapper;public List<User> getAll() {return userMapper.getAll();}
}
6.添加Controller
@RestController@RequestMapping("/u")public class UserController {@Resourceprivate UserService userService;@RequestMapping("/getall")public List<User> getAll(){return userService.getAll();}
}
简单Mybatis使用已经完成
三.其它情况下Mybatis的使用
1.返回自增主键值
<!-- 返回⾃增id --><insert id="add2" useGeneratedKeys="true" keyProperty="id">insert into userinfo(username,password,photo,state)values(#{username},#{password},#{photo},1)
</insert>
- useGeneratedKeys:这会令 MyBatis 使⽤ JDBC 的 getGeneratedKeys ⽅法来取出由数据库内部⽣成的主键(⽐如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的⾃动递增字段),默认值:false。
- keyColumn:设置⽣成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第⼀列的时候,是必须设置的。如果⽣成列不⽌⼀个,可以⽤逗号分隔多个属性名称。
- keyProperty:指定能够唯⼀识别对象的属性,MyBatis 会使⽤ getGeneratedKeys 的返回值或 insert 语句的 selectKey ⼦元素设置它的值,默认值:未设置(unset)。如果⽣成列不⽌⼀个,可以⽤逗号分隔多个属性名称。
2.数据库字段和类属性不匹配
返回字典映射:resultMap
<resultMap id="BaseMap" type="com.example.demo.model.User"><id column="id" property="id"></id><result column="username" property="username"></result><result column="password" property="pwd"></result>
</resultMap>
<select id="getUserById" resultMap="com.example.demo.mapper.UserMapper.Base
Map">select * from userinfo where id=#{id}
</select>
column是数据字段,property是类属性名
四.动态SQL
1.参数占位符 #{} 和 ${}
- #{}:预编译处理
- ${}: 字符直接替换
预编译处理是指:MyBatis 在处理#{}时,会将 SQL 中的 #{} 替换为?号,使⽤ PreparedStatement 的 set ⽅法来赋值。直接替换:是MyBatis 在处理 ${} 时,就是把 ${} 替换成变量的值。
${}有可能会引发sql注入问题,能用#{}则用#{}
2.标签
<insert id="insert" parameterType="org.example.model.User" useGeneratedKey
s="true" keyProperty="id">insert into user(username,password,nickname,<if test="sex != null">sex,</if>birthday,head) values (#{username},#{password},#{nickname},<if test="sex != null">#{sex},</if>#{birthday},#{head})
</insert>
前端传来的对象有可能有些属性为null,如果还是照常进行插入,将可能不会触发数据库字段的default属性。
if如果会真则会保留值,否则删除
3. <trim>标签
之前的插⼊⽤户功能,只是有⼀个 sex 字段可能是选填项,如果所有字段都是⾮必填项,就考虑使⽤
<trim>标签结合<if>标签,对多个字段都采取动态⽣成的⽅式。
<trim>标签中有如下属性:
- prefix:表示整个语句块,以prefix的值作为前缀
- suffix:表示整个语句块,以suffix的值作为后缀
- prefixOverrides:表示整个语句块要去除掉的前缀
- suffixOverrides:表示整个语句块要去除掉的后缀
4.<where>标签
样例:
<select id="selectUsers" parameterType="map" resultType="User"> SELECT * FROM users <where> <if test="name != null"> AND name = #{name} </if> <if test="age != null"> AND age = #{age} </if> <if test="email != null"> AND email = #{email} </if> </where>
</select>
在上面的示例中,如果传入的参数中name不为null,则查询条件中会包含AND name = #{name};如果age不为null,则查询条件中会包含AND age = #{age};如果email不为null,则查询条件中会包含AND email = #{email}。这样就可以根据输入参数灵活地构建查询条件,避免了硬编码的弊端。
类似<where>标签的还有<set>
5. <foreach>标签
对集合进⾏遍历时可以使⽤该标签。标签有如下属性:
- collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象
- item:遍历时的每⼀个对象
- open:语句块开头的字符串
- close:语句块结束的字符串
- separator:每次遍历之间间隔的字符串
示例
<delete id="deleteByIds">delete from articlewhere id in<foreach collection="list" item="item" open="(" close=")" separator=",">#{item}</foreach></delete>