1 核心功能
- 通用 CRUD:定义好 Mapper 接口后,只需要继承 BaseMapper
接口即可获得通用的增删改查功能,无需编写任何接口方法与配置文件 - 条件构造器:通过 EntityWrapper
(实体包装类),可以用于拼接 SQL 语句,并且支持排序、分组查询等复杂的 SQL - 代码生成器:支持一系列的策略配置与全局配置,比 MyBatis 的代码生成更好用
2 基本配置
2.1 添加核心依赖
mysql
mysql-connector-java
runtime
org.projectlombok
lombok
true
com.baomidou
mybatis-plus-boot-starter
3.4.0
com.baomidou
mybatis-plus-generator
3.4.1
org.apache.velocity
velocity-engine-core
2.0
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;
/**
* 帐号状态(0正常 1停用)
*/
private String status;
/**
* 删除标志(0代表存在 2代表删除)
*/
private String delFlag;
/**
* 最后登陆IP
*/
private String loginIp;
/**
* 最后登陆时间
*/
private Date loginDate;
/**
* 创建者
*/
private String createBy;
/**
* 创建时间
* 时间自动填充
*/
@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 接口即可获得通用的增删改查功能
*/
@Mapper
public interface SysUserMapper extends BaseMapper {
}
通用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 {
}
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 implements SysUserService {
}
测试
**
* 通用Mapper层接口测试
* 普通CRUD+分页
*/
@RunWith(SpringRunner.class)
@SpringBootTest
class MapperTest {
@Resource
private SysUserMapper sysUserMapper;
/**
* 查找所有
*/
@Test
void selectList() {
List userList = sysUserMapper.selectList(null);
userList.forEach(System.out::println);
}
/**
* 分页查找
*/
@Test
void selectByPage() {
Page page = new Page<>(1, 3);
IPage userIPage = sysUserMapper.selectPage(page, null);
System.out.println("总记录数:" + page.getTotal());
System.out.println("总页数" + page.getPages());
List list=userIPage.getRecords();
list.forEach(System.out::println);
}
/**
* 插入
*/
@Test
void insert(){
SysUser user=new SysUser();
user.setUserId("25");
user.setUserName("susu");
sysUserMapper.insert(user);
}
/**
* 根据id删除
*/
@Test
void deleteById(){
sysUserMapper.deleteById("zxc");
}
/**
* 根据map删除
*/
@Test
void DeleteByMap(){
HashMap map = new HashMap<>();
map.put("user_id","25");
sysUserMapper.deleteByMap(map);
}
/**
* 根据id更新
*/
@Test
void update(){
SysUser user=new SysUser();
user=sysUserMapper.selectById("ry");
user.setUserName("ry");
sysUserMapper.updateById(user);
}
}
3.2 自动填充功能
经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作:
1.数据库中添加相应字段
2.实体类中添加注解
/**
* 创建时间
* 时间自动填充
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 更新时间
* 时间自动修改
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
3.实现元对象处理器接口
@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自带分页插件,只要简单的配置即可实现分页功能
配置类:
@Configuration
public class PaginationConfig {
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor ();
}
}
使用:
/**
* 分页查找
*/
@Test
void selectByPage() {
Page page = new Page<>(1, 3);
IPage userIPage = sysUserMapper.selectPage(page, null);
System.out.println("总记录数:" + page.getTotal());
System.out.println("总页数" + page.getPages());
List list=userIPage.getRecords();
list.forEach(System.out::println);
3.4 EntityWrapper 条件构造器
Mybatis-Plus 通过 EntityWrapper(简称 EW,MP 封装的一个查询条件构造器)或者Condition(与 EW 类似) 来让用户自由的构建查询条件,简单便捷,没有额外的负担,能够有效提高开发效率
实体包装器,主要用于处理 sql 拼接,排序,实体参数查询等
注意: 使用的是数据库的字段,不是java的属性名称
参数说明见:https://baomidou.com/guide/wrapper.html#and
使用:
@RunWith(SpringRunner.class)
@SpringBootTest
public class QueryWrapperTest {
@Resource
private SysUserMapper sysUserMapper;
@Test
public void selectByInfo(){
QueryWrapper wrapper = new QueryWrapper<>();
// 查找性别为0,姓名为a开头的人
wrapper.select("user_id", "user_name", "email","sex").eq("sex", 0).like("user_name", "a");
List users = sysUserMapper.selectList(wrapper);
users.forEach(user -> System.out.println(user));
}
}
3.5 代码生成器
AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
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、设置数据源
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(); //执行
}
}