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

來源:網(wǎng)易工程師-倪駿
什么是通用Mapper?
它是一個可以方便的使用Mybatis進(jìn)行單表的增刪改查優(yōu)秀開源產(chǎn)品。它使用攔截器來實(shí)現(xiàn)具體的執(zhí)行Sql,完全使用原生的Mybatis進(jìn)行操作。在Github上標(biāo)星5.9K!
為什么要用Mapper?
它提供了所有單表的基本增刪改查方法,大大節(jié)省了我們書寫基本mapper.xml的時間。尤其對于新工程和新表來說,極大的提高...
不客氣的說,使用這個通用Mapper甚至能改變你對Mybatis單表基礎(chǔ)操作不方便的想法,使用它你能簡單的使用單表的增刪改查,包含動態(tài)的增刪改查。
同時,在代碼結(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);//?注冊自己項(xiàng)目中使用的通用Mapper接口,這里沒有默認(rèn)值,必須手動注冊
mapperHelper.registerMapper(Mapper.class);
//配置完成后,執(zhí)行下面的操作
mapperHelper.processConfiguration(session.getConfiguration());
2).?純Spring配置方式
????"basePackage"?value="com.isea533.mybatis.mapper"/>
????"properties">
????????
????????????mappers=tk.mybatis.mapper.common.Mapper????????
????
你沒看錯,就是這么配置的,注意這里是tk.mybatis.xxx,和MyBatis的唯一區(qū)別就是org.改成了tk.,方便修改和記憶。
通用Mapper的各項(xiàng)屬性通過properties屬性進(jìn)行配置,如果默認(rèn)配置就是一行mappers=tk.mybatis.mapper.common.Mapper時,可以不寫,就會變成:
????"basePackage"?value="com.isea533.mybatis.mapper"/>
繼承通用Mapper接口(注意必須要加泛型):
@Repository
public?interface?MaterialDao?extends?Mapper,?InsertUseGeneratedKeysMapperr?{}
上圖示例繼承了Mapper和InsertUseGeneratedKeysMapper,則直接擁有了這2個接口的所有方法。
上圖中實(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)下劃線(只對大寫字母進(jìn)行處理),如UserInfo默認(rèn)對應(yīng)的表名為user_info。
2.表名可以使用@Table(name = "tableName")進(jìn)行指定,對不符合第一條默認(rèn)規(guī)則的可以通過這種方式指定表名.
3.字段默認(rèn)和@Column一樣,都會作為表字段,表字段默認(rèn)為Java對象的Field名字駝峰轉(zhuǎn)下劃線形式.
4.可以使用@Column(name = "fieldName")指定不符合第3條規(guī)則的字段名
5.使用@Transient注解可以忽略字段,添加該注解的字段不會作為表字段使用.
6.建議一定是有一個@Id注解作為主鍵的字段,可以有多個@Id注解的字段作為聯(lián)合主鍵.
7.默認(rèn)情況下,實(shí)體類中如果不存在包含@Id注解的字段,所有的字段都會作為主鍵字段進(jìn)行使用(這種效率極低).
8.實(shí)體類可以繼承使用,可以參考測試代碼中的tk.mybatis.mapper.model.UserLogin2類.
9.由于基本類型,如int作為實(shí)體類字段時會有默認(rèn)值0,而且無法消除,所以實(shí)體類中建議不要使用基本類型.
10.@NameStyle注解,用來配置對象名/字段和表名/字段之間的轉(zhuǎn)換方式,該注解優(yōu)先于全局配置style,可選值:
另外,建議實(shí)體類的所有Field全部使用裝箱類,不要使用基本類型。
id字段上的@GeneratedValue注解用來表示該表使用的主鍵策略類型。
使用Mybatis-Generator來生成實(shí)體類:
使用方法參見:http://ks.netease.com/blog?id=8920
關(guān)于主鍵策略
主鍵策略主要用于insert場景。通常情況下,可以不用設(shè)置表對象的主鍵策略。不設(shè)置時,默認(rèn)會使用JDBC 的 getGeneratedKeys 方法來取出由數(shù)據(jù)庫內(nèi)部生成的主鍵。
你也可以以@GeneratedValue(generator = “”)的形式來指定主鍵策略命令。如:@GeneratedValue(strategy = GenerationType.IDENTITY
,generator = “select last_insert_id()”)等。
同時,可以根據(jù)實(shí)際需要,在全局配置中指定主鍵策略的執(zhí)行ORDER。
用Mybatis-Generator生成實(shí)體類,并創(chuàng)建一個繼承了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嗎?有沒有什么缺陷?我們做了什么改動?
fork的Mapper版本是3.4.2的,最新3.4.3還沒有release。
像這樣的通用框架,幾乎支持了市面上所有主流的rdbms,但是大網(wǎng)易的DDB就呵呵噠了。
腫么辦呢,當(dāng)然是改啦。主要的問題是主鍵策略不支持。于是題主就給她新增了一種逐漸策略,名字就叫“DDB”。同樣是通過攔截器修改mybatis的Configuration實(shí)現(xiàn)的。
同時新增了一個支持DDB批量Insert的Mapper,使用全局替換符的形式實(shí)現(xiàn)。
在對原生的Mapper做了這2個增強(qiáng)以后,就可以愉快的支持DDB的增刪改查了。
使用時,請引入以下jar包:
com.netease.pop.mybatis
mapper
4.0.0
同時,在配置文件中增加如下2行:
INDENTITY=DDB表示使用名稱為DDB的主鍵策略(或者也可以在實(shí)體類的GeneratedValue注解中指定generator命令)
ORDER=BEFORE表示在insert命令前執(zhí)行該主鍵策略(這是為了在insert前獲取主鍵id值來使用)
其他
除了節(jié)省書寫sql的時間外,配合另一個分頁的開源插件PageHelper使用,可以事半功倍。使用上簡單到可怕。
用法示例如下:
PageHelper.offsetPage(offset,?limit);
Page?metas?=?(Page)?materialDao.selectByExample(example);
沒錯,就只有這么一行。。。
具體的接入方式可以參看以下文檔:https://github.com/pagehelper/Mybatis
PageHelper/blob/master/README_zh.md

好文章,我在看
好文章,我在看
