测试所需的数据库
CREATE TABLE user
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');
1.添加Maven的mybatis-plus依赖
<!--mybatis-plus start-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.2</version>
</dependency>
<!--mybatis-plus end-->
注意:引入 MyBatis-Plus 之后请不要再次引入 MyBatis 以及 MyBatis-Spring,以避免因版本差异导致的问题。
2.在 Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹
Spring在扫描注解时,取消了扫描抽象类和接口,所以无法找到你用@reponsitory注解的dao接口,虽然在引用时看似可以注入,但是实际上不可以使用,并没有作为bean交给spring,所以必须使用@Mapper去注解,将Dao交给spring,并且在编译时会为其创建实现类。但是如果每一给mapper都添加@mapper注解会很麻烦,这时可以使用@MapperScan注解来扫描包。
package com.sun.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("com.sun.demo.mapper") //设置mapper接口的扫描包
@SpringBootApplication
public class MybatisPlusApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusApplication.class, args);
}
}
3.对应User实体类 User.java
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
@Data注解会给此类默认提供Getter,Setter,equals,hashCode,toString方法
4.编写Mapper类 UserMapper.java
public interface UserMapper extends BaseMapper<User> {
}
测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootmybatisplusApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void testSelect() {
System.out.println(("----- selectAll method test ------"));
List<User> userList = userMapper.selectList(null);
Assert.assertEquals(5, userList.size());
userList.forEach(System.out::println);
}
}
这只是最简单的配置,当mapper接口继承BaseMapper时,就会有了mybatis-plus最有用,最强大的Mapper CRUD 接口,大部分增删改查都可以利用此接口里方法完成
CRUD 接口参考:https://mp.baomidou.com/guide/crud-interface.html#mapper-crud-%E6%8E%A5%E5%8F%A3
测试结果
----- selectAll method test ------
User(id=1, name=Jone, age=18, email=test1@baomidou.com)
User(id=2, name=Jack, age=20, email=test2@baomidou.com)
User(id=3, name=Tom, age=28, email=test3@baomidou.com)
User(id=4, name=Sandy, age=21, email=test4@baomidou.com)
User(id=5, name=Billie, age=24, email=test5@baomidou.com)
5.编写对应的UserMapper,xml
现在我们在/src/main/resources/mapper下写对应的mapper.xml,来实现自己自定义的sql操作,不然只能使用Mapper CRUD 接口的内容
<?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.sun.demo.mapper.UserMapper">
</mapper>
这是最简单的,但是也挺够用的
下面谈一下mybatis-plus的插件
分页插件
1.在 Spring Boot 启动类中添加分页插件的bean
package com.sun.demo;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@MapperScan("com.sun.demo.mapper") //设置mapper接口的扫描包
@SpringBootApplication
public class MybatisPlusApplication {
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
public static void main(String[] args) {
SpringApplication.run(MybatisPlusApplication.class, args);
}
}
测试类中添加测试方法
//分页查询
@Test
public void testselectPage() {
Page<User> page = new Page<>(1, 2);
IPage<User> userIPage = this.userMapper.selectPage(page, null);
System.out.println("总条数 ------> " + userIPage.getTotal());
System.out.println("当前页数 ------> " + userIPage.getCurrent());
System.out.println("当前每页显示数 ------> " + userIPage.getSize());
List<User> records = userIPage.getRecords();
for (User user : records) {
System.out.println(user);
}
}
执行结果
总条数 ------> 85
当前页数 ------> 1
当前每页显示数 ------> 2
User(id=1, name=Jone, age=18, email=test1@baomidou.com)
User(id=2, name=Jack, age=20, email=test2@baomidou.com)
逻辑删除
就是删除不是真的从数据库删除,而是更改记录的某个字段来实现逻辑删除,比如deleted字段的0就是未删除,1就是删除
在配置文件application.properties中添加
#使用mp自带方法删除和查找都会附带逻辑删除功能 (自己写的xml不会)
# 逻辑已删除值(默认为 1),逻辑未删除值(默认为 0),也可以设置自己的标准,比如true和false
mybatis-plus.global-config.db-config.logic-delete-value: 1
mybatis-plus.global-config.logic-not-delete-value: 0
在数据库添加deleted列,项目中user中添加字段deleted,表示逻辑删除,并且添加@TableLogic注解来表示此字段为逻辑删除字段
@TableLogic
private Integer deleted;
测试类中添加测试方法
//删除数据
@Test
public void testDelete(){
this.userMapper.deleteById(1L);
System.out.println("删除成功!");
}
测试结果
删除成功!
进入数据库,查看id为1的记录,发现没有删除,而是此记录的deleted字段已经修改为1了,实现了逻辑删除
执行 SQL 分析打印
该功能依赖 p6spy 组件,完美的输出打印 SQL 及执行时长 3.1.0 以上版本
1.Maven:
<!--p6spy start-->
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.8.3</version>
</dependency>
<!--p6spy end-->
2.修改application.properties
将之前的mysql的驱动和URL改为p6spy 提供的驱动类和格式
# mysql
spring.datasource.url: jdbc:p6spy:mysql://localhost:3306/mybatisplus?autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
spring.datasource.driver-class-name: com.p6spy.engine.spy.P6SpyDriver
#spring.datasource.url: jdbc:mysql://localhost:3306/mybatisplus?autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
#spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver
spring.datasource.username: root
spring.datasource.password: 123456
3.添加spy.properties 配置
就添加到/src/main/resources下,和application.properties同一等级
module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 设置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前缀
useprefix=true
# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,batch,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动可多个
#driverlist=org.h2.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2
logMessageFormat和appender不要动,就保持这个,我之前以为com.baomidou.mybatisplus是别人的项目结构,就改为了自己的com.sun.demo,后面发现是固定的
在测试类中执行测试方法
//条件查询,这里是无条件
@Test
public void testSelect() {
System.out.println(("----- selectAll method test ------"));
List<User> userList = userMapper.selectList(null);
for (User user : userList) {
System.out.println(user);
}
}
测试结果
----- selectAll method test ------
Consume Time:10 ms 2019-07-24 20:26:08
Execute SQL:SELECT ID,name,age,email,deleted FROM user WHERE deleted=0
User(id=1, name=Jone, age=18, email=test1@baomidou.com, deleted=0)
User(id=2, name=Jack, age=20, email=test2@baomidou.com, deleted=0)
User(id=3, name=Tom, age=28, email=test3@baomidou.com, deleted=0)
User(id=4, name=Sandy, age=21, email=test4@baomidou.com, deleted=0)
User(id=5, name=Billie, age=24, email=test5@baomidou.com, deleted=0)
输出了sql语句,时间,还有耗时,很不错
<--完-->
网友评论