使用${}接收变量时,不会对传过来的变量做处理(#{}会对参数加上双引号),因此,如果需要实现in的效果,又懒得写foreach,可以用英文逗号把List或数组拼接成逗号隔开的字符串,用${}接收,最后sql的效果就是 in (1, 2, 3)。
使用tk.mybatis时,extends tk.mybatis.mapper.common.Mapper<T>可以继承大部分常用方法,如果再extends tk.mybatis.mapper.common.MySqlMapper<T>,可以继承批量插入方法int insertList(List<T> var1)。
使用insertList方法时,主键字段名必须是id,且必须是自增,否则会报错Field 'id' doesn't have a default value
![](https://img.haomeiwen.com/i20803889/c0a8542b97d79bee.png)
mysql对单条sql的长度有限制,而mybatis的批量插入(java的insertList或者xml里的foreach),会把所有数据拼接成一条sql。
因此使用mybatis批量插入时,要控制List的数量,拼接后的sql不要超过mysql的长度限制。
可以用select @@max_allowed_packet查询单条sql的长度限制。
mysql 5.7版本该设置的默认值是4M,8.0版本默认值是64M
![](https://img.haomeiwen.com/i20803889/7e34fbb1c06da503.png)
插入成功后,把生成的id注入到bean的id属性
<insert id="testInsert" useGeneratedKeys="true" keyProperty="id">
insert into adm_black_list(name) values (#{name})
</insert>
批量插入前,一定要对集合判空
使用where column in xxx前,一定要对入参判空
使用updateByPrimaryKeySelective或者updateByExampleSelective,就没法把某个字段修改为null或空字符串,经测试,不可以修改为"",但可以修改为" "
使用order by
example.setOrderByClause("indicator_id desc");
测试PageHelper分页的影响范围
以下两个接口,先调用page1,再调用page2,分页不生效,说明PageHelper分页的影响范围在一次请求内
@GetMapping("page1")
public void page1() {
PageHelper.startPage(1, 10);
}
@GetMapping("page2")
public List<AispRiskDataDO> page2() {
return riskDataMapper.select(new AispRiskDataDO());
}
另外,经测试,PageHelper分页不会影响update
参数为Boolean类型时,不能这样写,否则入参为null时,条件判定为true
<if test="param.isLimited != null and param.isLimited = true">
limit 1000
</if>
正确写法如下,入参为false或null时不执行逻辑
<if test="param.isLimited">
limit 1000
</if>
网友评论