Mybatis-Plus(一)
最近在项目当中学习到了一种新的构建sql查询的技术—mybatis-plus 相交与之前使用的example即先创建一个example对象 再根据这个对象创建一个criteria对象来说,这种方式更为简洁方便,他为我们提供了基础的增删改查操作,以至于 如若你只是想写增删该查的话,你的mapper.xml文件以及相应的dao service文件当中是一个方法都不用去写的,下面我们就来学习这种简便的构建方法;
首先,Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生
这是它的下小鸟:
下面是它特性的一些介绍:
- 无侵入: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 操作智能分析阻断,预防误操作
下面是官网给出的例子 我们来分析以下:
//假设我们已存在一张 User 表,且已有对应的实体类 User,实现 User 表的 CRUD 操作我们需要做什么呢?
/** User 对应的 Mapper 接口 */
public interface UserMapper extends BaseMapper<User> { }
//如果没有什么特殊的操作,那么这个mapper文件当中是什么都不用写的
基本CRUD
// 初始化 影响行数
int result = 0;
// 初始化 User 对象
User user = new User();
// 插入 User (插入成功会自动回写主键到实体类)
user.setName("Tom");
result = userMapper.insert(user);
// 更新 User,用到的就是刚刚插入的user
user.setAge(18);
result = userMapper.updateById(user);
// 查询 User
User exampleUser = userMapper.selectById(user.getId());
// 查询姓名为‘张三’的所有用户记录
//这里new EntityWrapper<>() 就是用来构建查询条件的
//具体你查询的是哪个类 里面泛型就写那个类
//当然条件的拼接不止有eq还有许多,后面的文章当中会提到
//具体EntityWrapper的用法后面再进行介绍
List<User> userList = userMapper.selectList(
new EntityWrapper<User>().eq("name", "张三")
);
再如以下的例子:
List<User> userList = userMapper.selectPage(
new Page<User>(1, 10),
new EntityWrapper<User>().eq("name", "张三")
.eq("sex", 0)
.between("age", "18", "50")
);
New page就是用来创建分页条件的,相当于的sql就是:
SELECT *
FROM sys_user
WHERE (name='张三' AND sex=0 AND age BETWEEN '18' AND '50')
LIMIT 0,10
// 删除 User
result = userMapper.deleteById(user.getId());
正如上所示:我们仅仅需要的是继承一个BaseMapper即可实现大部分表单的增删改查,极大的减少了开发的负担。
当然我们也可以使用AR模式 即注解指定表明,指定主键名称的形式来进行操作:
下面我们就来说一下他和spring,springBoot的集成:
相对于springBoot来说Spring的集成会复杂一些,但也仅限于去更换一些使用后的包:
Mybatis 自带的MybatisSqlSessionFactoryBean
替换为 MP 自带的即可。
也就是将xml配置文件当中Factory的包替换为下面的包:具体的配置如下
com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean,当然还有相应的包也应该替换;
具体的配置大家可以去官网查看,下面主要说一下springBoot的配置
官网地址:https://baomidou.gitee.io/mybatis-plus-doc/#/install
SprintBoot的集成:
spring boot 项目集成mp可以使用starter
下面是pom文件当中加入的依赖和配置:
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>最新版本号</version>
</dependency>
</dependencies>
<!-- 如果mapper.xml是放在src/main/java目录下,需配置以下-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<filtering>false</filtering>
<includes>
<include>**/mapper/*.xml</include>
</includes>
</resource>
</resources>
</build>
application.yml配置文件:
mybatis-plus:
# 如果是放在src/main/java目录下 classpath:/com/yourpackage/*/mapper/*Mapper.xml
# 如果是放在resource目录 classpath:/mapper/*Mapper.xml
mapper-locations: classpath:/mapper/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.yourpackage.*.entity
global-config:
#主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
id-type: 3
#字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
field-strategy: 2
#驼峰下划线转换
db-column-underline: true
#mp2.3+ 全局表前缀 mp_
#table-prefix: mp_
#刷新mapper 调试神器
#refresh-mapper: true
#数据库大写下划线转换
#capital-mode: true
# Sequence序列接口实现类配置
key-generator: com.baomidou.mybatisplus.incrementer.OracleKeyGenerator
#逻辑删除配置(下面3个配置)
logic-delete-value: 1
logic-not-delete-value: 0
sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
#自定义填充策略接口实现
meta-object-handler: com.baomidou.springboot.MyMetaObjectHandler
configuration:
#配置返回数据库(column下划线命名&&返回java实体是驼峰命名),自动匹配无需as(没开启这个,SQL需要写as: select user_id as userId)
map-underscore-to-camel-case: true
cache-enabled: false
#配置JdbcTypeForNull, oracle数据库必须配置
jdbc-type-for-null: 'null'
启动类Java Configuration配置:
@Configuration
@MapperScan("com.yourpackage.*.mapper*")
public class MybatisPlusConfig {
/*
* 分页插件,自动识别数据库类型
* 多租户,请参考官网【插件扩展】
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
/*
* oracle数据库配置JdbcTypeForNull
* 参考:https://gitee.com/baomidou/mybatisplus-boot-starter/issues/IHS8X
不需要这样配置了,参考 yml:
mybatis-plus:
confuguration
dbc-type-for-null: 'null'
@Bean
public ConfigurationCustomizer configurationCustomizer(){
return new MybatisPlusCustomizers();
}
class MybatisPlusCustomizers implements ConfigurationCustomizer {
@Override
public void customize(org.apache.ibatis.session.Configuration configuration) {
configuration.setJdbcTypeForNull(JdbcType.NULL);
}
}
*/
}
以上就是基本的使用以及与spring,springBoot的集成,下一篇将分析以下它的单个核心特性,代码生成器,条件构造器,以及通用的CRUD.