<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!一個(gè)開源mybatis神器

          共 4376字,需瀏覽 9分鐘

           ·

          2020-10-21 12:11

          709cbd3287c40ad55fe29807b3822e79.webp

          作者:倪駿
          來源: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!63ec3c6e81470c9ce435c57491d70866.webp

          為什么要用 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)”,就可以啦。


          感謝支持,比心。

          瀏覽 34
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  成人三级网站在线观看 | 国产美国黄色毛片 | 美女操高潮网站 | 日本少妇高潮喷水XXXXXXX | 亚洲日韩在线视频 |