mybatis

mybatis笔记

2020-05-01  本文已影响0人  修行者12138

使用${}接收变量时,不会对传过来的变量做处理(#{}会对参数加上双引号),因此,如果需要实现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

image.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


image.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>
上一篇 下一篇

猜你喜欢

热点阅读