<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 4135字,需瀏覽 9分鐘

           ·

          2020-08-31 08:22

          來源:網(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


          好文章,我在看

          瀏覽 64
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产精品免费一区二区三区 | 成人黄色视频在线观看网站 | 久久久久国产一区二区三区潘金莲 | 亚洲高清视频免费观看 | 豆花自拍成人精品视频 |