天天看點

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配置檔案解析流程:

作者:碼上猿夢

出處:http://www.cnblogs.com/daimajun/

代碼路上一隻猿,手敲轉載請聲明。有時間請關注同名微信訂閱号【碼上猿夢】,謝謝。

總是有錯誤,希望有人能直接指出我的錯誤。