MybatisPlus快速上手
pom依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- lombok 简化set get toString -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<scope>test</scope>
</dependency>
<!-- 适配 IntelliJ IDEA版本和junit版本-->
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
数据库
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT 'id',
`name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',
`password` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码',
`email` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '邮箱',
`age` tinyint(0) DEFAULT NULL COMMENT '年龄',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 19 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
结构
基本配置
yml配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/iot?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: bcy123
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
实体类
package mpTest.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String name;
private String password;
private String email;
private Integer age;
}
启动类
package mpTest;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("mpTest.mapper")
public class StartApplication {
public static void main(String[] args) {
SpringApplication.run(StartApplication.class, args);
}
}
接口
package mpTest.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import mpTest.entity.User;
import org.springframework.stereotype.Repository;
//在对应的Mapper 接口上 基础基本的 BaseMapper<T> T是对应的pojo类
@Repository //告诉容器你是持久层的 @Repository是spring提供的注释,能够将该类注册成Bean
public interface UserMapper extends BaseMapper<User> {
//所有的crud都编写完成了
}
测试查询
查询全部
@Test
public void testSelectList() {
System.out.println(("----- selectAll method test 测试查询所有用户方法 ------"));
//selectList 的参数wrapper 是条件构造器,可以先写null
List<User> userList = userMapper.selectList(null);
//forEach 的参数是 Consumer类型的 语法糖
System.out.println("----------test--------------");
userList.forEach(System.out::println);
}
分页查询
- 配置类
package mpTest.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
//@MapperScan("**.mapper") //官方文档说要加MapperScan
//主要是扫描到mapper包下的接口交给spring管理,我这里在启动类上添加过了,这里就不加了
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());//创建乐观锁拦截器 OptimisticLockerInnerInterceptor
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); //插件分页拦截器,我的是mysql
return mybatisPlusInterceptor;
}
}
- 测试类
//测试分页查询
@Test
public void testPage() {
Page<User> page = new Page<>(1,5); //开启拦截器后,会注册一个page对象 当前页,每页条数
//方法源码: <P extends IPage<T>> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
userMapper.selectPage(page,null); //分页查询
page.getRecords().forEach(System.out::println); //获取分页后的数据 打印
System.out.println(page.getTotal()); //获取记录总数
}
测试插入
@Test
public void testInsert() {
User user = new User();
user.setAge(12);
user.setName("说");
user.setPassword("78797777878a");
System.out.println("----------test--------------");
int result = userMapper.insert(user);
System.out.println("result = " + result);
System.out.println("user = " + user);
}
测试更新
更新
//更新测试
@Test
public void testUpdateByID() {
User user = new User();
user.setId(18L);
user.setName("小小");
user.setAge(18);//这一行后加
int i = userMapper.updateById(user);//受影响的行数,参数是一个user不是id,点击看源码
System.out.println("i = " + i);
}
自动更新时间
1、 通过注解
//字段添加填充内容
@TableField(fill = FieldFill.INSERT ,value = "create_time")
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE ,value = "update_time")
private LocalDateTime updateTime;
2、 编写处理器来处理这个注解
@Slf4j //日志
@Component//以组件的形式把这个处理器注册到IOC容器中
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入时启动 第三个参数 LocalDateTime 一定要和 createTime成员变量的值的类型一致,不然是null 如果是date就都设置date
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐)
}
//更新时候启动
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐)
}
}
测试删除
//删除测试
@Test
public void testDeleteById(){
userMapper.deleteById(1525072816282255362L);
// userMapper.delete(null); //全部删除
}
QueryWrapper
条件查询
@Test
public void contextLoads() {
//----------查询多个
//查询一个复杂的,比如查询用户name、邮箱不为空,年龄大于20的用户
QueryWrapper<User> wrapper = new QueryWrapper<>(); //首先新建一个 QueryWrapper
//链式编程 添加查询条件
wrapper.isNotNull("name")
.like("email","%@163.com")
.ge("age",12);
userMapper.selectList(wrapper).forEach(System.out::println);
//----------查询单个
wrapper.isNull("password");
User user = userMapper.selectOne(wrapper); //出现多个结果会报错,查询一个
System.out.println("user = " + user);
}
模糊删除
@Test
public void test3() {
//模糊查询
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("name",9) // 名字中 存在 99
.notLike("name",6) // 名字中 不存在 6
.likeRight("email","s") // 邮箱 最左边是2 2%
.likeLeft("email","m"); // 邮箱 最右边是m %m
List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
maps.forEach(System.out::println);
}