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配置文件解析流程:

  • 相关阅读:
    springmvc
    POJ 3683 Priest John's Busiest Day
    POJ 3678 Katu Puzzle
    HDU 1815 Building roads
    CDOJ UESTC 1220 The Battle of Guandu
    HDU 3715 Go Deeper
    HDU 3622 Bomb Game
    POJ 3207 Ikki's Story IV
    POJ 3648 Wedding
    HDU 1814 Peaceful Commission
  • 原文地址:https://www.cnblogs.com/daimajun/p/14964556.html
Copyright © 2011-2022 走看看