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. 常量表「字典表」以及长期不变的表,并且是热点数据;

#号和$符号的区别:

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>

mybatis配置文件解析流程:

posted @ 2021-07-02 19:24  码上猿梦  阅读(59)  评论(0编辑  收藏  举报