1 核心功能
- 通用 CRUD:定義好 Mapper 接口后,只需要繼承 BaseMapper<T> 接口即可獲得通用的增刪改查功能,無需編寫任何接口方法與配置文件
- 條件構造器:通過 EntityWrapper<T> (實體包裝類)吩愧,可以用于拼接 SQL 語句雁佳,并且支持排序、分組查詢等復雜的 SQL
- 代碼生成器:支持一系列的策略配置與全局配置星澳,比 MyBatis 的代碼生成更好用
2 基本配置
2.1 添加核心依賴
<!-- 數(shù)據(jù)庫驅動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- mybatis-plus和Springboot整合-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<!-- mybatis-plus代碼生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<!-- 模板引擎 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
2.2 配置文件application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: suruomo
url: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
server:
port: 8070
功能體驗
3.1 通用CRUD
實體類
package com.suruomo.mybatisplus.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.util.Date;
/**
* @Author: suruomo
* @Date: 2020/8/25 14:38
* @Description:
*/
@Data
@TableName(value = "sys_user")
public class SysUser {
/**
* 登錄賬號
* type = IdType.INPUT表示主鍵輸入
* 改為AUTO為自增
*/
@TableId(type = IdType.INPUT)
private String userId;
/**
* 用戶昵稱
*/
private String userName;
/**
* 用戶郵箱
*/
private String email;
/**
* 手機號碼
*/
private String phonenumber;
/**
* 用戶性別(0男 1女 2未知)
*/
private String sex;
/**
* 密碼
*/
private String password;
/**
* 帳號狀態(tài)(0正常 1停用)
*/
private String status;
/**
* 刪除標志(0代表存在 2代表刪除)
*/
private String delFlag;
/**
* 最后登陸IP
*/
private String loginIp;
/**
* 最后登陸時間
*/
private Date loginDate;
/**
* 創(chuàng)建者
*/
private String createBy;
/**
* 創(chuàng)建時間
* 時間自動填充
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 更新者
*/
private String updateBy;
/**
* 更新時間
* 時間自動修改
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
Mapper接口
package com.suruomo.mybatisplus.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.suruomo.mybatisplus.entity.SysUser;
import org.apache.ibatis.annotations.Mapper;
/**
* @Author: suruomo
* @Date: 2020/8/25 14:40
* @Description: 繼承 BaseMapper<T> 接口即可獲得通用的增刪改查功能
*/
@Mapper
public interface SysUserMapper extends BaseMapper<SysUser> {
}
通用CRUD方法:
Service層
package com.suruomo.mybatisplus.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.suruomo.mybatisplus.entity.SysUser;
/**
* @Author: suruomo
* @Date: 2020/8/25 19:34
* @Description:
*/
public interface SysUserService extends IService<SysUser> {
}
package com.suruomo.mybatisplus.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.suruomo.mybatisplus.mapper.SysUserMapper;
import com.suruomo.mybatisplus.entity.SysUser;
import com.suruomo.mybatisplus.service.SysUserService;
import org.springframework.stereotype.Service;
/**
* @Author: suruomo
* @Date: 2020/8/25 19:36
* @Description:
*/
@Service
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements SysUserService {
}
測試
**
* 通用Mapper層接口測試
* 普通CRUD+分頁
*/
@RunWith(SpringRunner.class)
@SpringBootTest
class MapperTest {
@Resource
private SysUserMapper sysUserMapper;
/**
* 查找所有
*/
@Test
void selectList() {
List<SysUser> userList = sysUserMapper.selectList(null);
userList.forEach(System.out::println);
}
/**
* 分頁查找
*/
@Test
void selectByPage() {
Page<SysUser> page = new Page<>(1, 3);
IPage<SysUser> userIPage = sysUserMapper.selectPage(page, null);
System.out.println("總記錄數(shù):" + page.getTotal());
System.out.println("總頁數(shù)" + page.getPages());
List<SysUser> list=userIPage.getRecords();
list.forEach(System.out::println);
}
/**
* 插入
*/
@Test
void insert(){
SysUser user=new SysUser();
user.setUserId("25");
user.setUserName("susu");
sysUserMapper.insert(user);
}
/**
* 根據(jù)id刪除
*/
@Test
void deleteById(){
sysUserMapper.deleteById("zxc");
}
/**
* 根據(jù)map刪除
*/
@Test
void DeleteByMap(){
HashMap<String, Object> map = new HashMap<>();
map.put("user_id","25");
sysUserMapper.deleteByMap(map);
}
/**
* 根據(jù)id更新
*/
@Test
void update(){
SysUser user=new SysUser();
user=sysUserMapper.selectById("ry");
user.setUserName("ry");
sysUserMapper.updateById(user);
}
}
3.2 自動填充功能
經常會遇到一些數(shù)據(jù)士修,每次都使用相同的方式填充李命,例如記錄的創(chuàng)建時間黔州,更新時間等流妻。我們可以使用MyBatis Plus的自動填充功能涣达,完成這些字段的賦值工作:
1.數(shù)據(jù)庫中添加相應字段
2.實體類中添加注解
/**
* 創(chuàng)建時間
* 時間自動填充
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 更新時間
* 時間自動修改
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
3.實現(xiàn)元對象處理器接口
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
3.3 分頁功能
MyBatis Plus自帶分頁插件,只要簡單的配置即可實現(xiàn)分頁功能
配置類:
@Configuration
public class PaginationConfig {
/**
* 分頁插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor ();
}
}
使用:
/**
* 分頁查找
*/
@Test
void selectByPage() {
Page<SysUser> page = new Page<>(1, 3);
IPage<SysUser> userIPage = sysUserMapper.selectPage(page, null);
System.out.println("總記錄數(shù):" + page.getTotal());
System.out.println("總頁數(shù)" + page.getPages());
List<SysUser> list=userIPage.getRecords();
list.forEach(System.out::println);
3.4 EntityWrapper 條件構造器
Mybatis-Plus 通過 EntityWrapper(簡稱 EW,MP 封裝的一個查詢條件構造器)或者Condition(與 EW 類似) 來讓用戶自由的構建查詢條件甩骏,簡單便捷饮笛,沒有額外的負擔,能夠有效提高開發(fā)效率
實體包裝器素跺,主要用于處理 sql 拼接,排序踊跟,實體參數(shù)查詢等
注意: 使用的是數(shù)據(jù)庫的字段,不是java的屬性名稱
參數(shù)說明見:https://baomidou.com/guide/wrapper.html#and
使用:
@RunWith(SpringRunner.class)
@SpringBootTest
public class QueryWrapperTest {
@Resource
private SysUserMapper sysUserMapper;
@Test
public void selectByInfo(){
QueryWrapper<SysUser> wrapper = new QueryWrapper<>();
// 查找性別為0,姓名為a開頭的人
wrapper.select("user_id", "user_name", "email","sex").eq("sex", 0).like("user_name", "a");
List<SysUser> users = sysUserMapper.selectList(wrapper);
users.forEach(user -> System.out.println(user));
}
}
3.5 代碼生成器
AutoGenerator 是 MyBatis-Plus 的代碼生成器炬藤,通過 AutoGenerator 可以快速生成 Entity沈矿、Mapper睡互、Mapper XML就珠、Service、Controller 等各個模塊的代碼蹂季,極大的提升了開發(fā)效率偿洁。
public class GenerateCode {
public static void main(String[] args) {
// 需要構建一個 代碼自動生成器 對象
AutoGenerator mpg = new AutoGenerator();
// 配置策略
// 1、全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath+"/src/main/java");
gc.setAuthor("suruomo");//作者名稱
gc.setOpen(false);
// 自定義文件命名宾肺,注意 %s 會自動填充表實體屬性!
gc.setServiceName("%sService");
gc.setControllerName("%sController");
gc.setServiceName("%sService");
gc.setServiceImplName("%sServiceImpl");
gc.setMapperName("%sMapper");
gc.setXmlName("%sMapper");
mpg.setGlobalConfig(gc);
//2增拥、設置數(shù)據(jù)源
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
// dsc.setDriverName("com.mysql.jdbc.Driver"); //mysql5.6以下的驅動
dsc.setUsername("root");
dsc.setPassword("suruomo");
dsc.setDbType(DbType.MYSQL);
mpg.setDataSource(dsc);
//3、包的配置
PackageConfig pc = new PackageConfig();
pc.setParent("com.suruomo"); //包名
pc.setModuleName("mybatisplus"); //模塊名
pc.setEntity("entity");
pc.setMapper("mapper");
pc.setService("service");
pc.setController("controller");
mpg.setPackageInfo(pc);
//4、策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude("sys_user","aluminum","sys_log"); // 設置要映射的表名
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true); // 自動lombok逾苫;
strategy.setLogicDeleteFieldName("deleted");
strategy.setRestControllerStyle(true); //rest請求
//自動轉下劃線铅搓,比如localhost:8080/hello_id_2
strategy.setControllerMappingHyphenStyle(true);
mpg.setStrategy(strategy);
mpg.execute(); //執(zhí)行
}
}