zoukankan      html  css  js  c++  java
  • 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配置文件解析流程:

  • 相关阅读:
    Android ImageView设置图片原理(下)
    C++ 虚函数表 多重继承
    C++ 虚函数表 单继承
    私有继承
    内联函数和宏定义的区别
    #pragma pack(x) CPU对齐
    static 变量(静态变量)
    C++ 中const作用
    如何连接宏参数
    几种常见容器比较和分析 hashmap, map, vector, list ...hash table
  • 原文地址:https://www.cnblogs.com/daimajun/p/14964556.html
Copyright © 2011-2022 走看看