Spring Boot 教程 - MyBatis-Plus
點擊上方藍色字體,選擇“標星公眾號”
優(yōu)質(zhì)文章,第一時間送達
? 作者?|??Butterfly-Tri?
來源 |? ?urlify.cn/reA3au
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官方微信群
感謝點贊支持下哈?
