最近項目重構 dao層使用的Mybatis plus,有必要總結下。
Mybatis plus 會自動維護Mybatis 以及 MyBatis-Spring 相關依賴 所以在構建項目時候 只需要引入Mybatis plus 的maven坐標就OK了
Mybatis plus的核心在BaseMapper<T>
包含了各種各樣的 接口方法
所以我們繼承后就可以拿來使用了!
Q1:
在插入時候 bean(包含ID) 需要 使用主鍵策略 (數據庫ID自增)
使用注解@Table
在Bean上面加上注解 @TableId(value="id", type=IdType.AUTO)
可以配置全局策略 就不用每個表都寫這個注解了! 處理下划線到駝峰命名的問題
Q2:
MP會默認使用實體類的類名到數據庫中找對應的表
使用注解@TableName(value=“tx_user“)解決
可以配置全局策略 加個統一的前綴,就不用每個表都寫這個注解了! 前綴+實體類 是table name
Q3:
Mybatis plus全局策略配置
xx.xx.xx.GlobalConfiguration
默認是true 解析駝峰命名 到 下划線對應
Q4:
@TableField(value="last_name") 對應數據庫的名字
@TableField(exist=false) 這個字段數據庫沒有哦 插入時候不會報錯(用的比較少)
Q5:
在插入一條數據時候,獲取主鍵值
自動的回寫到實體類Bean中 不需要額外的操作
Q6:
插入時候
方法 insert() 只有非空的才會出現在sql語句日志中
insertAllColumn() 插入所有字段 空的也是顯示的 日志打印會出來這幾個字段 但是是null 結果也是一樣的 返回Integer
Q7:
updateById() 通用更新操作 返回Integer
updateAllColumnByID 會插入null
Q8:
selectById()
selectOne( entity ) 通過多個列進行查詢 非空屬性作為條件進行查詢了 要返回一條數據 要不就報錯了
List<T> selectBatchIds(List<? extends Serializable> idList) //通過多個Id進行查詢
LIst<T> selectByMap<columnMap> // key 是列名"school_name"
List<T> selectPage(RowBounds rowBounds, Warpper<T> wrapper); //分頁查詢 Page的對象繼承了rowBounds 底層沒有使用limit 使用的Mybatis的 內存的分頁方式 參數 第幾頁 每頁顯示多少條數據
Mybatis有個PageHelper Mybatis Plus 有自己的分頁插件
補充 selectList
selectOne
selectById
selectAll
selectCount
Q9: (remove)
Integer deleteById(Serializable id)
Integer deleteByMap(@Param("crm") Map<String, Object> columnMap) key一定要寫數據庫的列名
Integer deleteBatchIds(LIst<? extends Serializable> iDList) //批量刪除 底層sql 使用的in
以上是常用的CRUD
原理分析
BaseMapper 中提供了通用的CRUD方法
補充功能強大的條件構造器 EntityWrapper
實體包裝器,主要用於處理SQL拼接,排序,實體參數查詢等。
條件參數說明
查詢方式 | 說明 |
---|---|
setSqlSelect | 設置 SELECT 查詢字段 |
where | WHERE 語句,拼接 + WHERE 條件 |
and | AND 語句,拼接 + AND 字段=值 |
andNew | AND 語句,拼接 + AND (字段=值) |
or | OR 語句,拼接 + OR 字段=值 |
orNew | OR 語句,拼接 + OR (字段=值) |
eq | 等於= |
allEq | 基於 map 內容等於= |
ne | 不等於<> |
gt | 大於> |
ge | 大於等於>= |
lt | 小於< |
le | 小於等於<= |
like | 模糊查詢 LIKE |
notLike | 模糊查詢 NOT LIKE |
in | IN 查詢 |
notIn | NOT IN 查詢 |
isNull | NULL 值查詢 |
isNotNull | IS NOT NULL |
groupBy | 分組 GROUP BY |
having | HAVING 關鍵詞 |
orderBy | 排序 ORDER BY |
orderAsc | ASC 排序 ORDER BY |
orderDesc | DESC 排序 ORDER BY |
exists | EXISTS 條件語句 |
notExists | NOT EXISTS 條件語句 |
between | BETWEEN 條件語句 |
notBetween | NOT BETWEEN 條件語句 |
addFilter | 自由拼接 SQL |
last | 拼接在最后,例如:last("LIMIT 1") |
范圍:
.between("age",2,6);
.like("name","jack")
.or() //或者使用orNew() orNew() 之前的結果封裝 與后面的進行拼接
.like("email","a") //或者郵箱有a 的
修改操作:
userEntity 屬性是要修改的值
Wrapper是條件 不停的.eq (就是where了)
.update(UserEntity, Wrapper )
刪除操作
.update()
封裝一個添加構造器就OK了 .eq() .eq()
高級點的查詢
排序的:
.orderBy() 默認升序
.orderDesc() 降序 傳入的是集合!
.last( “desc”) 手動把SQL拼接到最后(有sql注入的風險)
.last("limit 1,3")