1. Mybatis-Plus簡介
MyBatis-Plus(簡稱 MP)是一個 MyBatis 的增強工具,在 MyBatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。
為什麼說Mybatis-Plus是Mybatis的增強?
mybatis作為一款輕量級的持久層框架實現了比較簡單的運算元據庫的能力,但是它是一個半ORM(物件關係對映)的持久層框架,因為它需要我們在XML檔案中寫SQL語句,不能完全專注於業務邏輯,即是它後來做了一些改進,有了逆向工程,有了example類,但依舊改變不了他是一個半ORM框架的事實。MyBatis-Plus作為mybatis的增強版,極大改善了mybatis的尷尬處境(其實並不尷尬,我還是非常喜歡用mybatis的)。
接下來進入正題了,Mybatis-plus框架他在Mybatis原有的基礎之上增加了一系列的簡單易用的javaAPI,非常的好用和牛逼,國人開發,必須要使勁的吹一下?。Mybatis-Plus官方有這麼一句話:為簡化開發而生。這句話我覺得非常的好,的確,簡化了我們的開發,官方還有這麼三句話:
-
潤物無聲
只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑。
-
效率至上
只需簡單配置,即可快速進行 CRUD 操作,從而節省大量時間。
-
豐富功能
熱載入、程式碼生成、分頁、效能分析等功能一應俱全。
上面的這三句話其實就是Mybatis-plus的特點,他的確沒有改變mybatis的功能,只在它的基礎之上進行了一些增強,不需要example類,提供了Wrapper類,還提供了很多簡單的api運算元據庫。話不多說直接擼程式碼。對於他的底層實現,我不說大家都知道,動態代理咯,具體實現大家可以自行查閱相關資料,在這個系列中只帶領大家學習和基本使用,各位大佬們如果覺得博主寫的還算不錯,給個關注唄,奧利給!
2. Mybatis-Plus的使用
2.1 引入依賴
pom.xml
:
<!--springboot父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<!--mybatis-plus元件-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<!--spring-web元件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mysql資料庫連線驅動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<!--lombok元件-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
</dependencies>
2.2 配置檔案
application.yml
:
butterflytri:
databaseurl-port: 127.0.0.1:3306 # 資料庫埠
database-name: student_db # 資料庫名
server:
port: 8080 # 應用埠
servlet:
context-path: /butterflytri # 應用對映
spring:
application:
name: mybatis-plus # 應用名稱
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部分,即增強優化的部分。
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也是完全歐克的。
然後我們看實體類和資料庫欄位的對映關係,先上程式碼:
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':此註解將表名和實體類對映起來,不寫則預設以實體類名為表名進行資料庫操作。
* '@TableId':此註解將宣告的實體屬性作為資料庫表的主鍵欄位,還有很多主鍵實現策咯,檢視註解屬性{@link TableId#type()}。
* '@TableField':此註解將表欄位(非主鍵)和實體類屬性對映起來,不寫則預設以實體類屬性名為表欄位名進行資料庫操作。
*/
@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介面,就已經獲取了基本的增刪改查方法。
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<T>'介面,就擁有了mybatis-plus提供的公共基礎的CRUD方法。
*/
@Mapper
public interface StudentMapper extends BaseMapper<Student> {
/**
* 查詢所有學生資訊
* @return List<Student>
*/
List<Student> findAll();
/**
* 通過id查詢學生資訊
* @param id:學生id
* @return Student
*/
Student findOne(Long id);
/**
* 通過學號查詢學生資訊
* @param studentNo:學生學號
* @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查詢某個學生的資訊(BaseMapper<T>中的方法)
* @param id: 學生id
* @return Student
*/
public Student selectById(Long id);
/**
* 通過id查詢某個學生的資訊(通過xmlMapper實現)
* @param id: 學生id
* @return Student
*/
public Student findById(Long id);
/**
* 儲存一個學生物件(BaseMapper<T>中的方法)
* @param student
*/
public void insert(Student student);
/**
* 查詢性別為sex,年齡大於age的學生(普通的Wrapper)
* @param sex: 性別
* @param age: 年齡
* @return 學生list
*/
public List<Student> findByWrapper(String sex, Integer age);
/**
* 查詢性別為sex,年齡大於age的學生(Lambda形式的Wrapper)
* @param sex: 性別
* @param age: 年齡
* @return 學生list
*/
public List<Student> findByWrapperLambda(String sex, Integer age);
/**
* 更新學生資訊(Wrapper形式)
* @param student: 需要更新的學生實體
*/
public void updateByWrapper(Student student);
/**
* 更新學生資訊(BaseMapper<T>中的方法)
* @param student: 需要更新的學生實體
*/
public void updateById(Student student);
/**
* 更新學生資訊(Lambda形式的Wrapper)
* @param student: 需要更新的學生實體
*/
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<Student> findByWrapper(String sex, Integer age) {
QueryWrapper<Student> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("SEX", sex);
queryWrapper.gt("AGE", age);
return studentMapper.selectList(queryWrapper);
}
@Override
public List<Student> findByWrapperLambda(String sex, Integer age) {
LambdaQueryWrapper<Student> queryWrapper = Wrappers.<Student>lambdaQuery().eq(Student::getSex, sex).gt(Student::getAge, age);
return studentMapper.selectList(queryWrapper);
}
@Override
public void updateByWrapper(Student student) {
UpdateWrapper<Student> 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<Student> updateWrapper = Wrappers.<Student>lambdaUpdate().set(Student::getId, student.getId());
studentMapper.update(student, updateWrapper);
}
}
service層的方法都很簡單,有通過剛剛繼承的BaseMapper中的方法,但是我們還看到了一個類叫Wrapper,這個類是條件構造器,可以通過這個類實現比較複雜的查詢,有直接通過欄位名稱去查詢的,也有通過屬性和欄位名對映的lambda方式去查詢資料庫,總之就是很簡單,也很好理解這些API,但是請記住,Wrapper很重,不是一個輕量級的東西,不要將這個物件在服務間進行傳遞,效率很低。請將條件放在DTO中傳遞到service層程式碼中,在service程式碼中建立Wrapper類進行查詢。
CRUD的結果我就不展示了。然後附上Mybatis-Plus官網地址:傳送門
3. 專案地址
本專案傳送門:
- GitHub ---> spring-boot-mybatis-plus
- Gitee ---> spring-boot-mybatis-plus
此教程會一直更新下去,覺得博主寫的可以的話,關注一下,也可以更方便下次來學習。
- 作者:Butterfly-Tri
- 出處:Butterfly-Tri個人部落格
- 版權所有,歡迎保留原文連結進行轉載?