MyBatis-Plus 官网:https://mp.baomidou.com
与TkMybatis比较
都是对mybatis增强扩展,基本功能都是简化sql配置,集成代码生成器,支持乐观锁、分页、多数据源。
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生,这是官方给的定义。
MyBatis-Plus特性
- 无侵入:基于mybatis只做增强不做改变,不会对现有工程产生影响。
- 损耗小:自动注入基本CURD,性能基本无损耗。
- CRUD:内置通用Mapper、Service,少量配置实现单表CRUD操作。
- 支持 Lambda 形式调用:通过 Lambda 表达式编写各类查询条件。
- 支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多种数据库。
- 支持主键自动生成:支持多种主键策略。
- 支持ActiveRecord模式:实体类只需继承Model类即可。
- 支持关键词自动转义:支持数据库关键词(order、key......)自动转义。
- 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎。
- 内置分页插件:基于MyBatis物理分页。
- 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询。
- 内置全局拦截插件:提供全表delete、 update操作智能分析阻断,也可自定义拦截规则。
- 内置Sql注入剥离器:支持Sql注入剥离,预防Sql注入攻击。
引用mybatis-plus
<!--mybatis plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.1.0</version>
</dependency>
配置注解
指定扫描Mapper存放位置,例如:
@MapperScan("oxingsoft.demo.mapper")
配置分页插件
@Configuration
public class MybatisPlusConfig {
/**
* mybatis-plus分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor page = new PaginationInterceptor();
page.setDialectType("mysql");
return page;
}
}
也可以同时使用pagehelper分页插件,分页查询代码写法不同。
Mapper写法
public interface UserDao extends BaseMapper<UserEntity>{
}
只须继承mybatis-plus提供的基类就自动实现了常用的CRUD方法。
Service写法
public interface UserService extends IService<UserEntity>{
}
Entity写法
@TableName(value = "user")
public class UserEntity {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String userName;
//get/set 略...
}
如果要实现ActiveRecord模式写法,实体类要稍做处理,继承一个Model类并重写pkVal()方法。
Controller写法
/**
* 分页查询
*/
@RequestMapping(value="selectPage")
public Page<UserEntity> selectPage() {
Page<UserEntity> page=userDao.selectPage(new Page<>(1,10), new QueryWrapper<UserEntity>().eq("userName", "张三"));
System.out.println("records:"+page.getRecords());
return page;
}
/**
* 新增用户
*/
@RequestMapping(value="insert")
public String insert() {
UserEntity user=new UserEntity();
user.setUserName("张三");
userDao.insert(user);
return "insert success";
}
/**
* 根据id修改用户
*/
@RequestMapping(value="updateById")
public String updateById(){
UserEntity user=new UserEntity();
user.setUserName("李四");
user.setId(25L);
userDao.updateById(user);
return "update success";
}
/**
* 根据id删除用户
*/
@RequestMapping(value="deleteById")
public String deleteById(Long id){
userDao.deleteById(id);
return "delete success";
}
//还有批量操作方法。。。
这里直接使用dao操作了,也可以通过service操作。
注意事项
- mybatis-plus已经包含了mybatis,不要同时导入mybatis可能造成版本冲突。
- mybatis的返回结果是数值,但是mybatis-plus返回是boolean类型,有点违反原则。
- 实例类非字段属性要特殊处理(@TableField(exist = false)),否则报错。
- 复杂的查询还是要尽量写SQL的,放在xml里配置,兼容mybatis的。