1. insert 标签
insert 标签是用于定义插入语句的.
1.1 常用属性
insert 有几个常用的属性:
- id: sql 片段在命名空间内的唯一标识. 和mapper 中方法名保持一致
- useGeneratedKeys: 是否回填自动生成的主键
- keyProperty: 主键回填到哪个属性
- keyColumn: 主键回填的字段名, 可省略
- parameterType: 参数类型, 通常都可以省略.
- flushCache: 是否刷新(清空)一级缓存和二级缓存, 默认为true. 笔者尝试设置为false,并不生效. 所以使用默认即可.
- timeout: sql 执行超时时间, 默认未设置, 由数据库驱动决定.
- statementType: 执行sql时使用的statement类型, 默认为PREPARED. 可选值为:STATEMENT,PREPARED 或 CALLABLE 的一个
<insert
id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
keyProperty=""
keyColumn=""
useGeneratedKeys=""
timeout="20">
</insert>
1.2 返回值
- 我们知道, jdbc 执行插入语句时, 返回的是sql 执行影响的记录条数. Mybatis 可将此返回结果自动封装为int , long, boolean 以及其对应的包装类型.
- 对于不同的返回类型, sql 片段的写法是完全一致的
Mapper中方法定义:
// 返回值为空
void insert(Employee emp);
// 返回值为布尔类型
boolean insert(Employee emp);
// 返回值为删除的条数
long insert(Employee emp);
sql 片段:
<insert id="save" useGeneratedKeys="true" keyProperty="id">
insert into t_employee values (null, #{name}, #{sex}, #{age}, #{entryDate})
</insert>
2. insert 标签举例
2.1 sql 片段
<!-- 新增 -->
<insert id="save" useGeneratedKeys="true" keyProperty="id">
insert into t_employee(id, name, sex, age, entryDate) values (null, #{name}, #{sex}, #{age}, #{entryDate})
</insert>
<!-- mysql 批量新增 -->
<insert id="batchSave" useGeneratedKeys="true" keyProperty="id">
insert into t_employee(id, name, sex, age, entryDate)
values
<foreach collection="list" separator="," item="emp">
(null, #{emp.name}, #{emp.sex}, #{emp.age}, #{emp.entryDate})
</foreach>
</insert>
2.2 mapper 文件
public interface EmployeeMapper {
// 保存
boolean save(EmployeePO employeePO);
// 批量保存
long batchSave(List<EmployeePO> employeePOList);
}
2.3 测试类
// 测试保存方法
@Test
public void save(){
EmployeeMapper employeeMapper = SqlSessionUtil.getMapper(EmployeeMapper.class, true);
for (int i = 1; i <= 10; i++) {
EmployeePO employeePO = new EmployeePO("lisa_" + i, 20, "W", LocalDate.of(2018, 05, i));
boolean flag = employeeMapper.save(employeePO);
// 校验是否保存成功
Assert.assertEquals(true, flag);
// 校验是否回填id
Assert.assertNotNull(employeePO.getId());
}
}
// 测试批量保存
@Test
public void batchSave(){
EmployeeMapper employeeMapper = SqlSessionUtil.getMapper(EmployeeMapper.class, true);
List<EmployeePO> empList = new ArrayList<>();
empList.add(new EmployeePO("lisi_01", 26, "M", LocalDate.now()));
empList.add(new EmployeePO("lisi_02", 26, "M", LocalDate.now()));
empList.add(new EmployeePO("lisi_03", 26, "M", LocalDate.now()));
long num = employeeMapper.batchSave(empList);
Assert.assertEquals(3L, num);
}