MybatisPlus入门
MybatisPlus
简介
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
我们的愿景是成为 Mybatis
最好的搭档,就像 魂斗罗 中的1P、2P,基友搭配,效率翻倍。
特性
- 无侵入**:Mybatis-Plus 在 Mybatis 的基础上进行扩展,只做增强不做改变,引入 Mybatis-Plus 不会对您现有的 Mybatis 构架产生任何影响,而且 MP 支持所有 Mybatis 原生的特性
- 依赖少:仅仅依赖 Mybatis 以及 Mybatis-Spring
- 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
- 预防Sql注入:内置 Sql 注入剥离器,有效预防Sql注入攻击
- 通用CRUD操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
- 多种主键策略:支持多达4种主键策略(内含分布式唯一ID生成器),可自由配置,完美解决主键问题
- 支持热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动
- 支持ActiveRecord:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可实现基本 CRUD 操作
- 支持代码生成:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用(P.S. 比 Mybatis 官方的 Generator 更加强大!)
- 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 支持关键词自动转义:支持数据库关键词(order、key…)自动转义,还可自定义关键词
- 内置分页插件:基于 Mybatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询
- 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询
- 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,预防误操作
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
代码托管
官方网站:http://mp.baomidou.com/
2. MP快速入门
- 创建数据库
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`teacher_id` int(11) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, '小学生', '安徽', 1);
INSERT INTO `user` VALUES (2, '小学生', '安徽', 1);
INSERT INTO `user` VALUES (3, '小学生', '安徽', 1);
INSERT INTO `user` VALUES (4, '小学生', '安徽', 1);
INSERT INTO `user` VALUES (5, '小学生', '北京', 2);
INSERT INTO `user` VALUES (6, '小学生', '北京', 2);
INSERT INTO `user` VALUES (7, '小学生', '北京', 2);
INSERT INTO `user` VALUES (8, '小学生', '北京', 2);
INSERT INTO `user` VALUES (9, '小学生', '北京', 2);
INSERT INTO `user` VALUES (10, '小学生', '北京', 2);
INSERT INTO `user` VALUES (11, '小学生', '北京', 3);
INSERT INTO `user` VALUES (12, '小学生', '上海', 3);
INSERT INTO `user` VALUES (13, '小学生', '上海', 3);
INSERT INTO `user` VALUES (14, '小学生', '上海', 3);
- 引入Maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mybatis Plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.1</version>
</dependency>
<!--JDBC-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--MYSQL-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--Druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
- 修改配置文件
server:
port: 8890
spring:
application:
name: mp_demo
datasource:
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC&nullCatalogMeansCurrent=true
username: root
# 本地密码
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
initialization-mode: always
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.waitingresult.mybatis_plus.model
global-config:
# 数据库相关配置
db-config:
#主键类型 AUTO:"数据库ID自增", INPUT:"用户输入ID",ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
id-type: auto
#字段策略 IGNORED:"忽略判断",NOT_NULL:"非 NULL 判断"),NOT_EMPTY:"非空判断"
field-strategy: not_empty
#驼峰下划线转换
table-underline: true
#是否开启大写命名,默认不开启
#capital-mode: true
#逻辑删除配置
#logic-delete-value: 1
#logic-not-delete-value: 0
db-type: mysql
#刷新mapper 调试神器
refresh: true
# 原生配置
configuration:
map-underscore-to-camel-case: true
cache-enabled: true
- 实体类
@TableId(value = “id”, type = IdType.AUTO)
表示这个实体类的ID 是自增长.
AR模式
extends Model< T>
需要重写 pkVal
@Override
protected Serializable pkVal() {
return this.id;
}
继承Model以后 可以new对象.insert /
这里的图片信息, 没有更换, 里面的Wrapper 官方已经修改为QueryWrapper和UpdateWrapper
CRUD
- 测试数据库中只有user表,使用MP对数据库进行CRUD操作
- Mp 只需要写出接口,然后在接口上继承BaseMapper< T >即可
public interface UserMapper extends BaseMapper<User> {
}
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserMapper userMapper;
public void test(){
userMapper.insert();
//delete
//updatebyid
//add
//selectList
//selectPage
//省略.
}
}
以上是基本的 CRUD 操作,如您所见,我们仅仅需要继承一个 BaseMapper 即可实现大部分单表 CRUD 操作。BaseMapper 提供了多达 17 个方法给大家使用, 可以极其方便的实现单一、批量、分页等操作。极大的减少开发负担
EntityWrapper 条件构造器
3.1 EntityWrapper 简介
Mybatis-Plus 通过 EntityWrapper(简称 EW,MP 封装的一个查询条件构造器)或者Condition(与 EW 类似) 来让用户自由的构建查询条件,简单便捷,没有额外的负担,能够有效提高开发效率
实体包装器,主要用于处理 sql 拼接,排序,实体参数查询等
注意: 使用的是数据库的字段,不是java的属性名称
条件参数说明:
查询方式 | 说明 |
---|---|
setSqlSelect | 设置 SELECT 查询字段 |
where | WHERE 语句,拼接 + WHERE 条件 |
and | AND 语句,拼接 + AND 字段=值 |
andNew | AND 语句,拼接 + AND (字段=值) |
or | OR 语句,拼接 + OR 字段=值 |
orNew | OR 语句,拼接 + OR (字段=值) |
eq | 等于= |
allEq | 基于 map 内容等于= |
ne | 不等于<> |
gt | 大于> |
ge | 大于等于>= |
lt | 小于< |
le | 小于等于<= |
like | 模糊查询 LIKE |
notLike | 模糊查询 NOT LIKE |
in | IN 查询 |
notIn | NOT IN 查询 |
isNull | NULL 值查询 |
isNotNull | IS NOT NULL |
groupBy | 分组 GROUP BY |
having | HAVING 关键词 |
orderBy | 排序 ORDER BY |
orderAsc | ASC 排序 ORDER BY |
orderDesc | DESC 排序 ORDER BY |
exists | EXISTS 条件语句 |
notExists | NOT EXISTS 条件语句 |
between | BETWEEN 条件语句 |
notBetween | NOT BETWEEN 条件语句 |
addFilter | 自由拼接 SQL |
last | 拼接在最后,例如:last(“LIMIT 1”) |
3.2 EntityWrapper 使用
问题:年龄在 18~50 之间性别为男且姓名为 马 的所有用户
/**
* 年龄在 18~25 之间性别为男且姓名为 马 的所有用户
*/
@Test
public void testFindListEntityWrapper(){
CustomerMapper mapper = context.getBean(CustomerMapper.class);
QueryWrapper<Customer> warpper= new QueryWrapper<Customer>();
warpper.between("age",18,25)
.eq("gender",0)
.like("cust_name","马");
Page<Customer> page = new Page<Customer>(1,30);
List<Customer> list = mapper.selectPage(page, warpper);
for (Customer customer : list) {
System.out.println(customer);
}
}
3.3 EntityWrapper 的公用
一般在项目中 为了实现 Warpper的公用, 会在ServiceImpl下 写一个 getQuery的方法
根据实体类对象, 返回一个 QUeryWrapper.供后续使用.
private QueryWrapper<DTO> getQeuryWrapper(Dto dto) {
QueryWrapper<DTO> wrapper = new QueryWrapper<>();
if (ObjectUtil.isNotEmpty(dto.getId())) {
wrapper.eq("id", dto.getId());
}
if (ObjectUtil.isNotEmpty(dto.getUid())) {
wrapper.eq("uid", dto.getUid());
}
return wrapper;
}