SpringBoot整合Mybatis-plus[超详细版]
SpringBoot整合Mybatis-plus[超详细版]Mybatis-Plus(简称MP)是一个Mybatis的增强工具,只是在Mybatis的基础上做了增强却不做改变,MyBatis-Plus支持所有Mybatis原生的特性,所以引入Mybatis-Plus不会对现有的Mybatis构架产生任何影响。MyBatis 增强工具包,简化 CRUD 操作。启动加载 XML 配置时注入单表 SQL
目录
二、SpringBoot与Mybatis-plus整合之入门demo
一简介
1、什么是Mybatis-plus
Mybatis-Plus(简称MP)是一个Mybatis的增强工具,只是在Mybatis的基础上做了增强却不做改变,MyBatis-Plus支持所有Mybatis原生的特性,所以引入Mybatis-Plus不会对现有的Mybatis构架产生任何影响。MyBatis 增强工具包,简化 CRUD 操作。启动加载 XML 配置时注入单表 SQL 操作 ,为简化开发工作、提高生产率而生。
2、特性
- 无侵入: 只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小: 启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
- 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
- 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
- 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
- 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
- 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
- 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
- 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
- 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
- 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
二、SpringBoot与Mybatis-plus整合之入门demo
依赖>配置>代码
1、引入pom
<!-- 引入mybatisPlus 包含了 jdbc -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!-- mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 引入durid數據源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.18</version>
</dependency>
2、application.yml配置
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #日志
map-underscore-to-camel-case: true #开启驼峰命名
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
username: 自己的用户名
password: 自己的密码
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost/cardmanager
3、主启动类
@SpringBootApplication
//注意:扫描包路径必须要精确到Mapper包,否则报异常
@MapperScan(basePackages = "扫描自己的mapper路径")
public class SpringBootThree {
public static void main(String[] args) {
SpringApplication.run(SpringBootThree.class,args);
}
}
4、测试
entity层
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private String password;
private String username;
public User() {
}
public User(Long id, String name, String password, String username) {
this.id = id;
this.name = name;
this.password = password;
this.username = username;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
", username='" + username + '\'' +
'}';
}
}
Mapper层
BaseMapper<T>是mybatis-plus设计的一个接口,里面包含了单表的CRUD,用起来非常方便.
<T>表示实体类
@Repository
public interface UserMapper extends BaseMapper<User>{
}
Service和ServiceImpl层
IService<T>和ServiceIMpl<M extends BaseMapper<T>,T> 是对BaseMapper的进一步封装,一般很少用。但是很方便。
public interface UserService extends IService<User>{
}
//impl层
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Autowired
UserMapper userMapper;
}
controller测试
@Controller
public class UserController {
@Autowired
UserService userService;
@RequestMapping("/test")
public String TestUser(@RequestParam("id") Long id){
User user = userService.getById(id);
System.out.print(user)
}
}
好!到上述是一个SpringBoot整合Myabtisplus的入门小案例。接下来才是主要的部分
三、Mybatis-plus核心注解
@TableName
- 描述:表名注解,标识实体类对应的表
- 使用位置:实体类
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private String password;
private String username;
}
属性 | 描述 |
value | 表名 |
keepGlobalPrefix | 是否保持使用全局的 tablePrefix 的值(当全局 tablePrefix 生效时) |
resultMap | xml 中 resultMap 的 id(用于满足特定类型的实体类对象绑定) |
以上的属性,只有value比较常用,其他的看看就行
@TableId
- 描述:主键注解
- 使用位置:实体类主键字段
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private String password;
private String username;
}
属性 | 默认值 | 描述 |
value | "" | 主键字段名 |
type | IdType.NONE | 制定主键类型 |
IdType
一般都是数据库自增,或者就是自己设置主键id
值 | 描述 |
AUTO | 数据库 ID 自增 |
NONE | 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT) |
ASSIGN_ID | 分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator 的方法nextId (默认实现类为DefaultIdentifierGenerator 雪花算法) |
ASSIGN_UUID | 分配 UUID,主键类型为 String(since 3.3.0),使用接口IdentifierGenerator 的方法nextUUID (默认 default 方法) |
@TableField
- 描述:字段注解(非主键)
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
@TableField("t_name")
private String name;
@TableField("t_pwd")
private String password;
@TableField("t_username")
private String username;
//表示是否为数据库字段,在进行mybatis-plus封装的CRUD时,不会携带这个字段进行数据库的查询
@TableField(exist=false)
//自定义类型
private Dept dept;
}
属性 | 默认值 | 描述 |
value | "" | 数据库字段名 |
exist | true | 是否为数据库表字段 |
condition | "" | 字段 where 实体查询比较条件,有值设置则按设置的值为准,没有则为默认全局的 %s=#{%s} |
update | "" | 字段 update set 部分注入,例如:当在version字段上注解update="%s+1" 表示更新时会 set version=version+1 (该属性优先级高于 el 属性) |
上述表格中,只有前两个最常用,其他的看看就行,一般不用
@KeySequence
- 描述:序列主键策略
oracle
- 属性:value、dbType
属性 | 默认值 | 描述 |
value | "" | 序列名 |
dbType | DbType | 数据库类型,未配置默认使用注入 IKeyGenerator 实现,多个实现必须指定 |
好了,上述就是最常用的注解,如果想看更多前往官网地址:注解 | MyBatis-Plus (baomidou.com)
四、Mybatis-Plus之分页插件
1、config配置
使用mybatis-plus的分页时,必须配置config,否者分页插件不生效
@Configuration
public class MyBaitsPlusConfig {
//配置分页插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//数据库类型是MySql,因此参数填写DbType.MYSQL
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
2、 分页的使用
2.1、mybaits-plus自带的分页查询
@Service
public class UserServiceImpl extends UserImpl<UserMapper,User> implements UserService {
@Autowired
UserMapper userMapper;
@Override
public Page<User> memberList(Integer pageNum, User user) {
/**
在查询之前实例化Page<T>(当前页,每页显示的个数)
page实体类创建完成之后,会将你查询出来的结果封装到里边的records属性中
使用getRecords()方法调用
*/
Page<User> page = new Page<>(pageNum,5);
//mybatis-plus自带的单表分页查询
/**
selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper)
参数1:一个分页对象
参数2:表示分页查询的条件,如果没有可以为null
*/
userMapper.selectPage(page, null);
/**-------带条件的分页查询-----
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
queryWrapper.eq("数据库字段名称",对应传过来的实体类字段名称) //精准查询
//模糊查询
.like("数据库字段名称",对应传过来的实体类字段名称);
userMapper.selectPage(page, queryWrapper);
*/
return page;
}
}
2.2、自定义分页
自定义分页的时候就涉及到了连表的查询,这个时候我们就要自己自定义分页!
2.2.1、自定义mapper接口
@Repository
public interface UserMapper extends BaseMapper<User> {
//注意分页参数的分页,一定要在第一个参数
Page<User> userList(IPage<User> page, @Param("user")User user);
}
//对应的xml文件自己写
2.2.2、service实现自定义分页
@Service
public class UserServiceImpl extends UserImpl<UserMapper,User> implements UserService {
@Autowired
UserMapper userMapper;
@Override
public Page<User> memberList(Integer pageNum, User user) {
/**
在查询之前实例化Page<T>(当前页,每页显示的个数)
page实体类创建完成之后,会将你查询出来的结果封装到里边的records属性中
使用getRecords()方法调用
*/
Page<User> page = new Page<>(pageNum,5);
memberBrMapper.memberList(page, user);
return page;
}
}
五、Mybatis-plus逆向工程
#联合mybatisplus使用
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
public class FastAutoGeneratorTest {
public static void main(String[] args){
FastAutoGenerator.create("jdbc:mysql://localhost:3306/自己的表名", 用户名, 密码)
.globalConfig(builder -> {
builder.author("wdc") // 设置作者
// .enableSwagger() // 开启 swagger 模式
.fileOverride() // 覆盖已生成文件
.outputDir("D://springbootcards"); // 指定输出目录
})
.packageConfig(builder -> {
builder.parent("com.atdession") // 设置父包名
.moduleName("springbootcards") // 设置父包模块名
.entity("entity") //都是设置名称的
.service("service")
.serviceImpl("service.impl")
.controller("controller")
.mapper("mapper")
.xml("mapper")
.pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://springbootcards")); // 设置mapperXml生成路径
})
.strategyConfig(builder -> {
builder.addInclude("user","dept"); // 设置需要生成的表名
.serviceBuilder().formatServiceFileName("%sService");//设置去掉Service的前缀I
// .addTablePrefix("t_", "c_"); // 设置过滤表前缀
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
.execute();
}
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)