Mybatis-Plus简介
Mybatis-Plus 是一款 Mybatis 动态 SQL 自动注入 Mybatis 增删改查 CRUD 操作中间件, 减少你的开发周期优化动态维护 XML 实体字段,无入侵全方位 ORM 辅助层让您拥有更多时间陪家人。
Mybatis-Plus特性
- 无侵入: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 操作智能分析阻断,预防误操作
官网
http://mp.baomidou.com/
https://github.com/baomidou/mybatis-plus
为什么有这个入门手册
- 【v1】
目前最新版本:3.0 alpha/beta,升级 JDK 8 + 优化性能 Wrapper 支持 lambda 语法等等, Wrapper 也更改为 QueryWrapper和UpdateWrapper,网上的攻略已经不行了,这里提供一个新版本的入门采坑手册,并附上spring-cloud-study-mybatisplus开源学习项目。那么教程开始了。 - 【v2】
目前3.0已经进入正式阶段3.0.5,官方文档也陆续完善
maven的pom.xml配置
3.0.5之后,在SpringBoot2的包引入后,只需要这样一个包就搞定了。
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.0.5</version> </dependency>
application.yml应用配置
3.0.5之后,无需额外的配置,只需要一句
@MapperScan("com.xxxx.xxx.mapper")
即可开启Mybatis-Plus。以下配置为常规配置而已,仅供参考。server: port: 3333 servlet: context-path: /mybatisplus tomcat: remote-ip-header: x-forward-for uri-encoding: UTF-8 max-threads: 10 background-processor-delay: 30 spring: http: encoding: force: true charset: UTF-8 application: name: spring-cloud-study-mybatisplus freemarker: request-context-attribute: req #prefix: /templates/ suffix: .html content-type: text/html enabled: true cache: false charset: UTF-8 allow-request-override: false expose-request-attributes: true expose-session-attributes: true expose-spring-macro-helpers: true #template-loader-path: classpath:/templates/ datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.jdbc.Driver driver-class-name: com.mysql.jdbc.Driver platform: mysql url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: root initialSize: 5 minIdle: 5 maxActive: 20 maxWait: 60000 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 testWhileIdle: true testOnBorrow: false testOnReturn: false filters: stat,wall,log4j
Entity
推荐用我写的生成器,用sql语句生成实体类,而且最好用lombok简化setget
http://java.bejson.com/generatorMapper
Mapper只需要
extends BaseMapper<T>
就可以完美实现增删改查等一系列操作,非常方便import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface UserMapper extends BaseMapper<User>{
}
这里Entity省略setter和getter方法,可以用lombok的@Data代替
@Data public class User implements Serializable { private static final long serialVersionUID = 1L;
private int id; private String userId; private String userName; private String passWord; private String name; private String tell; private int status;
}
Controller控制器
这里随便写个init方法和find方法,init就不用说了,初始化一些数据进去,find使用了QueryWrapper构造器,很方便。
@RestController @RequestMapping("/user") public class UserController { @Autowired private UserMapper userMapper;
@GetMapping("/init") public ApiReturnObject init(){ List<User> userList=new ArrayList<User>(); for (int i = 0; i < 10; i++) { int n=RandomUtil.randomInt(10000,99999)+i; User user=new User(); user.setId(n); user.setName(n+""); user.setPassWord(n+""); user.setStatus(1); user.setUserId(n+""); user.setUserName(n+""); userMapper.insert(user); userList.add(user); user=null; } return ApiReturnUtil.success(userList); } @GetMapping("/find") public ApiReturnObject find(){ IPage<User> userList=userMapper.selectPage( new Page<User>(1, 10), new QueryWrapper<User>().like("name","1") ); return ApiReturnUtil.success(userList.getRecords()); }
}
这里还放出一段实战语句,直接用QueryWrapper构造器模糊查询证书编码,这个构造器是mybatis-plus的一个精华,请用好
@RestController public class CertContoller { @Autowired private CertMapper certMapper;
@RequestMapping("/certCompanyDetail") public Object certCompanyDetail(){ return certMapper.selectOne(new QueryWrapper<Cert>().like("cert_num","EGAG-SAL05-201811XXXX")); }
}
Postman测试
访问数据初始化 http://127.0.0.1:1111/mybatisplus/user/init
{
"errorCode": "00",
"errorMessage": "success",
"returnObject": [
{
"id": 52585,
"name": "52585",
"passWord": "52585",
"status": 1,
"userId": "52585",
"userName": "52585"
},
{
"id": 33432,
"name": "33432",
"passWord": "33432",
"status": 1,
"userId": "33432",
"userName": "33432"
}
。。。这里省略其他的
]
}
访问构造器查询 http://127.0.0.1:3333/mybatisplus/user/find
{
"errorCode": "00",
"errorMessage": "success",
"returnObject": [
{
"id": 41618,
"name": "41618",
"passWord": "41618",
"status": 1,
"userId": "41618",
"userName": "41618"
},
{
"id": 17804,
"name": "17804",
"passWord": "17804",
"status": 1,
"userId": "17804",
"userName": "17804"
}
。。。省略其他包含1的
]
}
QueryWrapper条件参数说明
查询方式 | 说明 |
---|---|
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 |
orderByAsc(有变化,中间有By) | ASC 排序 ORDER BY |
orderByDesc(有变化,中间有By) | DESC 排序 ORDER BY |
exists | EXISTS 条件语句 |
notExists | NOT EXISTS 条件语句 |
between | BETWEEN 条件语句 |
notBetween | NOT BETWEEN 条件语句 |
addFilter | 自由拼接 SQL |
last | 拼接在最后,例如:last("LIMIT 1") |
分页插件
已经在springboot注入mybatis的分页插件,直接使用Page参数<index,size>调用即可,简单方便。
IPage<User> userList=userMapper.selectPage(
new Page<User>(1, 10),
new QueryWrapper<User>().like("name","1")
);