MyBatis
MyBatis
MyBatis 常见问题:
1、null 和 0 的问题:
- 问题描述:某个属性传入的是 0,判断条件是非 null 且非空字符串,结果没有进 if;
- 原因:mybatis 中当你传入整型的 0 会被解析为 null;
- 解决办法:在判断是不能只判断 null 和'',还需要判断是否是 0;
- 示例代码:
<if test="workGroupId != null and workGroupId != '' or workGroupId == 0 ">
b.work_group_id=#{workGroupId, jdbcType=DECIMAL}
</if>
2、如何获取自增主键
- 在 MyBatis 配置文件中设置:usegeneratedkeys 为 true
mybatis核心对象:
- SqlSessionFactoryBuilder:用于构建会话工厂,构建完毕后当即丢弃该对象;
- SqlSessionFactory:用于生成会话的工厂,作用于整个应用运行期间;
- SqlSession:作用于一次会话请求,不能在多个线程间使用,因为它是有状态的,线程不安全;
mybatis缓存使用场景
一级缓存使用条件:「同时满足」
1、 必须是相同的 SQL,并且参数也相同;
2、必须是相同的 session 会话;
3、必须是相同的 namespace,即同一个 mapper;
4、在本次 session 会话中没有使用 session.clearCache()方法;
5、查询语句中间没有执行 insert、update 和 delete 方法,不管是否有变更数据库
一级缓存使用场景:「默认开启」
1、多表关联查询转换为单表多次查询;
2、订单表和会员表关联查询转换为先查订单表,然后根据订单表的 user_id 去查询会员表,在订单表中会有重复的 user_id,这些重复的查询可以直接走缓存「也可以在查询前做一次 user_id 去重,这样连查缓存的操作都没有必要做了,程序效率更高」;
二级缓存使用条件:「同时满足」
1、当前会话提交或关闭之后才会填充二级缓存;
2、必须在同一个 namespace 下,即同一个 mapper
3、必须是相同的 SQL 和参数;
4、如果 readWrite=true 的话,实体对象必须实现 Serializable 接口,能够被序列化;
二级缓存清除条件:「满足任何一个即可」
1、只有修改会话「update、insert」提交之后;
2、
二级缓存使用场景:
- 常量表「字典表」以及长期不变的表,并且是热点数据;
#号和$符号的区别:
1、# 号采用的是预编译,能避免sql注入;
2、$ 符号是简单的占位符,不能避免sql注入;
- 使用场景:
1、实现动态 SQL 时需要使用 $ 符号,因为 # 号会携带单引号
动态 SQL 就是表名或者 order by 字段由程序去指定,而不是在 SQL 中写好
常用标签「https://blog.csdn.net/m0_38054145/article/details/81906343」
- 一级标签:select、insert、update、delete、sql、resultMap
- 内层标签:where、foreach、where、choose、when、otherwise、if、set、trim、include、collection
返回结果集对象的属性包含集合:
- javaBean 代码:
@Data
public class SysUser {
private Long id;
private String loginName;
private String userName;
private String email;
// 属性是一个集合对象
private List<Long> roles;
}
- mapper 文件:
<resultMap id="SysUserMap" type="com.entity.dto.SysUser">
<id property="id" column="id" jdbcType="BIGINT" />
<result column="login_name" property="loginName" jdbcType="VARCHAR"/>
<result column="user_name" property="userName" jdbcType="VARCHAR"/>
<result column="email" property="email" jdbcType="VARCHAR"/>
<!-- 集合属性使用 collection 标签-->
<collection property="roles" ofType="Long">
<constructor>
<arg column="role_id" />
</constructor>
</collection>
</resultMap>