目录
1.1在User表中添加datetime类型的新的字段 create_time、update_time
2.4通过MybatisPlusConfig 配置类往容器中放入组件
4.3元对象处理器接口添加deleted的insert默认值
一、创建并初始化数据库
1、创建数据库:
create database if not exists mybatis_plus;2、创建 User 表
use mybatis_plus;
CREATE TABLE user
(
id InT(11) primary key auto_increment COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(30) NULL DEFAULT NULL COMMENT '邮箱',
);3、插入数据
DELETE FROM user;
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');二、创建SpringBoot项目
1、引入依赖
<dependencies>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--开发者工具-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!--lombok用来简化实体类-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</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>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>2、添加application.yml配置文件
spring:
datasource:
url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&serverTimezone=UTC
username: root #数据库账号
password: 1234 #数据库密码
driver-class-name: com.mysql.cj.jdbc.Driver #mysql8.0使用cj包下的
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #mybatis日志输出3、创建实体类User
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}4、创建UserMapper
@Repository
public interface UserMapper extends BaseMapper<User> {
}5、在主启动类上添加@MapperScan
@MapperScan("chang.mapper")//放在配置类上作用也一样6、在测试类中测试功能
@Autowired
private UserMapper userMapper;
@Test
public void testSelectList() {
//UserMapper 中的 selectList() 方法的参数为 MP 内置的条件封装器 Wrapper
//所以不填写就是无任何条件
List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);
}
@Test//测试添加
public void testInsert(){
User user = new User();
user.setName("chang");
user.setAge(222);
user.setEmail("74194741@qq.com");
int result = userMapper.insert(user);
System.out.println(result); //影响的行数
System.out.println(user); //id自动回填
}
@Test//测试更新
public void testUpdateById(){
User user = new User();
user.setId(1L);
user.setAge(18);
int result = userMapper.updateById(user);
System.out.println(result);
System.out.println(user);
}三、更新表的各个操作
1、自动填充
1.1在User表中添加datetime类型的新的字段 create_time、update_time
1.2实体上添加注解
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;1.3元对象处理器接口添加初始操作
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component //实现元对象处理器接口
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
// private static final Logger LOGGER = LoggerFactory.getLogger(MyMetaObjectHandler.class);
//使用mp(mybatisplus)实现添加操作,这个方法执行
@Override
public void insertFill(MetaObject metaObject) {
// LOGGER.info("start insert fill ....");
log.info("start insert fill ....");
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
this.setFieldValByName("version", 1, metaObject);
this.setFieldValByName("deleted", 0, metaObject);
}
//使用mp(mybatisplus)实现更新操作,这个方法执行
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
// LOGGER.info("start update fill ....");
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
2.乐观锁(添加版本号,先比对版本号,修改之后版本号+1)
用于主键生成策略
2.1数据库中添加version字段
ALTER TABLE `user` ADD COLUMN `version` INT(11);2.2实体类添加version字段
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;2.3元对象处理器接口添加version的insert默认值
@Override
public void insertFill(MetaObject metaObject) {
......
this.setFieldValByName("version", 1, metaObject);//设置乐观锁的默认值
}2.4通过MybatisPlusConfig 配置类往容器中放入组件
@Bean//高版本中为OptimisticLockerInnerInterceptor
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}2.5测试乐观锁
//测试乐观锁
@Test
public void testOptimisticLocker(){
//先查询数据
User user = userMapper.selectById(8L);
//修改数据
user.setAge(99);
userMapper.updateById(user);
}//修改之后版本号由1变为了23 、分页功能
3.1通过配置类放入组件
//分页插件 高版本不用配置
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}3.2测试分页
@Test//测试分页功能
public void testSelectPage(){
//创建Page对象,两个参数分别代表 当前页和每页显示记录数
Page<User> page = new Page<>(1, 3);
userMapper.selectPage(page , null);
page.getRecords().forEach(System.out::println);
System.out.println(page.getCurrent());//当前页
System.out.println(page.getRecords());//每页数据List集合
System.out.println(page.getPages());//总页数
System.out.println(page.getSize());//每页显示记录数
System.out.println(page.getTotal());//总数量
System.out.println(page.hasNext());//是否有下一页
System.out.println(page.hasPrevious());//是否有上一页
}4逻辑删除
物理删除:从数据库中直接删除数据
逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录
4.1数据库中添加 deleted字段
ALTER TABLE `user` ADD COLUMN `deleted` boolean4.2实体类添加deleted 字段
@TableLogic
@TableField(fill = FieldFill.INSERT)
private Integer deleted;4.3元对象处理器接口添加deleted的insert默认值
@Override
public void insertFill(MetaObject metaObject) {
......
this.setFieldValByName("deleted", 0, metaObject);
}4.4通过配置类添加组件
//逻辑删除插件(假删除) 高版本不用配置
@Bean
public ISqlInjector sqlInjector(){
return new LogicSqlInjector();
}4.5测试逻辑删除
//测试 逻辑删除
@Test
public void testLogicDelete() {
int result = userMapper.deleteById(1L);
System.out.println(result);
}//执行完成后,再查询所有信息,此条信息不存在四.代码生成器
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.Test;
public class CodeGenerator {
@Test
public void run() {
// 1、创建代码生成器
AutoGenerator mpg = new AutoGenerator();
// 2、全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir("D:\\IDEAworkspace\\guli_parent\\service\\service-edu" + "/src/main/java");
gc.setAuthor("chang");
gc.setOpen(false); //生成后是否打开资源管理器
gc.setFileOverride(false); //重新生成时文件是否覆盖
gc.setServiceName("%sService"); //去掉Service接口的首字母I
gc.setIdType(IdType.ID_WORKER_STR); //主键策略
gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型
gc.setSwagger2(true);//开启Swagger2模式
mpg.setGlobalConfig(gc);
// 3、数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/guli?useSSL=false&serverTimezone=GMT%2B8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("1234");
dsc.setDbType(DbType.MYSQL);
mpg.setDataSource(dsc);
// 4、包配置
PackageConfig pc = new PackageConfig();
pc.setParent("com.chang"); //最外围包名
pc.setModuleName("edu"); //模块名
pc.setController("controller");
pc.setEntity("entity");
pc.setService("service");
pc.setMapper("mapper");
mpg.setPackageInfo(pc);
// 5、策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude("edu_comment");//数据库中的表名
strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略
strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀
strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略
strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作
strategy.setRestControllerStyle(true); //restful api风格控制器
strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符
mpg.setStrategy(strategy);
// 6、执行
mpg.execute();
}
}
版权声明:本文为m0_51505198原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。