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

          Spring Boot 教程 - MyBatis-Plus

          共 8736字,需瀏覽 18分鐘

           ·

          2020-08-16 08:33

          點擊上方藍色字體,選擇“標星公眾號”

          優(yōu)質(zhì)文章,第一時間送達

          ? 作者?|??Butterfly-Tri?

          來源 |? ?urlify.cn/reA3au

          66套java從入門到精通實戰(zhàn)課程分享

          1. Mybatis-Plus簡介

          MyBatis-Plus(簡稱 MP)是一個 MyBatis 的增強工具,在 MyBatis 的基礎(chǔ)上只做增強不做改變,為簡化開發(fā)、提高效率而生。

          為什么說Mybatis-Plus是Mybatis的增強?

          mybatis作為一款輕量級的持久層框架實現(xiàn)了比較簡單的操作數(shù)據(jù)庫的能力,但是它是一個半ORM(對象關(guān)系映射)的持久層框架,因為它需要我們在XML文件中寫SQL語句,不能完全專注于業(yè)務(wù)邏輯,即是它后來做了一些改進,有了逆向工程,有了example類,但依舊改變不了他是一個半ORM框架的事實。MyBatis-Plus作為mybatis的增強版,極大改善了mybatis的尷尬處境(其實并不尷尬,我還是非常喜歡用mybatis的)。

          接下來進入正題了,Mybatis-plus框架他在Mybatis原有的基礎(chǔ)之上增加了一系列的簡單易用的javaAPI,非常的好用和牛逼,國人開發(fā),必須要使勁的吹一下?。Mybatis-Plus官方有這么一句話:為簡化開發(fā)而生。這句話我覺得非常的好,的確,簡化了我們的開發(fā),官方還有這么三句話:

          • 潤物無聲

            只做增強不做改變,引入它不會對現(xiàn)有工程產(chǎn)生影響,如絲般順滑。

          • 效率至上

            只需簡單配置,即可快速進行 CRUD 操作,從而節(jié)省大量時間。

          • 豐富功能

            熱加載、代碼生成、分頁、性能分析等功能一應(yīng)俱全。

          上面的這三句話其實就是Mybatis-plus的特點,他的確沒有改變mybatis的功能,只在它的基礎(chǔ)之上進行了一些增強,不需要example類,提供了Wrapper類,還提供了很多簡單的api操作數(shù)據(jù)庫。話不多說直接擼代碼。對于他的底層實現(xiàn),我不說大家都知道,動態(tài)代理咯,具體實現(xiàn)大家可以自行查閱相關(guān)資料,在這個系列中只帶領(lǐng)大家學(xué)習(xí)和基本使用,各位大佬們?nèi)绻X得博主寫的還算不錯,給個關(guān)注唄,奧利給!

          2. Mybatis-Plus的使用

          2.1 引入依賴

          pom.xml:


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

          ????<dependencies>
          ????????
          ????????<dependency>
          ????????????<groupId>com.baomidougroupId>
          ????????????<artifactId>mybatis-plus-boot-starterartifactId>
          ????????????<version>3.3.2version>
          ????????dependency>
          ????????
          ????????<dependency>
          ????????????<groupId>org.springframework.bootgroupId>
          ????????????<artifactId>spring-boot-starter-webartifactId>
          ????????dependency>
          ????????
          ????????<dependency>
          ????????????<groupId>mysqlgroupId>
          ????????????<artifactId>mysql-connector-javaartifactId>
          ????????????<version>8.0.18version>
          ????????dependency>
          ????????
          ????????<dependency>
          ????????????<groupId>org.projectlombokgroupId>
          ????????????<artifactId>lombokartifactId>
          ????????????<version>1.18.10version>
          ????????dependency>
          ????dependencies>


          2.2 配置文件

          application.yml

          butterflytri:
          ??databaseurl-port: 127.0.0.1:3306?# 數(shù)據(jù)庫端口
          ??database-name: student_db # 數(shù)據(jù)庫名
          server:
          ??port: 8080?# 應(yīng)用端口
          ??servlet:
          ????context-path: /butterflytri # 應(yīng)用映射
          spring:
          ??application:
          ????name: mybatis-plus # 應(yīng)用名稱
          ??datasource:
          ????url: jdbc:mysql://${butterflytri.databaseurl-port}/${butterflytri.database-name}?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
          ????driver-class-name: com.mysql.jdbc.Driver
          ????username: root
          ????password: root
          mybatis-plus: # mybatis-plus配置
          ??mapper-locations: classpath:com/butterflytri/mapper/*Mapper.xml # mapper映射包掃描
          ??type-aliases-package: com.butterflytri.entity # entity別名

          mybatis-plus只需要這么一個配置文件就可以了,不需要其他的,官方也說了,只增強mybatis不修改它,所以我只會演示plus部分,即增強優(yōu)化的部分。


          2.3 正式代碼部分

          首先我們看下啟動類:

          MybatisPlusApplication.java

          package?com.butterflytri;

          import?org.mybatis.spring.annotation.MapperScan;
          import?org.springframework.boot.SpringApplication;
          import?org.springframework.boot.autoconfigure.SpringBootApplication;

          /**
          ?* @author: WJF
          ?* @date: 2020/6/23
          ?* @description: MybatisPlusApplication
          ?*/

          @SpringBootApplication
          /**
          ?* xmlMapper包掃描,與yml中效果相同。
          ?*/

          @MapperScan("com/butterflytri/mapper")
          public?class?MybatisPlusApplication?{

          ????public?static?void?main(String[] args)?{
          ????????SpringApplication.run(MybatisPlusApplication.class);
          ????}

          }

          啟動類中就寫了一個Mapper的包掃描,說過的Mybatis-Plus只增強Mybatis,不改變它,所以寫Xml也是完全歐克的。

          然后我們看實體類和數(shù)據(jù)庫字段的映射關(guān)系,先上代碼:

          package?com.butterflytri.entity;

          import?com.baomidou.mybatisplus.annotation.TableField;
          import?com.baomidou.mybatisplus.annotation.TableId;
          import?com.baomidou.mybatisplus.annotation.TableName;
          import?lombok.Getter;
          import?lombok.Setter;
          import?lombok.ToString;

          import?java.io.Serializable;

          /**
          ?* @author: WJF
          ?* @date: 2020/5/16
          ?* @description: Student
          ?*/


          @ToString
          @Getter
          @Setter
          /**
          ?* '@TableName':此注解將表名和實體類映射起來,不寫則默認以實體類名為表名進行數(shù)據(jù)庫操作。
          ?* '@TableId':此注解將聲明的實體屬性作為數(shù)據(jù)庫表的主鍵字段,還有很多主鍵實現(xiàn)策咯,查看注解屬性{@link?TableId#type()}。
          ?* '@TableField':此注解將表字段(非主鍵)和實體類屬性映射起來,不寫則默認以實體類屬性名為表字段名進行數(shù)據(jù)庫操作。
          ?*/
          @TableName("t_student")
          public class Student implements Serializable {

          ????@TableId("ID")
          ????private Long id;

          ????@TableField("STUDENT_NAME")
          ????private String studentName;

          ????@TableField("STUDENT_NO")
          ????private String studentNo;

          ????@TableField("SEX")
          ????private String sex;

          ????@TableField("AGE")
          ????private Integer age;

          ????@TableField("CLASS")
          ????private String clazz;

          }

          實體類和表名的映射就是如此的簡單,如果實體類類名和表名一樣,字段名和屬性名一樣就不用寫這些注解。

          接下來我們看下Mapper層代碼,這里繼承了BaseMapper接口,就已經(jīng)獲取了基本的增刪改查方法。

          package?com.butterflytri.mapper;

          import?com.baomidou.mybatisplus.core.mapper.BaseMapper;
          import?com.butterflytri.entity.Student;
          import?org.apache.ibatis.annotations.Mapper;

          import?java.util.List;

          /**
          ?* @author: WJF
          ?* @date: 2020/5/16
          ?* @description: StudentMapper
          ?*/


          /**
          ?* 此處'StudentMapper'繼承了'BaseMapper'接口,就擁有了mybatis-plus提供的公共基礎(chǔ)的CRUD方法。
          ?*/

          @Mapper
          public interface StudentMapper extends BaseMapper {

          ????/**
          ?????* 查詢所有學(xué)生信息
          ?????* @return List
          ?????*/

          ????List<Student> findAll();

          ????/**
          ?????* 通過id查詢學(xué)生信息
          ?????* @param id:學(xué)生id
          ?????* @return Student
          ?????*/

          ????Student?findOne(Long?id);

          ????/**
          ?????* 通過學(xué)號查詢學(xué)生信息
          ?????* @param studentNo:學(xué)生學(xué)號
          ?????* @return Student
          ?????*/

          ????Student?findByStudentNo(String?studentNo);


          }

          接下來我們看看service層代碼:

          StudentService

          package?com.butterflytri.service;

          import?com.butterflytri.entity.Student;

          import?java.util.List;

          /**
          ?* @author: WJF
          ?* @date: 2020/6/23
          ?* @description: StudentService
          ?*/


          public?interface?StudentService?{

          ????/**
          ?????* 通過id查詢某個學(xué)生的信息(BaseMapper中的方法)
          ?????* @param?id: 學(xué)生id
          ?????* @return?Student
          ?????*/

          ????public?Student selectById(Long id);

          ????/**
          ?????* 通過id查詢某個學(xué)生的信息(通過xmlMapper實現(xiàn))
          ?????* @param?id: 學(xué)生id
          ?????* @return?Student
          ?????*/

          ????public?Student findById(Long id);

          ????/**
          ?????* 保存一個學(xué)生對象(BaseMapper中的方法)
          ?????* @param?student
          ?????*/

          ????public?void?insert(Student student);

          ????/**
          ?????* 查詢性別為sex,年齡大于age的學(xué)生(普通的Wrapper)
          ?????* @param?sex: 性別
          ?????* @param?age: 年齡
          ?????* @return?學(xué)生list
          ?????*/

          ????public?List findByWrapper(String sex, Integer age);

          ????/**
          ?????* 查詢性別為sex,年齡大于age的學(xué)生(Lambda形式的Wrapper)
          ?????* @param?sex: 性別
          ?????* @param?age: 年齡
          ?????* @return?學(xué)生list
          ?????*/

          ????public?List findByWrapperLambda(String sex, Integer age);

          ????/**
          ?????* 更新學(xué)生信息(Wrapper形式)
          ?????* @param?student: 需要更新的學(xué)生實體
          ?????*/

          ????public?void?updateByWrapper(Student student);

          ????/**
          ?????* 更新學(xué)生信息(BaseMapper中的方法)
          ?????* @param?student: 需要更新的學(xué)生實體
          ?????*/

          ????public?void?updateById(Student student);

          ????/**
          ?????* 更新學(xué)生信息(Lambda形式的Wrapper)
          ?????* @param?student: 需要更新的學(xué)生實體
          ?????*/

          ????public?void?updateByWrapperLambda(Student student);
          }

          StudentServiceImpl

          package?com.butterflytri.service.impl;

          import?com.baomidou.mybatisplus.core.conditions.Wrapper;
          import?com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
          import?com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
          import?com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
          import?com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
          import?com.baomidou.mybatisplus.core.toolkit.Wrappers;
          import?com.butterflytri.entity.Student;
          import?com.butterflytri.mapper.StudentMapper;
          import?com.butterflytri.service.StudentService;
          import?org.springframework.stereotype.Service;

          import?javax.annotation.Resource;
          import?java.util.List;

          /**
          ?* @author: WJF
          ?* @date: 2020/6/23
          ?* @description: StudentServiceImpl
          ?*/

          @Service
          public?class?StudentServiceImpl?implements?StudentService?{

          ????@Resource
          ????private?StudentMapper studentMapper;

          ????@Override
          ????public?Student selectById(Long id)?{
          ????????return?studentMapper.selectById(id);
          ????}

          ????@Override
          ????public?Student findById(Long id)?{
          ????????return?studentMapper.findOne(id);
          ????}

          ????@Override
          ????public?void?insert(Student student)?{
          ????????studentMapper.insert(student);
          ????}

          ????@Override
          ????public?List findByWrapper(String sex, Integer age)?{
          ????????QueryWrapper queryWrapper = new?QueryWrapper<>();
          ????????queryWrapper.eq("SEX", sex);
          ????????queryWrapper.gt("AGE", age);
          ????????return?studentMapper.selectList(queryWrapper);
          ????}

          ????@Override
          ????public?List findByWrapperLambda(String sex, Integer age)?{
          ????????LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery().eq(Student::getSex, sex).gt(Student::getAge, age);
          ????????return?studentMapper.selectList(queryWrapper);
          ????}

          ????@Override
          ????public?void?updateByWrapper(Student student)?{
          ????????UpdateWrapper updateWrapper = new?UpdateWrapper<>();
          ????????updateWrapper.set("ID", student.getId());
          ????????studentMapper.update(student, updateWrapper);
          ????}

          ????@Override
          ????public?void?updateById(Student student)?{
          ????????studentMapper.updateById(student);
          ????}

          ????@Override
          ????public?void?updateByWrapperLambda(Student student)?{
          ????????LambdaUpdateWrapper updateWrapper = Wrappers.lambdaUpdate().set(Student::getId, student.getId());
          ????????studentMapper.update(student, updateWrapper);
          ????}
          }

          service層的方法都很簡單,有通過剛剛繼承的BaseMapper中的方法,但是我們還看到了一個類叫Wrapper,這個類是條件構(gòu)造器,可以通過這個類實現(xiàn)比較復(fù)雜的查詢,有直接通過字段名稱去查詢的,也有通過屬性和字段名映射的lambda方式去查詢數(shù)據(jù)庫,總之就是很簡單,也很好理解這些API,但是請記住,Wrapper很重,不是一個輕量級的東西,不要將這個對象在服務(wù)間進行傳遞,效率很低。請將條件放在DTO中傳遞到service層代碼中,在service代碼中創(chuàng)建Wrapper類進行查詢。

          CRUD的結(jié)果我就不展示了。然后附上Mybatis-Plus官網(wǎng)地址:傳送門

          3. 項目地址

          本項目傳送門:

          • GitHub?--->?spring-boot-mybatis-plus

          • Gitee?--->?spring-boot-mybatis-plus

          此教程會一直更新下去,覺得博主寫的可以的話,關(guān)注一下,也可以更方便下次來學(xué)習(xí)。


          粉絲福利:108本java從入門到大神精選電子書領(lǐng)取

          ???

          ?長按上方二維碼?2 秒
          回復(fù)「1234」即可獲取資料以及
          可以進入java1234官方微信群



          感謝點贊支持下哈?

          瀏覽 68
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  又黄又爽无遮挡 | 97婷婷五月天 | 国产熟女人妖乱伦 | 五月激情综合 | 久插视频 |