Mybatis-Plus简介:
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。官方文档: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 操作智能分析阻断,预防误操作
备注:这里只是简单的demo学习,官方也有具体的demo,看个人喜好,这里自己写通俗点。
Spring-boot整合Mybatis-Plus
加入Mybatis-Plus坐标:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
官方用的是DB2数据源,这里使用的mysql数据源,在application.yml配置文件配置数据源,同时加入Mybatis-Plus配置,关于Mybatis-Plus配置。可以查看具体的官方文档:
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/test
data-username: root
data-password: root
driver-class-name: com.mysql.jdbc.Driver
#mybatis
mybatis-plus:
# 如果是放在src/main/java目录下 classpath:/com/yourpackage/*/mapper/*Mapper.xml
# 如果是放在resource目录 classpath:/mapper/*Mapper.xml
mapper-locations: classpath:/mapper/*Mapper.xml
global-config:
#主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
id-type: 2
#字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
field-strategy: 2
#刷新mapper 调试神器
refresh-mapper: true
#逻辑删除配置(下面3个配置)
logic-delete-value: 0
logic-not-delete-value: 1
sql-parser-cache: true
configuration:
#配置返回数据库(column下划线命名&&返回java实体是驼峰命名),自动匹配无需as(没开启这个,SQL需要写as: select user_id as userId)
map-underscore-to-camel-case: true
cache-enabled: false
当然还可以Java Configuration配置:
@Configuration
@MapperScan("com.lin.mapper*")
public class MybatisPlusConfig {
/**
* mybatis-plus SQL执行效率插件【生产环境可以关闭】
*/
@Bean
public PerformanceInterceptor performanceInterceptor() {
return new PerformanceInterceptor();
}
@Bean
public MetaObjectHandler metaObjectHandler(){
return new MyMetaObjectHandler();
}
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
/**
* 注入sql注入器
*/
@Bean
public ISqlInjector sqlInjector(){
return new LogicSqlInjector();
}
}
entity层就不说了,直接dao层,继承官方的BaseMapper接口,里面已经帮我们写好了很多CRUD方法,同时可以自定义方法:
public interface UserMapper extends BaseMapper<User> {
int deleteAll();
@SqlParser(filter = true)
@Select("select id , name, age from user")
List<User> selectListBySQL();
List<User> selectUserList(Pagination page);
}
相对应的mapper.xml:
<mapper namespace="com.lin.mapper.UserMapper">
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id , name, age
</sql>
<delete id="deleteAll">
DELETE FROM USER
</delete>
<select id="selectUserList" resultType="com.lin.entity.User">
SELECT * FROM user
</select>
</mapper>
Service层:
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Override
public boolean deleteAll() {
return retBool(baseMapper.deleteAll());
}
@Override
public List<User> selectListBySQL() {
return baseMapper.selectListBySQL();
}
public Page<User> selectUserPage(Page<User> page) {
// 不进行 count sql 优化,解决 MP 无法自动优化 SQL 问题
// page.setOptimizeCountSql(false);
// 不查询总记录数
// page.setSearchCount(false);
return page.setRecords(baseMapper.selectUserList(page));
}
}
Controller层:
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 分页 PAGE
*/
@GetMapping("/test")
public Page<User> test() {
return userService.selectPage(new Page<User>(0, 3));
}
@GetMapping("/test1")
public Boolean test1() {
return userService.deleteAll();
}
/**
* 增删改查 CRUD
*/
@GetMapping("/test2")
public User test2() {
User user = new User();
user.setId(1);
user.setName("jack");
user.setAge(16);
boolean result = userService.insert(user);
int id = user.getId();
System.err.println("插入一条数据:" + result + ", 插入信息:" + user.toString());
System.err.println("查询:" + userService.selectById(id).toString());
System.err.println("更新一条数据:" + userService.updateById(new User(1, "alice", 18)));
for (int i = 0; i < 5; ++i) {
userService.insert(new User( "jack" + i, 1));
}
Page<User> userListPage = userService.selectPage(new Page<User>(1, 3));
System.err.println("total=" + userListPage.getTotal() + ", current list size=" + userListPage.getRecords().size());
return userService.selectById(1);
}
@GetMapping("/test3")
public User test3() {
User user = new User(1, "jason", 16);
System.out.println("插入前:" + user.toString());
userService.insertOrUpdate(user);
user = userService.selectById(1);
System.out.println("更新后:" + user.toString());
return user;
}
/**
* 测试实体注解注入条件 LIKE 查询
*/
@GetMapping("/like")
public Object like() {
JSONObject result = new JSONObject();
User user = new User();
user.setName("j");
result.put("result", userService.selectList(new EntityWrapper<User>(user)));
return result;
}
@GetMapping("/add")
public Object addUser() {
User user = new User("xiaomi", 1);
JSONObject result = new JSONObject();
result.put("result", userService.insert(user));
return result;
}
@GetMapping("/selectsql")
public Object getUserBySql() {
JSONObject result = new JSONObject();
result.put("records", userService.selectListBySQL());
return result;
}
/**
* 7、分页 size 一页显示数量 current 当前页码
* 方式一:http://localhost:8080/user/page?size=1¤t=1<br>
* 方式二:http://localhost:8080/user/pagehelper?size=1¤t=1<br>
*/
// 参数模式分页
@GetMapping("/page")
public Object page(Page page) {
return userService.selectPage(page);
}
@GetMapping("/pages")
public Object selectUserPage(Page<User> page){
return userService.selectUserPage(page);
}
// ThreadLocal 模式分页
@GetMapping("/pagehelper")
public Object pagehelper(Page page) {
PageHelper.setPagination(page);
page.setRecords(userService.selectList(null));
page.setTotal(PageHelper.freeTotal());//获取总数并释放资源 也可以 PageHelper.getTotal()
return page;
}
}