<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>

          再見(jiàn)MybatisPlus,阿里推出新ORM框架!

          共 6097字,需瀏覽 13分鐘

           ·

          2021-10-20 11:33


          來(lái)源:juejin.cn/post/6886019929519177735

          使用fluent mybatis也可以不用寫(xiě)具體的 xml 文件,通過(guò) java api 可以構(gòu)造出比較復(fù)雜的業(yè)務(wù) sql 語(yǔ)句,做到代碼邏輯和 sql 邏輯的合一。不再需要在 Dao 中組裝查詢(xún)或更新操作,或在 xml 與 mapper 中再組裝參數(shù)。那對(duì)比原生 Mybatis,Mybatis Plus 或者其他框架,FluentMybatis提供了哪些便利呢?

          需求場(chǎng)景設(shè)置

          我們通過(guò)一個(gè)比較典型的業(yè)務(wù)需求來(lái)具體實(shí)現(xiàn)和對(duì)比下,假如有學(xué)生成績(jī)表結(jié)構(gòu)如下:

          create?table?`student_score`
          (
          ????id???????????bigint?auto_increment?comment?'主鍵ID'?primary?key,
          ????student_id???bigint????????????not?null?comment?'學(xué)號(hào)',
          ????gender_man???tinyint?default?0?not?null?comment?'性別,?0:女;?1:男',
          ????school_term??int???????????????null?comment?'學(xué)期',
          ????subject??????varchar(30)???????null?comment?'學(xué)科',
          ????score????????int???????????????null?comment?'成績(jī)',
          ????gmt_create???datetime??????????not?null?comment?'記錄創(chuàng)建時(shí)間',
          ????gmt_modified?datetime??????????not?null?comment?'記錄最后修改時(shí)間',
          ????is_deleted???tinyint?default?0?not?null?comment?'邏輯刪除標(biāo)識(shí)'
          )?engine?=?InnoDB?default?charset=utf8;

          現(xiàn)在有需求:

          「統(tǒng)計(jì) 2000 年三門(mén)學(xué)科('英語(yǔ)', '數(shù)學(xué)', '語(yǔ)文')及格分?jǐn)?shù)按學(xué)期,學(xué)科統(tǒng)計(jì)最低分,最高分和平均分, 且樣本數(shù)需要大于 1 條,統(tǒng)計(jì)結(jié)果按學(xué)期和學(xué)科排序」

          我們可以寫(xiě) SQL 語(yǔ)句如下

          select?school_term,
          ???????subject,
          ???????count(score)?as?count,
          ???????min(score)???as?min_score,
          ???????max(score)???as?max_score,
          ???????avg(score)???as?max_score
          from?student_score
          where?school_term?>=?2000
          ??and?subject?in?('英語(yǔ)',?'數(shù)學(xué)',?'語(yǔ)文')
          ??and?score?>=?60
          ??and?is_deleted?=?0
          group?by?school_term,?subject
          having?count(score)?>?1
          order?by?school_term,?subject;

          那上面的需求,分別用fluent mybatis, 原生mybatisMybatis plus來(lái)實(shí)現(xiàn)一番。

          三者實(shí)現(xiàn)對(duì)比

          使用fluent mybatis 來(lái)實(shí)現(xiàn)上面的功能

          需要本文具體演示代碼可加我微信:codedq,免費(fèi)獲取!

          我們可以看到fluent api的能力,以及 IDE 對(duì)代碼的渲染效果。

          換成mybatis原生實(shí)現(xiàn)效果

          1. 定義Mapper接口
          public?interface?MyStudentScoreMapper?{
          ????List>?summaryScore(SummaryQuery?paras);
          }
          1. 定義接口需要用到的參數(shù)實(shí)體 SummaryQuery
          @Data
          @Accessors(chain?=?true)
          public?class?SummaryQuery?{
          ????private?Integer?schoolTerm;

          ????private?List?subjects;

          ????private?Integer?score;

          ????private?Integer?minCount;
          }
          1. 定義實(shí)現(xiàn)業(yè)務(wù)邏輯的mapper xml文件
          <select?id="summaryScore"?resultType="map"?parameterType="cn.org.fluent.mybatis.springboot.demo.mapper.SummaryQuery">
          ????select?school_term,
          ????subject,
          ????count(score)?as?count,
          ????min(score)?as?min_score,
          ????max(score)?as?max_score,
          ????avg(score)?as?max_score
          ????from?student_score
          ????where?school_term?>=?#{schoolTerm}
          ????and?subject?in
          ????<foreach?collection="subjects"?item="item"?open="("?close=")"?separator=",">
          ????????#{item}
          ????foreach>
          ????and?score?>=?#{score}
          ????and?is_deleted?=?0
          ????group?by?school_term,?subject
          ????having?count(score)?>?#{minCount}
          ????order?by?school_term,?subject
          select>
          1. 實(shí)現(xiàn)業(yè)務(wù)接口(這里是測(cè)試類(lèi),實(shí)際應(yīng)用中應(yīng)該對(duì)應(yīng) Dao 類(lèi))
          @RunWith(SpringRunner.class)
          @SpringBootTest(classes?
          =?QuickStartApplication.class)
          public?class?MybatisDemo?
          {
          ????@Autowired
          ????private?MyStudentScoreMapper?mapper;

          ????@Test
          ????public?void?mybatis_demo()?{
          ????????//?構(gòu)造查詢(xún)參數(shù)
          ????????SummaryQuery?paras?=?new?SummaryQuery()
          ????????????.setSchoolTerm(2000)
          ????????????.setSubjects(Arrays.asList("英語(yǔ)",?"數(shù)學(xué)",?"語(yǔ)文"))
          ????????????.setScore(60)
          ????????????.setMinCount(1);

          ????????List>?summary?=?mapper.summaryScore(paras);
          ????????System.out.println(summary);
          ????}
          }

          總之,直接使用 mybatis,實(shí)現(xiàn)步驟還是相當(dāng)?shù)姆爆崳侍汀D菗Q成mybatis plus的效果怎樣呢?

          換成mybatis plus實(shí)現(xiàn)效果

          mybatis plus的實(shí)現(xiàn)比mybatis會(huì)簡(jiǎn)單比較多,實(shí)現(xiàn)效果如下

          如紅框圈出的,寫(xiě)mybatis plus實(shí)現(xiàn)用到了比較多字符串的硬編碼(可以用 Entity 的 get lambda 方法部分代替字符串編碼)。字符串的硬編碼,會(huì)給開(kāi)發(fā)同學(xué)造成不小的使用門(mén)檻,個(gè)人覺(jué)的主要有 2 點(diǎn):

          1. 字段名稱(chēng)的記憶和敲碼困難
          2. Entity 屬性跟隨數(shù)據(jù)庫(kù)字段發(fā)生變更后的運(yùn)行時(shí)錯(cuò)誤

          其他框架,比如TkMybatis在封裝和易用性上比mybatis plus要弱,就不再比較了。

          生成代碼編碼比較

          fluent mybatis生成代碼設(shè)置

          public?class?AppEntityGenerator?{
          ????static?final?String?url?=?"jdbc:mysql://localhost:3306/fluent_mybatis_demo?useSSL=false&useUnicode=true&characterEncoding=utf-8";

          ????public?static?void?main(String[]?args)?{
          ????????FileGenerator.build(Abc.class);
          ????}

          ????@Tables(
          ????????/**?數(shù)據(jù)庫(kù)連接信息?**/
          ????????url?=?url,?username?=?"root",?password?=?"password",
          ????????/**?Entity類(lèi)parent?package路徑?**/
          ????????basePack?=?"cn.org.fluent.mybatis.springboot.demo",
          ????????/**?Entity代碼源目錄?**/
          ????????srcDir?=?"spring-boot-demo/src/main/java",
          ????????/**?Dao代碼源目錄?**/
          ????????daoDir?=?"spring-boot-demo/src/main/java",
          ????????/**?如果表定義記錄創(chuàng)建,記錄修改,邏輯刪除字段?**/
          ????????gmtCreated?=?"gmt_create",?gmtModified?=?"gmt_modified",?logicDeleted?=?"is_deleted",
          ????????/**?需要生成文件的表?(?表名稱(chēng):對(duì)應(yīng)的Entity名稱(chēng)?)?**/
          ????????tables?=?@Table(value?=?{"student_score"})
          ????)
          ????static?class?Abc?{
          ????}
          }

          mybatis plus代碼生成設(shè)置

          public?class?CodeGenerator?{

          ????static?String?dbUrl?=?"jdbc:mysql://localhost:3306/fluent_mybatis_demo?useSSL=false&useUnicode=true&characterEncoding=utf-8";

          ????@Test
          ????public?void?generateCode()?{
          ????????GlobalConfig?config?=?new?GlobalConfig();
          ????????DataSourceConfig?dataSourceConfig?=?new?DataSourceConfig();
          ????????dataSourceConfig.setDbType(DbType.MYSQL)
          ????????????.setUrl(dbUrl)
          ????????????.setUsername("root")
          ????????????.setPassword("password")
          ????????????.setDriverName(Driver.class.getName());
          ????????StrategyConfig?strategyConfig?=?new?StrategyConfig();
          ????????strategyConfig
          ????????????.setCapitalMode(true)
          ????????????.setEntityLombokModel(false)
          ????????????.setNaming(NamingStrategy.underline_to_camel)
          ????????????.setColumnNaming(NamingStrategy.underline_to_camel)
          ????????????.setEntityTableFieldAnnotationEnable(true)
          ????????????.setFieldPrefix(new?String[]{"test_"})
          ????????????.setInclude(new?String[]{"student_score"})
          ????????????.setLogicDeleteFieldName("is_deleted")
          ????????????.setTableFillList(Arrays.asList(
          ????????????????new?TableFill("gmt_create",?FieldFill.INSERT),
          ????????????????new?TableFill("gmt_modified",?FieldFill.INSERT_UPDATE)));

          ????????config
          ????????????.setActiveRecord(false)
          ????????????.setIdType(IdType.AUTO)
          ????????????.setOutputDir(System.getProperty("user.dir")?+?"/src/main/java/")
          ????????????.setFileOverride(true);

          ????????new?AutoGenerator().setGlobalConfig(config)
          ????????????.setDataSource(dataSourceConfig)
          ????????????.setStrategy(strategyConfig)
          ????????????.setPackageInfo(
          ????????????????new?PackageConfig()
          ????????????????????.setParent("com.mp.demo")
          ????????????????????.setController("controller")
          ????????????????????.setEntity("entity")
          ????????????).execute();
          ????}
          }

          FluentMybatis特性一覽

          三者對(duì)比總結(jié)

          看完 3 個(gè)框架對(duì)同一個(gè)功能點(diǎn)的實(shí)現(xiàn), 各位看官肯定會(huì)有自己的判斷,筆者這里也總結(jié)了一份比較。

          對(duì) Fluent Mybatis 感興趣的網(wǎng)友,支持大家去閱讀官方源碼,發(fā)現(xiàn)更多新大陸!

          程序汪資料鏈接

          程序汪接的7個(gè)私活都在這里,經(jīng)驗(yàn)整理

          Java項(xiàng)目分享 ?最新整理全集,找項(xiàng)目不累啦 04版

          堪稱(chēng)神級(jí)的Spring Boot手冊(cè),從基礎(chǔ)入門(mén)到實(shí)戰(zhàn)進(jìn)階

          臥槽!字節(jié)跳動(dòng)《算法中文手冊(cè)》火了,完整版 PDF 開(kāi)放下載!

          臥槽!阿里大佬總結(jié)的《圖解Java》火了,完整版PDF開(kāi)放下載!

          字節(jié)跳動(dòng)總結(jié)的設(shè)計(jì)模式 PDF 火了,完整版開(kāi)放下載!

          歡迎添加程序汪個(gè)人微信 itwang008? 進(jìn)粉絲群或圍觀朋友圈

          瀏覽 32
          點(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>
                  三级视频在线观看视频 | 中国高清无码 | 日老骚逼| 亚洲中文在线视频 | 91人妻人人人 |