Mybatis-plus学习笔记
文章目录
- Mybatis-plus学习笔记
- 前言
- 一、MP简介
- 二、SpringBoot集成Mybatis plus使用步骤
前言
一、MP简介
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
官网: https://mp.baomidou.com/
特性
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作
支持数据库
mysql 、 mariadb 、 oracle 、 db2 、 h2 、 hsql 、 sqlite 、 postgresql 、 sqlserver 、 presto
达梦数据库 、 虚谷数据库 、 人大金仓数据库
是在mybatis的基础上加了一些辅助功能大大简化了我们的开发
二、SpringBoot集成Mybatis plus使用步骤
1.引入库
引入下mp依赖,注意不要引错了,会和我一样找不到映射的
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
再引入下连接池druid和单元测试框架junit
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
2.配置文件
application,yml文件配置
关于数据库字段风格虽然实体类可以设置成和数据库字段不同 但是这样加大内存的消耗,建议还是和mp默认一样
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/db_mp?serverTimezone=GMT
username: root
password: xxxxx
mybatis-plus:
global-config:
db-config:
id-type: auto
# table-prefix: t_ 设置表前缀
# table-underline: false #不设置驼峰 如 t_studentInfo 变成 t_student_info
#configuration:
# map-underscore-to-camel-case: false #设置列不驼峰
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #显示mysql语句
Application类记得加mapper扫描
@MapperScan("com.luyi.mapper")
3.数据库结构和实体类配置
数据库结构
实体类代码:
/**
* 部门实体
* @author 卢意
* @create 2020-10-14 19:31
*/
@TableName("t_department") //实体映射t_department表 同名不用映射
@Data //自动生成get set
public class Department {
@TableId(value = "id",type = IdType.AUTO) //设置主键生成策略
private Integer id; //编号
@TableField(value = "depart_name") //字段名和属性名称不一样时 设置映射
private String name;//名称
private String remark; //备注
@TableField(exist = false) //数据库中不存在的属性 设置不存在
public String state; //
}
4.mapper接口
继承BaseMapper
package com.luyi.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.luyi.entity.Department;
/**
* 部门mapper接口
* @author 卢意
* @create 2020-10-14 19:34
*/
public interface DepartmentMapper extends BaseMapper<Department> {
}
4.使用
这样就继承了很多方法
5.queryWrapper的使用
1.queryWrapper的声明
建议使用第一种声明方式比较直观
QueryWrapper<Employee> queryWrapper=new QueryWrapper<> ();
//第二种声明方式 QueryWrapper<Employee> queryWrapper2= Wrappers.<Employee>query();
2.queryWrapper的实例
(1).查找薪水大于3500 名字里有“小”的 员工
sql语句
select * from t_employee where salary>3500 and name like '%小%'
queryWrapper使用
QueryWrapper<Employee> queryWrapper=new QueryWrapper<> ();
//第二种声明方式 QueryWrapper<Employee> queryWrapper2= Wrappers.<Employee>query();
queryWrapper.gt("salary", 3500).like("name", "小"); // gt 大于
List<Employee> employeeList = employeeMapper.selectList(queryWrapper);
System.out.println(employeeList);
结果
==> Preparing: SELECT Id,name,birthday,gender,phone_number,department_id,salary FROM t_employee WHERE (salary BETWEEN ? AND ? AND name LIKE ? AND email IS NOT NULL)
==> Parameters: 3500(Integer), 4800(Integer), %小%(String)
<== Columns: Id, name, birthday, gender, phone_number, department_id, salary
<== Row: 3, 李小丽, 1993-02-09, 女, 12722556578, 2, 3800
<== Row: 4, 王小萌, 1994-02-09, 女, 12622556578, 2, 4000
<== Total: 2
(2).查找薪水范围【3500,4800】,名字里有“小”以及email不为空 的员工
sql语句
select * from t_employee where between 3500 and 4800 and name like '%小%' and email is not null
queryWrapper使用
QueryWrapper<Employee> queryWrapper=new QueryWrapper<> ();
queryWrapper.between("salary", 3500, 4800).like("name", "小").isNotNull("email");
List<Employee> employeeList = employeeMapper.selectList(queryWrapper);
System.out.println(employeeList);
结果
==> Preparing: SELECT Id,name,birthday,gender,phone_number,department_id,salary FROM t_employee WHERE (salary > ? AND name LIKE ?)
==> Parameters: 3500(Integer), %小%(String)
<== Columns: Id, name, birthday, gender, phone_number, department_id, salary
<== Row: 3, 李小丽, 1993-02-09, 女, 12722556578, 2, 3800
<== Row: 4, 王小萌, 1994-02-09, 女, 12622556578, 2, 4000
<== Row: 5, 曹小梅, 1994-04-09, 女, 12622556578, 3, 4400
<== Row: 6, 钱小小, 1994-06-09, 女, 16642556578, 4, 4900
<== Total: 4
(3).查询姓李的,并且出生日期范围是1993-02-09到1994-04-09的员工
sql语句
SELECT * FROM t_employee WHERE DATE_FORMAT(birthday,'%Y-%m-%d')>='1993-02-09' AND DATE_FORMAT(birthday,'%Y-%m-%d')<='1994-04-09' AND NAME LIKE '李%'
queryWrapper使用
QueryWrapper<Employee> queryWrapper=new QueryWrapper<> ();
queryWrapper.apply("DATE_FORMAT(birthday,'%Y-%m-%d')>={0} AND DATE_FORMAT(birthday,'%Y-%m-%d')<={1} ","1993-02-09","1994-04-09").likeRight("name", "李");
List<Employee> employeeList = employeeMapper.selectList(queryWrapper);
System.out.println(employeeList);
结果
JDBC Connection [com.mysql.jdbc.JDBC4Connection@40298285] will not be managed by Spring
==> Preparing: SELECT Id,name,birthday,gender,phone_number,department_id,salary FROM t_employee WHERE (DATE_FORMAT(birthday,'%Y-%m-%d')>=? AND DATE_FORMAT(birthday,'%Y-%m-%d')<=? AND name LIKE ?)
==> Parameters: 1993-02-09(String), 1994-04-09(String), 李%(String)
<== Columns: Id, name, birthday, gender, phone_number, department_id, salary
<== Row: 2, 李四, 1993-02-09, 男, 13622556578, 1, 3500
<== Row: 3, 李小丽, 1993-02-09, 女, 12722556578, 2, 3800
<== Total: 2
(4).查询姓李的或者邮箱不为空并且是女性的员工
sql语句
sql:SELECT * FROM t_employee WHERE NAME LIKE '李%' OR (email IS NOT NULL AND gender ='女')
queryWrapper使用
这里运用了lambda表达式,处理or方法更方便一点
QueryWrapper<Employee> queryWrapper=new QueryWrapper<> ();
queryWrapper.likeRight("name", "李").or(wq->wq.isNotNull(