MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
基本特性
-
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
-
损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
-
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
-
支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
-
支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
-
支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
-
支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
-
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
-
内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
-
分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
-
内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
-
内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
快速开始
1.新建Maven工程,导入相关依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath/>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>BootMP</artifactId>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- boot测试框架 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- boot框架 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<!-- mybatis-plus依赖 -->
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
</dependencies>
</project>
2.配置文件application.yml
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/MyBatisPlus?characterEncoding=utf-8 username: root password: qwer6666 type: com.alibaba.druid.pool.DruidDataSource maxActive: 50 maxWait: 2000 minIdle: 10 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl type-aliases-package: com.project.bean
3.编写代码
编写实体类,并添加注解,使字段名与数据库表对应列对应。若数据库表中没有实体类中属性对应的列,则在该属性名上使用@TableField(exist = false)。
@TableName("t_man") //当前实体对应的数据库表名称
public class ManBean {
// TableId注解 指定属性对应主键的列
// type = IdType.AUTO使用数据库主键自动增长策略
@TableId(value = "pk_manid", type = IdType.AUTO)
private Integer id;
// 普通属性,书写数据库表对应的列
@TableField("f_name")
private String name;
@TableField("f_tel")
private String tel;
public Integer getId() {
return id;
}
public ManBean(String name, String tel) {
this.name = name;
this.tel = tel;
}
public ManBean() {
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
@Override
public String toString() {
return "ManBean{" +
"id=" + id +
", name='" + name + '\'' +
", tel='" + tel + '\'' +
'}';
}
}
编写Mapper类或DAO类
/*
持久接口
1、继承BaseMapper接口
2、书写该接口对应的实体类类名
3、加上@Repository 表示该接口为持久层组件
*/
@Repository
public interface ManDao extends BaseMapper<ManBean> {
//此时接口中已经包含单表的基本增删改查的实现
}
新建 Spring Boot 启动类
@SpringBootApplication
@MapperScan("com.project.dao")
public class MainServer {
public static void main(String[] args) {
SpringApplication.run(MainServer.class,args);
}
}
添加测试类,进行功能测试:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MainServer.class)
public class TestManDao {
@Resource
private ManDao manDao;
@Test
public void testAll() {
// 增加
// ManBean bean = new ManBean("周瑜", "143123141");
// int info = manDao.insert(bean);
// System.out.println(info);
// System.out.println(bean);
// 删除
// manDao.deleteById(4);
// 查询
// System.out.println(manDao.selectById(5));
// 修改
// ManBean manBean =new ManBean();
// manBean.setId(3);
// manBean.setName("貂蝉");
// manBean.setTel("213114555");
// manDao.updateById(manBean);
// selectList
// null--查询所有
// List<ManBean> list =manDao.selectList(null);
// 查询姓名为吕布的公民
// QueryWrapper<ManBean> wrapper = new QueryWrapper<>();
// 利用wrapper对象 指定条件 eq表示是否相等
// wrapper.eq("f_name", "吕布");
// wrapper.eq("f_tel", "1234143");
// wrapper.like("f_name","吕");
// wrapper.like("f_tel","1");
//
// List<ManBean> list = manDao.selectList(wrapper);
// for (ManBean manBean : list) {
// System.out.println(manBean);
// }
}
}
项目结构:
分页查询
Mybatis-Plus中内置了分页插件,配置分页类组件即可:
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor interceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
测试分页:
Page<UserBean> page = new Page<>(1, 4);
userDao.selectPage(page, null);
System.out.println("当前页数据"+page.getRecords());
System.out.println("总页数"+page.getPages());
System.out.println("总记录数"+page.getTotal());
System.out.println("下一页?"+page.hasNext());
System.out.println("上一页?"+page.hasPrevious());
wrapper.like("f_username","王");
wrapper.eq("f_gender","女");
wrapper.eq("f_symbol","游客");
userDao.selectPage(page,wrapper);
System.out.println(page.getRecords());
业务层的处理:
1.业务接口:
/*
自定义用户业务接口
1、继承IService接口
注意:通用service接口与通用mapper接口不一样,
通用mapper接口不需要提供实现类,就已经包含所有的数据库操作方法
但通用service接口必须要提供实现类
*/
public interface UserService extends IService<UserBean> {
List<UserBean> findByItem(String name, LocalDate start, LocalDate end);
IPage<UserBean> cutByItem(int pageNo, int pageSize, String name);
}
2.业务接口实现类
/*
自定义接口的实现类
注意:必须继承mybatis-plus提供的ServiceImpl实现类,并加入泛型<持久层接口,实体Bean>
此时,该实现类中就包含继承的单表crud操作
*/
@Service
@Transactional
public class UserServiceImp extends ServiceImpl<UserDao, UserBean> implements UserService {
/* @Override
public List<UserBean> findByItem(String name, LocalDate start, LocalDate end) {
// 方案1 不写xml文件
QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
if (name != null && !name.equals("")) {
wrapper.like("f_username", name);
}
if (start != null) {
wrapper.ge("f_birth", start);
}
if (end != null) {
wrapper.le("f_birth", end);
}
List<UserBean> list = this.list(wrapper);
return list;
}*/
@Override
public List<UserBean> findByItem(String name, LocalDate start, LocalDate end) {
List<UserBean> list = this.baseMapper.findByItem(name, start, end);
return list;
}
/* @Override
public IPage<UserBean> cutByItem(int pageNo, int pageSize, String name) {
IPage<UserBean> page = new Page<>(pageNo,pageSize);
QueryWrapper wrapper = new QueryWrapper();
if (name != null && !name.equals("")) {
wrapper.like("f_username", name);
}
// 通用service提供的分页查询
// IPage<UserBean> iPage = this.page(page,wrapper);
// 通用mapper提供的分页查询
IPage<UserBean> iPage = this.baseMapper.selectPage(page,wrapper);
return iPage;
}*/
@Override
public IPage<UserBean> cutByItem(int pageNo, int pageSize, String name) {
Page<UserBean> page = new Page<>(pageNo,pageSize);
IPage<UserBean> iPage = this.baseMapper.cutByItem(page,name);
return iPage;
}
}
3.Service功能测试
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MainServer.class)
public class TestService {
@Resource
private UserService service;
@Resource
private StudentService studentService;
@Resource
private TeacherService teacherService;
@Test
public void testService() {
UserBean userBean = new UserBean("修改", "女",
LocalDate.parse("1111-03-13"), "890", "会员");
// 通用service接口 save插入数据
// service.save(userBean);
// List<UserBean> list = new ArrayList<>();
// list.add( new UserBean("杨坷1", "男",
// LocalDate.parse("1882-03-13"), "112", "用户"));
//
// list.add( new UserBean("杨坷2", "男",
// LocalDate.parse("1882-03-13"), "112", "用户"));
//
// list.add( new UserBean("杨坷3", "男",
// LocalDate.parse("1882-03-13"), "112", "用户"));
//
// service.saveBatch(list);
// 修改update
// 根据id修改
// userBean.setId(18);
// service.updateById(userBean);
// 根据条件修改
// QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
// wrapper.eq("f_username","测试修改");
//
// service.update(userBean,wrapper);
//删除
// service.removeById(19);
// wrapper.like("f_username", "坷");
// service.remove(wrapper);
//查询
// System.out.println(service.getById(13));
// wrapper.eq("f_username","全冠清");
// System.out.println(service.getOne(wrapper));
// 查询集合
//
// wrapper.eq("f_gender","女");
// wrapper.eq("f_symbol","会员");
//
// List<UserBean> list =service.list(wrapper);
// System.out.println(list);
// wrapper.eq("f_gender","女");
// IPage<UserBean> page = service.page(new Page<>(2,3),wrapper);
//
// System.out.println(page.getRecords());
// List<UserBean> list = service.findByItem("王",LocalDate.parse("1111-01-01"),null);
// for (UserBean user :list){
// System.out.println(user);
// }
// IPage<UserBean> page = service.cutByItem(2,2,"王");
// System.out.println(page.getRecords());
// StudentBean stu = new StudentBean("金刚狼", LocalDate.parse("1982-02-17"), "男");
// studentService.save(stu);
// List<StudentBean> list = new ArrayList<>();
// list.add(new StudentBean("金刚", LocalDate.parse("1989-05-22"), "男"));
// list.add(new StudentBean("金贞恩", LocalDate.parse("1992-01-26"), "男"));
// list.add(new StudentBean("王四喜", LocalDate.parse("2008-10-11"), "女"));
// studentService.saveBatch(list);
// stu.setsId(2);
// studentService.updateById(stu);
// QueryWrapper<StudentBean> wrapper = new QueryWrapper<>();
// wrapper.eq("f_sname", "王四");
// studentService.update(stu, wrapper);
// wrapper.eq("f_sname", "刘三");
// studentService.remove(wrapper);
// studentService.removeById(4);
// System.out.println(studentService.getById(5));
// wrapper.like("f_sname","四");
// wrapper.like("f_sname","张三");
//
// System.out.println(studentService.getOne(wrapper));
// List<StudentBean> list = studentService.list(wrapper);
// System.out.println(list);
TeacherBean teacherBean = new TeacherBean("李老师", 29, "成华区");
// teacherService.save(teacherBean);
// List<TeacherBean> list = new ArrayList<>();
// list.add(new TeacherBean("刘老师", 29, "锦江区"));
// list.add(new TeacherBean("李老师", 34, "武侯区"));
// list.add(new TeacherBean("赵老师", 26, "成华区"));
// list.add(new TeacherBean("王老师", 40, "武侯区"));
//
// teacherService.saveBatch(list);
// Integer[] stuIdArray = {1,6,9};
// teacherService.addRelation(4,stuIdArray);
// System.out.println(teacherService.getTeacherIncludesStu(1));
// System.out.println(teacherService.cutByItem(1, 2, "李").getRecords());
// teacherService.replace(2,5);
// Integer[] array = {6,7};
// studentService.addRelation(10,array);
// System.out.println(studentService.getStuIncludesTeacher(1));
studentService.delStu(3);
}
}