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

          提升開發(fā)效率的一款 mybatis 開發(fā)神器

          共 4616字,需瀏覽 10分鐘

           ·

          2020-09-10 22:06

          點擊上方“碼農(nóng)突圍”,馬上關(guān)注
          這里是碼農(nóng)充電第一站,回復(fù)“666”,獲取一份專屬大禮包
          真愛,請設(shè)置“星標”或點個“在看”
          來源:me.csdn.net/Danny_idea
          以前在開發(fā)的時候,使用mybatis的時候,經(jīng)常都需要先配置xml映射文件,然后每條sql操作都需要自己進行手動編寫,對于一些復(fù)雜的sql這么來操作確實有必要,但是如果只是一些非常簡單的insert,update,delete,select這類型的語句而言,也需要開發(fā)人員花費額外的時間進行手動編寫的話,確實費時又費力。
          能否為mybatis特別定制一套能夠自動為我們生成一些簡單sql功能,同時又支持我們進行自定義sql設(shè)置功能的強大框架呢?
          mybatis plus因此誕生了。
          這只小鳥太魔性了
          mybatis plus是一款專門針對于傳統(tǒng)MyBatis開發(fā)中sql需要手動進行映射配置繁瑣缺點的一款框架技術(shù),這款框架技術(shù)提供了十分豐富的api供開發(fā)者們使用,在 MyBatis 的基礎(chǔ)上只做增強不做改變,為簡化開發(fā)、提高效率而生。
          Mybatis plus到底有多方便呢,我們閑話不多說,直接上手代碼實例來進行演示:
          首先我們需要導(dǎo)入一些相關(guān)的pom依賴配置

          <project?xmlns="http://maven.apache.org/POM/4.0.0"
          ?????????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          ?????????xsi:schemaLocation="http://maven.apache.org/POM/4.0.0?http://maven.apache.org/xsd/maven-4.0.0.xsd">

          ????<modelVersion>4.0.0modelVersion>


          ????<groupId>com.sisegroupId>
          ????<artifactId>mybatis-plusartifactId>
          ????<version>1.0-SNAPSHOTversion>

          ????<parent>
          ????????<groupId>org.springframework.bootgroupId>
          ????????<artifactId>spring-boot-starter-parentartifactId>
          ????????<version>1.5.9.RELEASEversion>
          ????????<relativePath/>?
          ????parent>

          ????<properties>
          ????????<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
          ????????<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
          ????????<java.version>1.8java.version>
          ????properties>

          ????<dependencies>
          ????????<dependency>
          ????????????<groupId>com.baomidougroupId>
          ????????????<artifactId>mybatisplus-spring-boot-starterartifactId>
          ????????????<version>1.0.5version>
          ????????dependency>
          ????????<dependency>
          ????????????<groupId>com.baomidougroupId>
          ????????????<artifactId>mybatis-plusartifactId>
          ????????????<version>2.3version>
          ????????dependency>
          ????????<dependency>
          ????????????<groupId>org.mybatis.spring.bootgroupId>
          ????????????<artifactId>mybatis-spring-boot-starterartifactId>
          ????????????<version>1.3.1version>
          ????????dependency>
          ????????<dependency>
          ????????????<groupId>mysqlgroupId>
          ????????????<artifactId>mysql-connector-javaartifactId>
          ????????????<scope>runtimescope>
          ????????dependency>
          ????????<dependency>
          ????????????<groupId>org.springframework.bootgroupId>
          ????????????<artifactId>spring-boot-starter-webartifactId>
          ????????dependency>
          ????dependencies>


          project>
          導(dǎo)入了jar包之后,為了方便測試,我們首先在數(shù)據(jù)庫里面搭建相關(guān)的數(shù)據(jù)表信息
          CREATE?TABLE?`teacher`?(
          ??`id`?int(11)?NOT?NULL?AUTO_INCREMENT,
          ??`teacher_name`?varchar(60)?CHARACTER?SET?utf8?COLLATE?utf8_unicode_ci?NOT?NULL,
          ??`teacher_pwd`?varchar(60)?CHARACTER?SET?utf8?COLLATE?utf8_unicode_ci?NOT?NULL,
          ??PRIMARY?KEY?(`id`)
          )?ENGINE=InnoDB?AUTO_INCREMENT=14?DEFAULT?CHARSET=gbk;
          該表對應(yīng)的實體類:
          package?com.sise.model;

          import?com.baomidou.mybatisplus.annotations.TableName;

          /**
          ?*?@author?idea
          ?*?@data?2019/5/24
          ?*/

          @TableName(value?=?"teacher")
          public?class?Teacher?{
          ????private?int?id;

          ????private?String?teacherName;

          ????private?String?teacherPwd;

          ????public?int?getId()?{
          ????????return?id;
          ????}


          ????public?Teacher()?{
          ????}

          ????public?Teacher(int?id)?{
          ????????this.id?=?id;
          ????}

          ????public?Teacher?setId(int?id)?{
          ????????this.id?=?id;
          ????????return?this;
          ????}

          ????public?String?getTeacherName()?{
          ????????return?teacherName;
          ????}

          ????public?Teacher?setTeacherName(String?teacherName)?{
          ????????this.teacherName?=?teacherName;
          ????????return?this;
          ????}

          ????public?String?getTeacherPwd()?{
          ????????return?teacherPwd;
          ????}

          ????public?Teacher?setTeacherPwd(String?teacherPwd)?{
          ????????this.teacherPwd?=?teacherPwd;
          ????????return?this;
          ????}

          ????@Override
          ????public?String?toString()?{
          ????????return?"Teacher{"?+
          ????????????????"id="?+?id?+
          ????????????????",?teacherName='"?+?teacherName?+?'\''?+
          ????????????????",?teacherPwd='"?+?teacherPwd?+?'\''?+
          ????????????????'}';
          ????}
          }
          通常我們在開發(fā)的時候都會自定義一個Dao層,mybatis plus里面提供了一個叫做BaseMapper的接口,內(nèi)部已經(jīng)提供了相當(dāng)多的crud操作函數(shù)的封裝。可以來仔細查看一下該接口的內(nèi)容:
          /**
          ?*?Copyright?(c)?2011-2020,?hubin?([email protected]).
          ?*?


          ?*?Licensed?under?the?Apache?License,?Version?2.0?(the?"License");?you?may?not
          ?*?use?this?file?except?in?compliance?with?the?License.?You?may?obtain?a?copy?of
          ?*?the?License?at
          ?*?


          ?*?http://www.apache.org/licenses/LICENSE-2.0
          ?*?


          ?*?Unless?required?by?applicable?law?or?agreed?to?in?writing,?software
          ?*?distributed?under?the?License?is?distributed?on?an?"AS?IS"?BASIS,?WITHOUT
          ?*?WARRANTIES?OR?CONDITIONS?OF?ANY?KIND,?either?express?or?implied.?See?the
          ?*?License?for?the?specific?language?governing?permissions?and?limitations?under
          ?*?the?License.
          ?*/
          package?com.baomidou.mybatisplus.mapper;

          import?java.io.Serializable;
          import?java.util.Collection;
          import?java.util.List;
          import?java.util.Map;

          import?org.apache.ibatis.annotations.Param;
          import?org.apache.ibatis.session.RowBounds;

          /**
          ?*?


          ?*?Mapper?繼承該接口后,無需編寫?mapper.xml?文件,即可獲得CRUD功能
          ?*?


          ?*?


          ?*?這個?Mapper?支持?id?泛型
          ?*?


          ?*
          ?*?@author?hubin
          ?*?@Date?2016-01-23
          ?*/

          public?interface?BaseMapper<T>?{

          ????/**
          ?????*?


          ?????*?插入一條記錄
          ?????*?


          ?????*
          ?????*?@param?entity?實體對象
          ?????*?@return?int
          ?????*/

          ????Integer?insert(T?entity);

          ????/**
          ?????*?


          ?????*?插入一條記錄
          ?????*?


          ?????*
          ?????*?@param?entity?實體對象
          ?????*?@return?int
          ?????*/

          ????Integer?insertAllColumn(T?entity);

          ????/**
          ?????*?


          ?????*?根據(jù)?ID?刪除
          ?????*?


          ?????*
          ?????*?@param?id?主鍵ID
          ?????*?@return?int
          ?????*/

          ????Integer?deleteById(Serializable?id);

          ????/**
          ?????*?


          ?????*?根據(jù)?columnMap?條件,刪除記錄
          ?????*?


          ?????*
          ?????*?@param?columnMap?表字段?map?對象
          ?????*?@return?int
          ?????*/

          ????Integer?deleteByMap(@Param("cm")?Map?columnMap);

          ????/**
          ?????*?


          ?????*?根據(jù)?entity?條件,刪除記錄
          ?????*?


          ?????*
          ?????*?@param?wrapper?實體對象封裝操作類(可以為?null)
          ?????*?@return?int
          ?????*/

          ????Integer?delete(@Param("ew")?Wrapper?wrapper);

          ????/**
          ?????*?


          ?????*?刪除(根據(jù)ID?批量刪除)
          ?????*?


          ?????*
          ?????*?@param?idList?主鍵ID列表
          ?????*?@return?int
          ?????*/

          ????Integer?deleteBatchIds(@Param("coll")?Collection?idList);

          ????/**
          ?????*?


          ?????*?根據(jù)?ID?修改
          ?????*?


          ?????*
          ?????*?@param?entity?實體對象
          ?????*?@return?int
          ?????*/

          ????Integer?updateById(@Param("et")?T?entity);

          ????/**
          ?????*?


          ?????*?根據(jù)?ID?修改
          ?????*?


          ?????*
          ?????*?@param?entity?實體對象
          ?????*?@return?int
          ?????*/

          ????Integer?updateAllColumnById(@Param("et")?T?entity);

          ????/**
          ?????*?


          ?????*?根據(jù)?whereEntity?條件,更新記錄
          ?????*?


          ?????*
          ?????*?@param?entity??實體對象
          ?????*?@param?wrapper?實體對象封裝操作類(可以為?null)
          ?????*?@return
          ?????*/

          ????Integer?update(@Param("et")?T?entity,?@Param("ew")?Wrapper?wrapper);

          ????/**
          ?????*?


          ?????*?根據(jù)?whereEntity?條件,更新記錄
          ?????*?


          ?????*
          ?????*?@param?setStr??set字符串
          ?????*?@param?wrapper?實體對象封裝操作類(可以為?null)
          ?????*?@return
          ?????*/

          ????Integer?updateForSet(@Param("setStr")?String?setStr,?@Param("ew")?Wrapper?wrapper);

          ????/**
          ?????*?


          ?????*?根據(jù)?ID?查詢
          ?????*?


          ?????*
          ?????*?@param?id?主鍵ID
          ?????*?@return?T
          ?????*/

          ????T?selectById(Serializable?id);

          ????/**
          ?????*?


          ?????*?查詢(根據(jù)ID?批量查詢)
          ?????*?


          ?????*
          ?????*?@param?idList?主鍵ID列表
          ?????*?@return?List
          ?????*/

          ????List?selectBatchIds(@Param("coll")?Collection?idList);

          ????/**
          ?????*?


          ?????*?查詢(根據(jù)?columnMap?條件)
          ?????*?


          ?????*
          ?????*?@param?columnMap?表字段?map?對象
          ?????*?@return?List
          ?????*/

          ????List?selectByMap(@Param("cm")?Map?columnMap);

          ????/**
          ?????*?


          ?????*?根據(jù)?entity?條件,查詢一條記錄
          ?????*?


          ?????*
          ?????*?@param?entity?實體對象
          ?????*?@return?T
          ?????*/

          ????T?selectOne(@Param("ew")?T?entity);

          ????/**
          ?????*?


          ?????*?根據(jù)?Wrapper?條件,查詢總記錄數(shù)
          ?????*?


          ?????*
          ?????*?@param?wrapper?實體對象
          ?????*?@return?int
          ?????*/

          ????Integer?selectCount(@Param("ew")?Wrapper?wrapper);

          ????/**
          ?????*?


          ?????*?根據(jù)?entity?條件,查詢?nèi)坑涗?br>?????*?


          ?????*
          ?????*?@param?wrapper?實體對象封裝操作類(可以為?null)
          ?????*?@return?List
          ?????*/

          ????List?selectList(@Param("ew")?Wrapper?wrapper);

          ????/**
          ?????*?


          ?????*?根據(jù)?Wrapper?條件,查詢?nèi)坑涗?br>?????*?


          ?????*
          ?????*?@param?wrapper?實體對象封裝操作類(可以為?null)
          ?????*?@return?List
          ?????*/

          ????List>?selectMaps(@Param("ew")?Wrapper?wrapper);

          ????/**
          ?????*?


          ?????*?根據(jù)?Wrapper?條件,查詢?nèi)坑涗?br>?????*?注意:?只返回第一個字段的值
          ?????*?


          ?????*
          ?????*?@param?wrapper?實體對象封裝操作類(可以為?null)
          ?????*?@return?List
          ?????*/
          ????List?selectObjs(@Param("ew")?Wrapper?wrapper);

          ????/**
          ?????*?


          ?????*?根據(jù)?entity?條件,查詢?nèi)坑涗洠ú⒎摚?br>?????*?


          ?????*
          ?????*?@param?rowBounds?分頁查詢條件(可以為?RowBounds.DEFAULT)
          ?????*?@param?wrapper???實體對象封裝操作類(可以為?null)
          ?????*?@return?List
          ?????*/

          ????List?selectPage(RowBounds?rowBounds,?@Param("ew")?Wrapper?wrapper);

          ????/**
          ?????*?


          ?????*?根據(jù)?Wrapper?條件,查詢?nèi)坑涗洠ú⒎摚?br>?????*?


          ?????*
          ?????*?@param?rowBounds?分頁查詢條件(可以為?RowBounds.DEFAULT)
          ?????*?@param?wrapper???實體對象封裝操作類
          ?????*?@return?List>
          ?????*/

          ????List>?selectMapsPage(RowBounds?rowBounds,?@Param("ew")?Wrapper?wrapper);

          }
          這些內(nèi)置的功能都是已經(jīng)提前自定義好了的,因此對于一些常用的簡單的sql我們可以避免使用手動拼接的方式來實現(xiàn),大大提升了開發(fā)人員的開發(fā)效率,結(jié)合文章上邊所說的教師對象,我們自定義一個Mapper接口用于實現(xiàn)crud的操作:
          package?com.sise.dao;

          import?com.baomidou.mybatisplus.mapper.BaseMapper;
          import?com.sise.model.Teacher;
          import?org.apache.ibatis.annotations.Mapper;


          /**
          ?*?@author?idea
          ?*?@data?2019/5/24
          ?*/

          @Mapper
          public?interface?TeacherMapper?extends?BaseMapper<Teacher>?{
          }
          為了方便測試,我直接選擇了在controller里面引用dao函數(shù)的功能。
          1.提前定義好的插入功能:
          BaseMapper里面封裝了已經(jīng)定義好的insert語句,能夠方便我們直接調(diào)用,無須自己手動編寫sql
          @GetMapping(value?=?"/insert")
          ????public?void?insert(){
          ????????Teacher??teacher=new?Teacher();
          ????????teacher.setTeacherName(createRandomStr(6));
          ????????teacher.setTeacherPwd(createRandomStr(6));
          ????????teacherMapper.insert(teacher);
          ????}

          ????/**
          ?????*?生成隨機字符串
          ?????*
          ?????*?@return
          ?????*/

          ????private?static?String?createRandomStr(int?length){
          ????????String?str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
          ????????Random?random=new?Random();
          ????????StringBuffer?sb=new?StringBuffer();
          ????????for(int?i=0;i????????????int?number=random.nextInt(str.length());
          ????????????sb.append(str.charAt(number));
          ????????}
          ????????return?sb.toString();
          ????}
          生成的sql語句:
          INSERT?INTO?teacher?(?id,?teacher_name,?teacher_pwd?)?VALUES?(?0,?'mNJXIf',?'LKTnam'?);
          2.提前定義好的刪除功能
          BaseMapper里面提供有已經(jīng)定義好的delete功能,
          ???@GetMapping(value?=?"/delete")
          ????public?void?delete(){
          ????????Teacher??teacher=new?Teacher();
          ????????teacher.setId(11);
          ????????EntityWrapper?entityWrapper=new?EntityWrapper(teacher);
          ????????teacherMapper.delete(entityWrapper);
          ????}
          生成的sql語句:
          DELETE?FROM?teacher?WHERE?id=11;
          3.提前定義好的更新功能
          BaseMapper里面定義了相關(guān)的update功能,但是在進行update的時候有個地方需要注意,來看看下邊這段代碼先
          ????@GetMapping(value?=?"/update")
          ????public?void?update(){
          ????????//update的判斷條件
          ????????EntityWrapper?entityWrapper=new?EntityWrapper(new?Teacher(1));
          ????????//更新之后的對象
          ????????Teacher?teacher=new?Teacher();
          ????????teacher.setTeacherPwd("new-pwd");
          ????????teacherMapper.update(teacher,entityWrapper);
          ????}
          生成的sql語句:
          UPDATE?teacher?SET?teacher_pwd='new-pwd'??WHERE?id=1;
          mybatis-plus里面提供了一個叫做EntityWrapper的對象封裝操作類,通過傳入相關(guān)的Entity來判斷傳入的查詢參數(shù),這里的使用讓我回想起了以前用hibernate的那種味道,不得不說這種功能的設(shè)計確實幫開發(fā)者的開發(fā)效率提升了很多。
          以前寫更新語句的時候,經(jīng)常是需要在xml里面進行非常多繁瑣耗時的sql拼接工作,現(xiàn)在mybatis-plus通過EntityWrapper這個封裝類,大大節(jié)省了相應(yīng)時間。
          4.根據(jù)指定id進行查詢
          mybatis-plus也默認提供了關(guān)鍵字查詢的功能,可以將查詢參數(shù)通過對象Entity的形式注入,非常方便。
          ps:mybatis-plus已經(jīng)默認帶有了sql注入的預(yù)防功能,因此這點可以放心使用。
          ??@GetMapping(value?=?"/selectAllById")
          ????public?Teacher?selectByTeacherName(int?id){
          ????????return?teacherMapper.selectOne(new?Teacher(id));
          ????}
          生成的sql語句:
          SELECT?id,teacher_name?AS?teacherName,teacher_pwd?AS?teacherPwd
          ?FROM?teacher
          ?WHERE?id=0;
          5.使用Map來進行多關(guān)鍵字的查詢
          有些時候,除了使用查詢時候使用Entity關(guān)鍵字來進行查詢之外,還可以通過使用Map的形式來進行多關(guān)鍵字的搜索實現(xiàn),相關(guān)代碼如下所示:
          ????@GetMapping(value?=?"/selectAllByMap")
          ????public?List?selectAllByEntity(String?name){
          ????????Map?hashMap=new?HashMap<>();
          ????????hashMap.put("teacher_name",name);
          ????????return?teacherMapper.selectByMap(hashMap);
          ????}
          注意,這里的map放入的key值需要和表里面的字段命名一致。
          生成的sql語句:
          SELECT?id,teacher_name?AS?teacherName,teacher_pwd?AS?teacherPwd
          ?FROM?teacher
          ?WHERE?teacher_name?=?'qwe';
          6.統(tǒng)計查詢
          ????@GetMapping(value?=?"/selectCountByEntity")
          ????public?int?selectCount(String?name){
          ????????Teacher?teacher=new?Teacher();
          ????????teacher.setId(1);
          ????????teacher.setTeacherName(name);
          ????????EntityWrapper?entityWrapper=new?EntityWrapper<>(teacher);
          ????????return?teacherMapper.selectCount(entityWrapper);
          ????}
          生成的sql語句:
          SELECT?COUNT(1)??FROM?teacher??WHERE?id=1?AND?teacher_name='qwe';
          7.分頁查詢
          在實際開發(fā)中,分頁查詢功能一直是非常普遍需要運用到的一點,在mybatis-plus里面,他提供了一個叫做Page的類供我們使用,相應(yīng)的代碼如下所示:
          ???@GetMapping(value?=?"/selectAllInPage")
          ????public?List?selectAllInPage(int?pageNumber,int?pageSize){
          ????????Page?page?=new?Page<>(pageNumber,pageSize);
          ????????EntityWrapper?entityWrapper?=?new?EntityWrapper<>();
          ????????entityWrapper.ge("id",?1);
          ????????return?teacherMapper.selectPage(page,entityWrapper);
          ????}
          生成的sql語句:
          SELECT?id,teacher_name?AS?teacherName,teacher_pwd?AS?teacherPwd??FROM?teacher??WHERE?(id?>=?1)?LIMIT?0,1;
          mybatis-plus使用的分頁技術(shù)是傳統(tǒng)的 limit 物理分頁方式。
          8. in 查詢
          查詢的時候,如果需要使用in查詢的話,可以使用selectBatchIds這個api功能:
          ????@GetMapping(value?=?"/selectInIdArr")
          ????public?List?selectInIdArr(){
          ????????List?idList=new?ArrayList<>();
          ????????idList.add(1);
          ????????idList.add(10);
          ????????idList.add(11);
          ????????return?teacherMapper.selectBatchIds(idList);
          ????}
          生成的sql語句:
          SELECT?id,teacher_name?AS?teacherName,teacher_pwd?AS?teacherPwd?FROM?teacher?WHERE?id?IN?(?1?,?10?,?11?);
          9.復(fù)雜條件查詢
          針對于比較復(fù)雜的多條件查詢,mybatis-plus內(nèi)部提供的EntityWrapper支持有許多豐富的查詢api功能供我們使用。
          為了方便理解,下邊通過實際的代碼案例來進行解釋
          *allEq查詢*(相當(dāng)于條件全部都要求滿足的情況)
          ?@GetMapping(value?=?"/selectAllByWrapper1")
          ????public??List?selectAllByWrapper1(){
          ????????Map?map=new?HashMap<>();
          ????????map.put("teacher_name","name");
          ????????map.put("teacher_pwd","pwd");
          ????????EntityWrapper?entity=new?EntityWrapper();
          ????????entity.allEq(map);
          ????????return?teacherMapper.selectList(entity);
          ????}
          生成的sql語句:
          SELECT?id,teacher_name?AS?teacherName,teacher_pwd?AS?teacherPwd
          ?FROM?teacher
          ?WHERE?(teacher_pwd?=?'pwd'?AND?teacher_name?=?'name')
          ;
          *ne查詢*
          ???@GetMapping(value?=?"/selectAllByWrapper3")
          ????public?List?selectAllByWrapper3(){
          ????????EntityWrapper?entity=new?EntityWrapper();
          ????????entity.ne("teacher_name","name");
          ????????return?teacherMapper.selectList(entity);
          ????}
          生成的sql語句:
          SELECT?id,teacher_name?AS?teacherName,teacher_pwd?AS?teacherPwd
          ?FROM?teacher
          ?WHERE?(teacher_name?<>?'name')
          ;
          *eq查詢*
          ????@GetMapping(value?=?"/selectAllByWrapper2")
          ????public?List?selectAllByWrapper2(){
          ????????EntityWrapper?entity=new?EntityWrapper();
          ????????entity.eq("teacher_name","name");
          ????????return?teacherMapper.selectList(entity);
          ????}
          生成的sql語句:
          SELECT?id,teacher_name?AS?teacherName,teacher_pwd?AS?teacherPwd
          ?FROM?teacher
          ?WHERE?(teacher_name?=?'name')
          ;
          *復(fù)雜的多條件查詢:*
          ??@GetMapping(value?=?"/selectAllByWrapper4")
          ????public??List?selectAllByWrapper4(){
          ????????EntityWrapper?entity=new?EntityWrapper();
          ????????entity.gt("id","0");
          ????????entity.le("id",11);
          ????????entity.ne("teacher_name","null_name");
          ????????entity.like("teacher_name","tt");
          ????????entity.notLike("teacher_pwd","sadas");
          ????????entity.orderBy("id");
          ????????return?teacherMapper.selectList(entity);
          ????}
          生成的sql語句:
          *組合的and和or條件查詢:*
          生成的sql語句:
          SELECT?id,teacher_name?AS?teacherName,teacher_pwd?AS?teacherPwd
          ?FROM?teacher
          ?WHERE?(id>1)?OR?(id=0?AND?teacher_name='name'?AND?teacher_pwd?IS?NULL)
          ;
          *having和groupby查詢:*
          生成的sql語句:
          SELECT?id,teacher_name?AS?teacherName,teacher_pwd?AS?teacherPwd
          ?FROM?teacher?GROUP?BY?teacher_name?HAVING?(id>1)
          ;
          除了常規(guī)的基于Mapper的直接操作數(shù)據(jù)庫操作功能以外,Mybatis-plus內(nèi)部還提供了一個叫做IService的接口,內(nèi)部含有很多豐富的CRUD操作功能可以供開發(fā)人員調(diào)用:
          /**
          ?*?Copyright?(c)?2011-2016,?hubin?([email protected]).
          ?*?


          ?*?Licensed?under?the?Apache?License,?Version?2.0?(the?"License");?you?may?not
          ?*?use?this?file?except?in?compliance?with?the?License.?You?may?obtain?a?copy?of
          ?*?the?License?at
          ?*?


          ?*?http://www.apache.org/licenses/LICENSE-2.0
          ?*?


          ?*?Unless?required?by?applicable?law?or?agreed?to?in?writing,?software
          ?*?distributed?under?the?License?is?distributed?on?an?"AS?IS"?BASIS,?WITHOUT
          ?*?WARRANTIES?OR?CONDITIONS?OF?ANY?KIND,?either?express?or?implied.?See?the
          ?*?License?for?the?specific?language?governing?permissions?and?limitations?under
          ?*?the?License.
          ?*/
          package?com.baomidou.mybatisplus.service;

          import?java.io.Serializable;
          import?java.util.Collection;
          import?java.util.List;
          import?java.util.Map;

          import?com.baomidou.mybatisplus.mapper.Wrapper;
          import?com.baomidou.mybatisplus.plugins.Page;

          /**
          ?*?


          ?*?頂級?Service
          ?*?


          ?*
          ?*?@author?hubin
          ?*?@Date?2016-04-20
          ?*/

          public?interface?IService<T>?{

          ????/**
          ?????*?


          ?????*?插入一條記錄(選擇字段,策略插入)
          ?????*?


          ?????*
          ?????*?@param?entity?實體對象
          ?????*?@return?boolean
          ?????*/

          ????boolean?insert(T?entity);

          ????/**
          ?????*?


          ?????*?插入一條記錄(全部字段)
          ?????*?


          ?????*
          ?????*?@param?entity?實體對象
          ?????*?@return?boolean
          ?????*/

          ????boolean?insertAllColumn(T?entity);

          ????/**
          ?????*?


          ?????*?插入(批量),該方法不適合?Oracle
          ?????*?


          ?????*
          ?????*?@param?entityList?實體對象列表
          ?????*?@return?boolean
          ?????*/

          ????boolean?insertBatch(List?entityList);

          ????/**
          ?????*?


          ?????*?插入(批量)
          ?????*?


          ?????*
          ?????*?@param?entityList?實體對象列表
          ?????*?@param?batchSize??插入批次數(shù)量
          ?????*?@return?boolean
          ?????*/

          ????boolean?insertBatch(List?entityList,?int?batchSize);

          ????/**
          ?????*?


          ?????*?批量修改插入
          ?????*?


          ?????*
          ?????*?@param?entityList?實體對象列表
          ?????*?@return?boolean
          ?????*/

          ????boolean?insertOrUpdateBatch(List?entityList);

          ????/**
          ?????*?


          ?????*?批量修改插入
          ?????*?


          ?????*
          ?????*?@param?entityList?實體對象列表
          ?????*?@param?batchSize
          ?????*?@return?boolean
          ?????*/

          ????boolean?insertOrUpdateBatch(List?entityList,?int?batchSize);

          ????/**
          ?????*?


          ?????*?批量修改或插入全部字段
          ?????*?


          ?????*
          ?????*?@param?entityList?實體對象列表
          ?????*?@return?boolean
          ?????*/

          ????boolean?insertOrUpdateAllColumnBatch(List?entityList);

          ????/**
          ?????*?批量修改或插入全部字段
          ?????*
          ?????*?@param?entityList?實體對象列表
          ?????*?@param?batchSize
          ?????*?@return?boolean
          ?????*/

          ????boolean?insertOrUpdateAllColumnBatch(List?entityList,?int?batchSize);

          ????/**
          ?????*?


          ?????*?根據(jù)?ID?刪除
          ?????*?


          ?????*
          ?????*?@param?id?主鍵ID
          ?????*?@return?boolean
          ?????*/

          ????boolean?deleteById(Serializable?id);

          ????/**
          ?????*?


          ?????*?根據(jù)?columnMap?條件,刪除記錄
          ?????*?


          ?????*
          ?????*?@param?columnMap?表字段?map?對象
          ?????*?@return?boolean
          ?????*/

          ????boolean?deleteByMap(Map?columnMap);

          ????/**
          ?????*?


          ?????*?根據(jù)?entity?條件,刪除記錄
          ?????*?


          ?????*
          ?????*?@param?wrapper?實體包裝類?{@link?Wrapper}
          ?????*?@return?boolean
          ?????*/

          ????boolean?delete(Wrapper?wrapper);

          ????/**
          ?????*?


          ?????*?刪除(根據(jù)ID?批量刪除)
          ?????*?


          ?????*
          ?????*?@param?idList?主鍵ID列表
          ?????*?@return?boolean
          ?????*/

          ????boolean?deleteBatchIds(Collection?idList);

          ????/**
          ?????*?


          ?????*?根據(jù)?ID?選擇修改
          ?????*?


          ?????*
          ?????*?@param?entity?實體對象
          ?????*?@return?boolean
          ?????*/

          ????boolean?updateById(T?entity);

          ????/**
          ?????*?


          ?????*?根據(jù)?ID?修改全部字段
          ?????*?


          ?????*
          ?????*?@param?entity?實體對象
          ?????*?@return?boolean
          ?????*/

          ????boolean?updateAllColumnById(T?entity);

          ????/**
          ?????*?


          ?????*?根據(jù)?whereEntity?條件,更新記錄
          ?????*?


          ?????*
          ?????*?@param?entity??實體對象
          ?????*?@param?wrapper?實體包裝類?{@link?Wrapper}
          ?????*?@return?boolean
          ?????*/

          ????boolean?update(T?entity,?Wrapper?wrapper);

          ????/**
          ?????*?


          ?????*?根據(jù)?whereEntity?條件,自定義set值更新記錄
          ?????*?


          ?????*
          ?????*?@param?setStr??set值字符串
          ?????*?@param?wrapper?實體包裝類?{@link?Wrapper}
          ?????*?@return?boolean
          ?????*/

          ????boolean?updateForSet(String?setStr,?Wrapper?wrapper);

          ????/**
          ?????*?


          ?????*?根據(jù)ID?批量更新
          ?????*?


          ?????*
          ?????*?@param?entityList?實體對象列表
          ?????*?@return?boolean
          ?????*/

          ????boolean?updateBatchById(List?entityList);

          ????/**
          ?????*?


          ?????*?根據(jù)ID?批量更新
          ?????*?


          ?????*
          ?????*?@param?entityList?實體對象列表
          ?????*?@param?batchSize??更新批次數(shù)量
          ?????*?@return?boolean
          ?????*/

          ????boolean?updateBatchById(List?entityList,?int?batchSize);

          ????/**
          ?????*?


          ?????*?根據(jù)ID?批量更新全部字段
          ?????*?


          ?????*
          ?????*?@param?entityList?實體對象列表
          ?????*?@return?boolean
          ?????*/

          ????boolean?updateAllColumnBatchById(List?entityList);

          ????/**
          ?????*?


          ?????*?根據(jù)ID?批量更新全部字段
          ?????*?


          ?????*
          ?????*?@param?entityList?實體對象列表
          ?????*?@param?batchSize??更新批次數(shù)量
          ?????*?@return?boolean
          ?????*/

          ????boolean?updateAllColumnBatchById(List?entityList,?int?batchSize);

          ????/**
          ?????*?


          ?????*?TableId?注解存在更新記錄,否插入一條記錄
          ?????*?


          ?????*
          ?????*?@param?entity?實體對象
          ?????*?@return?boolean
          ?????*/

          ????boolean?insertOrUpdate(T?entity);

          ????/**
          ?????*?插入或修改一條記錄的全部字段
          ?????*
          ?????*?@param?entity?實體對象
          ?????*?@return?boolean
          ?????*/

          ????boolean?insertOrUpdateAllColumn(T?entity);

          ????/**
          ?????*?


          ?????*?根據(jù)?ID?查詢
          ?????*?


          ?????*
          ?????*?@param?id?主鍵ID
          ?????*?@return?T
          ?????*/

          ????T?selectById(Serializable?id);

          ????/**
          ?????*?


          ?????*?查詢(根據(jù)ID?批量查詢)
          ?????*?


          ?????*
          ?????*?@param?idList?主鍵ID列表
          ?????*?@return?List
          ?????*/

          ????List?selectBatchIds(Collection?idList);

          ????/**
          ?????*?


          ?????*?查詢(根據(jù)?columnMap?條件)
          ?????*?


          ?????*
          ?????*?@param?columnMap?表字段?map?對象
          ?????*?@return?List
          ?????*/

          ????List?selectByMap(Map?columnMap);

          ????/**
          ?????*?


          ?????*?根據(jù)?Wrapper,查詢一條記錄
          ?????*?


          ?????*
          ?????*?@param?wrapper?實體對象
          ?????*?@return?T
          ?????*/

          ????T?selectOne(Wrapper?wrapper);

          ????/**
          ?????*?


          ?????*?根據(jù)?Wrapper,查詢一條記錄
          ?????*?


          ?????*
          ?????*?@param?wrapper?{@link?Wrapper}
          ?????*?@return?Map
          ?????*/

          ????Map?selectMap(Wrapper?wrapper);

          ????/**
          ?????*?


          ?????*?根據(jù)?Wrapper,查詢一條記錄
          ?????*?


          ?????*
          ?????*?@param?wrapper?{@link?Wrapper}
          ?????*?@return?Object
          ?????*/

          ????Object?selectObj(Wrapper?wrapper);

          ????/**
          ?????*?


          ?????*?根據(jù)?Wrapper?條件,查詢總記錄數(shù)
          ?????*?


          ?????*
          ?????*?@param?wrapper?實體對象
          ?????*?@return?int
          ?????*/

          ????int?selectCount(Wrapper?wrapper);

          ????/**
          ?????*?


          ?????*?查詢列表
          ?????*?


          ?????*
          ?????*?@param?wrapper?實體包裝類?{@link?Wrapper}
          ?????*?@return
          ?????*/

          ????List?selectList(Wrapper?wrapper);

          ????/**
          ?????*?


          ?????*?翻頁查詢
          ?????*?


          ?????*
          ?????*?@param?page?翻頁對象
          ?????*?@return
          ?????*/

          ????Page?selectPage(Page?page);

          ????/**
          ?????*?


          ?????*?查詢列表
          ?????*?


          ?????*
          ?????*?@param?wrapper?{@link?Wrapper}
          ?????*?@return
          ?????*/

          ????List>?selectMaps(Wrapper?wrapper);

          ????/**
          ?????*?


          ?????*?根據(jù)?Wrapper?條件,查詢?nèi)坑涗?br>?????*?


          ?????*
          ?????*?@param?wrapper?實體對象封裝操作類(可以為?null)
          ?????*?@return?List
          ?????*/
          ????List?selectObjs(Wrapper?wrapper);

          ????/**
          ?????*?


          ?????*?翻頁查詢
          ?????*?


          ?????*
          ?????*?@param?page????翻頁對象
          ?????*?@param?wrapper?{@link?Wrapper}
          ?????*?@return
          ?????*/

          ????@SuppressWarnings("rawtypes")
          ????Page>?selectMapsPage(Page?page,?Wrapper?wrapper);

          ????/**
          ?????*?


          ?????*?翻頁查詢
          ?????*?


          ?????*
          ?????*?@param?page????翻頁對象
          ?????*?@param?wrapper?實體包裝類?{@link?Wrapper}
          ?????*?@return
          ?????*/

          ????Page?selectPage(Page?page,?Wrapper?wrapper);

          }
          在使用的過程中,mybatis-plus還能兼容原有mybatis的xml和注解模式的sql拼寫功能。
          mybatis-plus這種集mybatis與hibernate的優(yōu)點一起的框架。提供了hibernate的單表CRUD操作的方便同時,又保留了mybatis的特性。
          不得不說mybatis-plus的出現(xiàn)搭配上原有的mybatis框架極大的促進了開發(fā)效率的提升,同時基友搭配,效率翻倍。因此也有人把它們比做成魂斗羅里面的兩兄弟,基友搭配,效率翻倍。

          最近熱文

          ? ?面試官寫了個雙冒號::問我這是什么語法?Java中有這玩意?
          ???亞馬遜機器人公司副總離職,加入23歲華裔「天才少年」創(chuàng)立的AI獨角獸
          ???1人抵1萬名黑客的阿里女守護神,私底下竟然是這個樣子!
          ???為什么程序員都不喜歡使用switch,而是大量的 if……else if ?

          最近整理了一份大廠算法刷題指南,包括一些刷題技巧,在知乎上已經(jīng)有上萬贊。同時還整理了一份6000頁面試筆記。關(guān)注下面公眾號,在公眾號內(nèi)回復(fù)「刷題」,即可免費獲取!回復(fù)「加群」,可以邀請你加入讀者群!



          明天見(??ω??)??


          瀏覽 49
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                    日韩精品人妻成人免费视频 | 九九久久免费视频 | 国产性爱网 | 国产婬乱片A片AAA毛片下载 | 樱桃香蕉午夜视频在线观看 |