Springboot集成Mybatis Plus插件
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
Mybatis-Plus
是Mybatis
的增强工具包,其简化了CRUD
操作,提供了代码生成器
,强大的条件构造器
,同时内置了多个实用插件:标配的分页
插件、性能分析
插件、全局拦截
插件等。使得开发过程中,基本的范式代码都一句话解决了,省去了很多重复的操作。
1、引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zj</groupId>
<artifactId>demo-mybatis-plus</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo-mybatis-plus</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0-gamma</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
注意:mybatis-plus 自动的维护了mybatis以及mybatis-spring的依赖,在springboot中这三者不能同时的出现,避免版本的冲突
2、修改配置文件application.yml
server:
port: 8080
#spring
spring:
#mysql
datasource:
url: jdbc:mysql://127.0.0.1:3306/springboot_study?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8
username: root
password: 123456
# devtools:
# restart:
# enabled: true #这里是为了热部署的,与mybatis是无关的
mybatis-plus:
#mybatis
#Mapper路径
# 如果是放在src/main/java目录下 classpath:/com/yourpackage/*/mapper/*Mapper.xml
# 如果是放在resource目录 classpath:/mapper/*Mapper.xml
mapper-locations: classpath:/mapper/*Mapper.xml
#实体,枚举类扫描,多个package用逗号或者分号分隔
type-aliases-package: com.zj.springboot.demomybatisplus.model
# type-enums-package: com.zj.springboot.demomybatisplus.entity.enums
global-config:
db-config:
# #主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
# id-type: id_worker
# #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
# field-strategy: not_empty
# #驼峰下划线转换
# column-underline: true
# #数据库大写下划线转换
# #capital-mode: true
# #逻辑删除配置
# logic-delete-value: Y
# logic-not-delete-value: N
#数据库类型。支持主流的数据库
db-type: mysql
#刷新mapper 调试神器
refresh: true
# sql-injector: com.baomidou.mybatisplus.extension.injector.LogicSqlInjector
#自定义填充策略接口实现
#meta-object-handler: com.baomidou.springboot.xxx
#自定义SQL注入器
#sql-injector: com.baomidou.springboot.xxx
configuration:
#数据库字段与数据对象字段的映射策略
map-underscore-to-camel-case: true
cache-enabled: false
注意:mapper 路径
我这里数据库的表是手动建的,所以主键类型之类的可以注释掉,不用
还要开启dao的扫描,在spring boot项目中添加mybatis的包扫描路径,这里有许多种方法,这里提供一种方法:
在启动类中加注解
@SpringBootApplication
@MapperScan("com.zj.demomybatisplus.mapper")
public class DemoMybatisPlusApplication {
public static void main(String[] args) {
SpringApplication.run(DemoMybatisPlusApplication.class, args);
}
}
注意:mapper 路径
3、mybatis plus配置类
配置mybatis plus自带的分页、逻辑删除、sql性能分析插件功能、测试公共字段自动填充功能、乐观锁
/**
* MyBaits Plus 配置类
*/
@EnableTransactionManagement
@Configuration
@MapperScan("com.zj.demomybatisplus.mapper*")
public class MyBatisPlusConfig {
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
/**
* sql注入器 逻辑删除插件
* @return
*/
@Bean
public ISqlInjector iSqlInjector(){
return new LogicSqlInjector();
}
/**
* sql性能分析插件,输出sql语句及所需时间
* @return
*/
@Bean
@Profile({"dev","test"})// 设置 dev test 环境开启
public PerformanceInterceptor performanceInterceptor() {
return new PerformanceInterceptor();
}
/**
* 乐观锁插件
* @return
*/
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
}
4、建表:
这里简单地以user举个例子
SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
INSERT INTO `user` VALUES ('1', 'aaa', '18');
INSERT INTO `user` VALUES ('2', 'bbb', '18');
INSERT INTO `user` VALUES ('3', 'ccc', '20');
INSERT INTO `user` VALUES ('4', 'ddd', '24');
INSERT INTO `user` VALUES ('5', '111', null);
5、构建项目结构
项目目录结构:
User实体类:
/**
* @Auther: zj
* @Date: 2019/3/24 11:39
* @Description:
*/
//@TableName(“tb_student”)
public class User extends Model {
private Integer id;
private String username;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() { //重写toString() 方法,便于打印消息
return String.format( "User[id=%d, username='%s', age=%d]",
id, username, age );
}
@Override
protected Serializable pkVal() {
return this.id;
}
}
一些常用的注解:
@TableName(“tb_student”),它是指与数据库的关联,意味着表对应的数据库的表名是tb_student.
@TableFile(exist=false),表示Student类中有的属性,而对应的属性在表中没有这样的一个字段
注意:mybatis-plus只把id作为主键字段,非id的字段,需要用@TableId来标注。pkVal() 是用来支持组合主键的,现在版本的mybatis-plus不支持组合主键
UserMapper
public interface UserMapper extends BaseMapper<User> {
User findOneByUsername(String username);
}
mapper接口。 接口可以使用@Select等标注原生的sql,也可以使用mapper.xml 实现数据库操作。
自定义的mapper需要从BaseMapper中继承其定义的方法。BaseMapper中已经定义了很多类似JPA的自定义函数(增删改查),方便开发使用;
UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zj.demomybatisplus.mapper.UserMapper">
<select id="findOneByUsername" resultType="com.zj.demomybatisplus.model.User">
SELECT
*
FROM user
WHERE `username` = #{username}
</select>
</mapper>
实现UserMapper中自定义方法的具体实现操作
UserService
public interface UserService extends IService<User> {
User selectOneByUsername(String username);
}
需要继承IService接口。IService接口中定义了很多方便使用的函数(主要是与mapper对应的函数):
UserServiceImpl
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService{
@Autowired
UserMapper userMapper;//这边报红,没事
@Override
public User selectOneByUsername(String username) {
return userMapper.findOneByUsername( username );
}
}
实现类也就要继承ServiceImpl,来对IService中的函数提供实现
UserController:
@RestController
public class UserController {
@Autowired
UserService userService;
@GetMapping("/test")
public void test() {
System.out.println( userService.selectById( "1" ));
}
@GetMapping("/test1")
public Object test1(@RequestParam("username") String username) {
return userService.selectOneByUsername( username );
}
@GetMapping("/test2")
public Object test2(@RequestParam("current") Integer current) {
IPage<User> iPage =userService.selectPage( new Page<User>(current,3),new QueryWrapper<>( ));
return iPage.getRecords();
}
}
测试:
1、baseMapper自带的方法
2、自定义查询方法
3、分页查询
到这来,mybatis-plus就简单的讲到这了。它除了分页插件,还有代码生成器等其他有意思的插件,大家感兴趣可以去看看
参考:https://mp.baomidou.com/guide/quick-start.html#%E5%88%9D%E5%A7%8B%E5%8C%96%E5%B7%A5%E7%A8%8B