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>
mybatis配置檔案解析流程:
作者:碼上猿夢
出處:http://www.cnblogs.com/daimajun/
代碼路上一隻猿,手敲轉載請聲明。有時間請關注同名微信訂閱号【碼上猿夢】,謝謝。
總是有錯誤,希望有人能直接指出我的錯誤。