解放雙手,不寫SQL!一個(gè)開源mybatis神器

來源:sq.163yun.com/blog/article/198894931418546176
什么是通用 Mapper?
它是一個(gè)可以方便的使用 Mybatis 進(jìn)行單表的增刪改查優(yōu)秀開源產(chǎn)品。它使用攔截器來實(shí)現(xiàn)具體的執(zhí)行 Sql,完全使用原生的 Mybatis 進(jìn)行操作。在 Github 上標(biāo)星 5.9K!
為什么要用 Mapper?
它提供了所有單表的基本增刪改查方法,大大節(jié)省了我們書寫基本 mapper.xml 的時(shí)間。尤其對(duì)于新工程和新表來說,極大的提高...
不客氣的說,使用這個(gè)通用 Mapper 甚至能改變你對(duì) Mybatis 單表基礎(chǔ)操作不方便的想法,使用它你能簡(jiǎn)單的使用單表的增刪改查,包含動(dòng)態(tài)的增刪改查。
同時(shí),在代碼結(jié)構(gòu)合理的前提下,更換 RDBMS 也無須修改 sql,只需修改部分配置即可實(shí)現(xiàn)。
如何使用 Mapper?
先通過 maven 引入 jar 包:
??
????tk.mybatis ??
????mapper ??
????x.x.x ??
??
?
添加配置文件:
配置方式分為 Java 編碼方式和 spring 集成方式。
Java 編碼方式
MapperHelper?mapperHelper?=?new?MapperHelper();??
//特殊配置??
Config?config?=?new?Config();//具體支持的參數(shù)看后面的文檔??
config.setXXX(XXX);//設(shè)置配置??
mapperHelper.setConfig(config);//?注冊(cè)自己項(xiàng)目中使用的通用Mapper接口,這里沒有默認(rèn)值,必須手動(dòng)注冊(cè)??
mapperHelper.registerMapper(Mapper.class);??
//配置完成后,執(zhí)行下面的操作??
mapperHelper.processConfiguration(session.getConfiguration());??
?
2). 純Spring配置方式
??
????"basePackage"?value="com.isea533.mybatis.mapper"/>??
????"properties">??
??????????
????????????mappers=tk.mybatis.mapper.common.Mapper???????? ??
???? ??
??
?
你沒看錯(cuò),就是這么配置的,注意這里是 tk.mybatis.xxx, 和 MyBatis 的唯一區(qū)別就是 org. 改成了 tk.,方便修改和記憶。
通用 Mapper 的各項(xiàng)屬性通過 properties 屬性進(jìn)行配置,如果默認(rèn)配置就是一行 mappers=tk.mybatis.mapper.common.Mapper 時(shí),可以不寫,就會(huì)變成:
??
????"basePackage"?value="com.isea533.mybatis.mapper"/>??
??
?
繼承通用 Mapper 接口(注意必須要加泛型):
@Repository??
public?interface?MaterialDao?extends?Mapper,???
InsertUseGeneratedKeysMapperr?{}??
??
?
上圖示例繼承了Mapper和InsertUseGeneratedKeysMapper,則直接擁有了這2個(gè)接口的所有方法。
上圖中實(shí)體類的寫法示例:
@Table(name?=?"tb\_helpcenter\_material")??
public?class?MaterialMeta?{??
????@Id??
????@GeneratedValue(strategy?=?GenerationType.IDENTITY)??
????private?Long?id;??
????private?String?title;??
????private?String?tags;??
????private?Long?classificationId;??
????private?String?platform;??
????private?String?lecturerName;??
????//?Setters&Getters??
}??
?
實(shí)體類的規(guī)則:
1. 表名默認(rèn)使用類名, 駝峰轉(zhuǎn)下劃線 (只對(duì)大寫字母進(jìn)行處理), 如 UserInfo 默認(rèn)對(duì)應(yīng)的表名為 user_info。
2. 表名可以使用 @Table(name = "tableName") 進(jìn)行指定, 對(duì)不符合第一條默認(rèn)規(guī)則的可以通過這種方式指定表名.
3. 字段默認(rèn)和 @Column 一樣, 都會(huì)作為表字段, 表字段默認(rèn)為 Java 對(duì)象的 Field 名字駝峰轉(zhuǎn)下劃線形式.
4. 可以使用 @Column(name = "fieldName") 指定不符合第 3 條規(guī)則的字段名
5. 使用 @Transient 注解可以忽略字段, 添加該注解的字段不會(huì)作為表字段使用.
6. 建議一定是有一個(gè) @Id 注解作為主鍵的字段, 可以有多個(gè) @Id 注解的字段作為聯(lián)合主鍵.
7. 默認(rèn)情況下, 實(shí)體類中如果不存在包含 @Id 注解的字段, 所有的字段都會(huì)作為主鍵字段進(jìn)行使用 (這種效率極低).
8. 實(shí)體類可以繼承使用, 可以參考測(cè)試代碼中的 tk.mybatis.mapper.model.UserLogin2 類.
9. 由于基本類型, 如 int 作為實(shí)體類字段時(shí)會(huì)有默認(rèn)值 0, 而且無法消除, 所以實(shí)體類中建議不要使用基本類型.
10.@NameStyle 注解,用來配置對(duì)象名 / 字段和表名 / 字段之間的轉(zhuǎn)換方式,該注解優(yōu)先于全局配置 style,可選值:
另外,建議實(shí)體類的所有 Field 全部使用裝箱類,不要使用基本類型。
id 字段上的 @GeneratedValue 注解用來表示該表使用的主鍵策略類型。
使用 Mybatis-Generator 來生成實(shí)體類:
使用方法參見:http://ks.netease.com/blog?id=8920
關(guān)于主鍵策略
主鍵策略主要用于 insert 場(chǎng)景。通常情況下,可以不用設(shè)置表對(duì)象的主鍵策略。不設(shè)置時(shí),默認(rèn)會(huì)使用 JDBC 的 getGeneratedKeys 方法來取出由數(shù)據(jù)庫內(nèi)部生成的主鍵。
你也可以以 @GeneratedValue(generator = “”) 的形式來指定主鍵策略命令。如:@GeneratedValue(strategy = GenerationType.IDENTITY
,generator = “select last_insert_id()”) 等。
同時(shí),可以根據(jù)實(shí)際需要,在全局配置中指定主鍵策略的執(zhí)行 ORDER。
用 Mybatis-Generator 生成實(shí)體類,并創(chuàng)建一個(gè)繼承了 Mapper 接口的 dao 以后,還要寫什么呢?
答案是不用了,可以直接用了
就像這樣:
MaterialMeta?materialMeta?=?ReflectUtil.convertObj(MaterialMeta.class,?material,?false);??
materialMeta.setPlatform(platformStr);??
materialDao.insertSelective(materialMeta);??
?
還有這樣:
Example?example?=?new?Example(MaterialMeta.class);??
example.createCriteria().andEqualTo("classificationId",?material.getClassificationId()).andEqualTo("deleted",false);??
??
example.orderBy("sort").desc();??
PageHelper.startPage(1,?1);??
List?materialMetas?=?materialDao.selectByExample(example);??
?
或者這樣:
materialMeta.setStatus(MaterialStatus.online);??
materialMeta.setPublishDate(new?Date());??
materialDao.updateByPrimaryKeySelective(materialMeta);??
?
如此一來,一行 sql 都不需要寫,mapper.xml 文件也不需要了(特殊 sql 仍然需要手寫)。
只是引入了原生的 Mapper 嗎?有沒有什么缺陷?我們做了什么改動(dòng)?
fork 的 Mapper 版本是 3.4.2 的,最新 3.4.3 還沒有 release。
像這樣的通用框架,幾乎支持了市面上所有主流的 rdbms,但是大網(wǎng)易的 DDB 就呵呵噠了。
腫么辦呢,當(dāng)然是改啦。主要的問題是主鍵策略不支持。于是題主就給她新增了一種逐漸策略,名字就叫 “DDB”。同樣是通過攔截器修改 mybatis 的 Configuration 實(shí)現(xiàn)的。
同時(shí)新增了一個(gè)支持 DDB 批量 Insert 的 Mapper,使用全局替換符的形式實(shí)現(xiàn)。
在對(duì)原生的 Mapper 做了這 2 個(gè)增強(qiáng)以后,就可以愉快的支持 DDB 的增刪改查了。
使用時(shí),請(qǐng)引入以下 jar 包:
??
com.netease.pop.mybatis ??
mapper ??
4.0.0 ??
??
?
同時(shí),在配置文件中增加如下 2 行:
INDENTITY=DDB 表示使用名稱為 DDB 的主鍵策略 (或者也可以在實(shí)體類的 GeneratedValue 注解中指定 generator 命令)
ORDER=BEFORE 表示在 insert 命令前執(zhí)行該主鍵策略 (這是為了在 insert 前獲取主鍵 id 值來使用)
其他
除了節(jié)省書寫 sql 的時(shí)間外,配合另一個(gè)分頁的開源插件 PageHelper 使用,可以事半功倍。使用上簡(jiǎn)單到可怕。
用法示例如下:
PageHelper.offsetPage(offset,?limit);??
Page?metas?=?(Page)?materialDao.selectByExample(example);??
?
沒錯(cuò),就只有這么一行。。。
具體的接入方式可以參看以下文檔:https://github.com/pagehelper/MybatisPageHelper/blob/master/README_zh.md
由于微信平臺(tái)算法改版,公號(hào)內(nèi)容將不再以時(shí)間排序展示,如果大家想第一時(shí)間看到我們的推送,強(qiáng)烈建議星標(biāo)我們和給我們多點(diǎn)點(diǎn)【在看】。星標(biāo)具體步驟為:
(1)點(diǎn)擊頁面最上方“小詹學(xué)Python”,進(jìn)入公眾號(hào)主頁。
(2)點(diǎn)擊右上角的小點(diǎn)點(diǎn),在彈出頁面點(diǎn)擊“設(shè)為星標(biāo)”,就可以啦。
感謝支持,比心。
