文章目录
mybatisPlus项目CRUD步骤
1.pom.xml引入相应的依赖
<?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 https://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.6.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.wyc</groupId>
<artifactId>demo1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo1</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>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
<!--代码生成器 mybatis-plus-generator-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.1</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>
2. 在resources目录下写配置文件
-
数据库连接配置
-
application.properties
#mysql 配置
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/mybatisplus?useSSL=false&useUnicode=true&characterEncoding=UTF-8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#配置日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#配置逻辑删除
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
3. 创建相应的包
各个层的含义
4. 在config里面编写配置
- MybatisPlusConfig
package com.wyc.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.injector.ISqlInjector;
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.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
//扫描我们的mappe文件夹
@MapperScan("com.wyc.mapper")
@EnableTransactionManagement //事务的注解
@Configuration //配置类
public class MyBatisPlusConfig {
//注册乐观锁插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
}
//分页插件
@Bean
public MybatisPlusInterceptor paginationInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
//添加分页
// mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
// return mybatisPlusInterceptor;
//}
}
5. 在handler进行填充配置
- MymetaObjectHandler
package com.wyc.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Slf4j
@Component //一定不要忘记吧处理器加到ioc容器中!
public class MymetaObjectHandler implements MetaObjectHandler {
//插入时的填充策略
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill...");
// default MetaObjectHandler setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
//更新时的填充策略
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill...");
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
6.在pojo层编写实体类
-
User
package com.wyc.pojo; import com.baomidou.mybatisplus.annotation.*; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.util.Date; @Data @AllArgsConstructor @NoArgsConstructor public class User { //主键自增 @TableId(type = IdType.AUTO) private Long id; private String name; private Integer age; private String email; @TableLogic private Integer deleted; //乐观锁注解 @Version private Integer version; //字段自动填充内容 @TableField(fill = FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; }
-
代码生成器配置
-
WycCode
package com.wyc; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.generator.AutoGenerator; import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.config.GlobalConfig; import com.baomidou.mybatisplus.generator.config.OutputFile; import com.baomidou.mybatisplus.generator.config.rules.DateType; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; import com.baomidou.mybatisplus.generator.fill.Column; import com.baomidou.mybatisplus.generator.fill.Property; import java.util.Collections; //代码自动生成器 public class WycCode { public static void main(String[] args) { //代码生成器 FastAutoGenerator.create("jdbc:mysql://localhost:3306/mybatisplus?useSSL=false&useUnicode=true&characterEncoding=UTF-8", "root", "123456") //全局配置 .globalConfig(builder -> { builder.author("super-boom") // 设置作者 .enableSwagger() // 开启 swagger 模式 .fileOverride() // 覆盖已生成文件 .outputDir("D:\\IDEAproject\\mybatisplus\\demo1\\src\\main\\java"); // 指定输出目录 }) //包配置 .packageConfig(builder -> { builder.parent("com.wyc") // 设置父包名 .moduleName("blog") // 设置父包模块名 .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D:\\IDEAproject\\mybatisplus\\demo1\\src\\main\\java\\com\\wyc")); // 设置mapperXml生成路径 }) // 策略配置 .strategyConfig(builder -> { builder.addInclude("t_simple") // 设置需要生成的表名 .addTablePrefix("t_", "c_"); // 设置过滤表前缀 }) .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板 .execute(); } }
7.编写测试类test,进行测试
1. Demo1ApplicationTests
package com.wyc; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.wyc.mapper.UserMapper; import com.wyc.pojo.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.annotation.MergedAnnotationPredicates; import javax.jws.soap.SOAPBinding; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @SpringBootTest class Demo1ApplicationTests { //继承了Basemapper,所有的方法都来自父类,我们也可以自己编写自己的扩展方法 @Autowired private UserMapper userMapper; @Test void contextLoads() { //参数是一个wrapper,条件构造器,这里没有条件,就是null。 //查询所有用户 List <User> users = userMapper.selectList(null); users.forEach(System.out::println); } //测试插入 @Test public void test(){ User user = new User(); user.setAge(88); user.setEmail("1542010896@qq.com"); int result = userMapper.insert(user); System.out.println(result); System.out.println(user); } //测试更新 @Test public void update(){ User user = new User(); user.setAge(88); user.setId(1489769008923234310L); user.setEmail("1542010896@qq.com"); int update = userMapper.updateById(user); System.out.println(update); System.out.println(user); } @Test //测试乐观锁成功! public void testOptimisticLocker(){ //1.查询用户信息 User user = userMapper.selectById(1L); //2.修改用户信息 user.setName("sss"); user.setEmail("134qq.com"); //3.执行更新操作 userMapper.updateById(user); } @Test //测试乐观锁失败! public void testOptimisticLocker2(){ //线程1 User user = userMapper.selectById(1L); user.setName("ss"); user.setEmail("131qq.com"); //模拟另外一个线程执行了插队操作 User user2 = userMapper.selectById(1L); user2.setName("rrr"); user2.setEmail("135qq.com"); userMapper.updateById(user2); userMapper.updateById(user); //如果没有乐观锁,就会覆盖插队线程的值! } @Test //测试单个查询 public void testSelectById(){ User user = userMapper.selectById(1L); System.out.println("--------------------------------------"); System.out.println(user); } @Test //测试批量用户 public void testSelecBatchtById(){ List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3)); System.out.println("--------------------------------------"); System.out.println(users); } @Test //测试条件查询 之一:map 还有warpper public void testSelectBatchtByIds(){ HashMap<String, Object> map = new HashMap<>(); //自定义要查询的条件 map.put("name","rrr"); List<User> users = userMapper.selectByMap(map); System.out.println("--------------------------------------"); System.out.println(users); } @Test //测试分页查询 public void testPage(){ //参数一:当前页 //参数二:页面大小 Page<User> page = new Page<>(2,5); userMapper.selectPage(page,null); page.getRecords().forEach( System.out::println); System.out.println("======================="); System.out.println(page.getTotal()); //获得总页数 } @Test //测试单个删除 public void testDeleteById(){ userMapper.deleteById(4L); } @Test //测试通过id批量删除 public void testDeleteBatchById(){ userMapper.deleteBatchIds(Arrays.asList(3,1489769008923234309L)); } @Test //测试通过map批量删除 public void testDeleteMapById(){ HashMap<String, Object> map = new HashMap<>(); map.put("name","h"); userMapper.deleteByMap(map); } // @Test // //测试逻辑删除 // public void testDeleteBatch(){ // userMapper.deleteBatchIds() // } }
2. Wappertest
package com.wyc; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.wyc.mapper.UserMapper; import com.wyc.pojo.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; import java.util.Map; @SpringBootTest public class Wappertest { @Autowired private UserMapper userMapper; @Test void contextLoads() { //查询name不为空的用户,并且邮箱不为空,年龄大于12 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.isNotNull("name") .isNotNull("email") .ge("age",12); userMapper.selectList(wrapper).forEach(System.out::println); } @Test void test(){ //查询单个名字 用one QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("name","abc"); User user = userMapper.selectOne(wrapper); System.out.println(user); } @Test void test1(){ //查询单个名字 用one QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.between("age",20,30); //区间 Long count = userMapper.selectCount(wrapper); System.out.println(count); } @Test void test2(){ QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.notLike("name","a"); List<Map<String, Object>> maps = userMapper.selectMaps(wrapper); maps.forEach(System.out::println); } @Test void test3(){ QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.orderByDesc("id"); List<User> users = userMapper.selectList(wrapper); System.out.println(users); } }