整合mp依赖

mybatis中的mapper.xml文件 如果传进来的参数是0 参数不生效

这时候

<if test=" mystatus !=null and mystatus!='' or mystatus ==0"

></if>

这样子就能接收参数0了


文章目录

目录

文章目录

前言

一、mybatis-plus 是什么?

二、使用步骤

三、使用各种功能

1.分页功能

2.乐观锁功能

 3.逻辑删除功能

4.代码生成器功能

5.配置自动填充功能

总结



前言

mp的配置


一、mybatis-plus 是什么?

mybatis-plus是对mybatis的增强,并且还提供一些很好的插件功能.

二、使用步骤

1.引入依赖

<!--mp依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.0</version>
        </dependency>
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <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>

2.设置配置

#数据源
spring.datasource.password=root
spring.datasource.username=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mp?serverTimezone=Asia/Shanghai

#显示sql语句
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

 3.创建实体类

@Data
 @NoArgsConstructor
 @AllArgsConstructor
 public class User {    private Long id;
     private String name;
     private Integer age;
     private String email;
 }

4.创建dao接口

@Repository
@Mapper
public interface UserDao extends BaseMapper<User> {
}

三、使用各种功能

环境准备在项目里新建config文件夹,创建mp依赖配置类

@EnableTransactionManagement //开启管理
@Configuration // 配置类
public class MyBatisPlusConfig {

 
  
 

}

1.分页功能

在配置类中注入分页功能拦截

@Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

 使用:

//分页查询: 分页没有效果----原因是你没有配置分页拦截器。
     @Test
     public void testFindPage() {        //需要两个参数IPage接口对象   第二个参数 条件对象。
         Page<User> page=new Page<>(1,3);        //把查询的结果封装到page类对象中。---包含很多信息。
         Page<User> page1 = userDao.selectPage(page, null);
         System.out.println("总条数:"+page1.getTotal());
         System.out.println("总页码:"+page1.getPages());
         System.out.println("当前页的记录:"+page1.getRecords());
     }

2.乐观锁功能

乐观锁默认所有操作都是正确的,不去加锁限制,出现错误,要重新执行

乐观锁实现方式:

取出记录时,获取当前 version 更新时,带上这个version 执行更新时,

set version = newVersion where version = oldVersion 如果version不对,就更新失败 

实现:

首先在实体类和数据表里增加version字段

//实体类字段
@Version //乐观锁Version注解
private Integer version;
// 注册乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }

测试

//测试 乐观锁成功
public void test2(){
// 1、查询用户信息
User user = userMapper.selectById(1L);
// 2、修改用户信息
user.setName("老六");
user.setEmail("8984@qq.com");
// 3、执行更新操作
userMapper.updateById(user);

//多线程下会出现失败
public void test3(){
// 线程 1
User user = userMapper.selectById(1L);
user.setName("11");
user.setEmail("12@.com");
// 模拟另外一个线程执行了插队操作
User user2 = userMapper.selectById(1L);
user2.setName("345");
user2.setEmail("345@qq.com");
userMapper.updateById(user2);
// 如果没有乐观锁就会覆盖插队线程的值!
//如何解决,可以用自旋锁来多次尝试提交!
userMapper.updateById(user);

 3.逻辑删除功能

主要应用在管理员可以查看已经删除了的数据库记录。逻辑删除并不是真正意义上的删除,而是查询不到,只有管理员才能看到,并执行最后的删除。

实现:在数据库和实体类加入deleted

实体类新增属性
@TableLogic //逻辑删除
private Integer deleted;

注册组件
 // 逻辑删除组件!
    @Bean
    public ISqlInjector sqlInjector() {
        return new LogicSqlInjector();
    }

 在项目配置文件要配置下默认值

# 配置逻辑删除 0表示原始数据没有限制 1表示已经进行了逻辑删除
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

测试:

//删除,此时的删除走的是更新的操作sql语句,此时的数据库数据就是把deleted属性值变成1
//让用户查询的时候必须跟上这个deleted属性,这样就实现用户逻辑上删除,然后最终删除权在管理员
//手里UPDATE user SET deleted=1 WHERE id=? AND deleted=0 
    @Test
    public void test1(){
        userMapper.deleteById(1L);
    }

4.代码生成器功能

只需要建一个可以运行的类就行

public static void main(String[] args) {
// 需要构建一个 代码自动生成器 对象
AutoGenerator mpg = new AutoGenerator();
// 配置策略
// 1、全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath+"/src/main/java");
gc.setAuthor("xxx");//设置注释的作者
gc.setOpen(false);
gc.setFileOverride(false); // 是否覆盖
gc.setServiceName("%sService"); // 去Service的I前缀
gc.setIdType(IdType.ID_WORKER);
gc.setDateType(DateType.ONLY_DATE);
gc.setSwagger2(true);//是否开启自动配置swagger
mpg.setGlobalConfig(gc);
//2、设置数据源
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/mp?
useSSL=false&useUnicode=true&characterEncoding=utf-8");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("root");
dsc.setDbType(DbType.MYSQL);//数据库类型
mpg.setDataSource(dsc);
//3、包的配置
PackageConfig pc = new PackageConfig();
pc.setModuleName("student");//模块名字
pc.setParent("com.xxx");//要给那个路径下添加各种层级关系
pc.setEntity("entity");
pc.setMapper("mapper");
pc.setService("service");
pc.setController("controller");
mpg.setPackageInfo(pc);
//4、策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude("user"); // 设置要映射的表名可以设置多个表,之间用,隔开
strategy.setNaming(NamingStrategy.underline_to_camel);//名字是否自持下划线转驼峰命名
strategy.setColumnNaming(NamingStrategy.underline_to_camel);//字段是否自持下划线转驼峰命名
strategy.setEntityLombokModel(true); // 自动lombok;
strategy.setLogicDeleteFieldName("deleted");//设置逻辑删除功能
// 自动填充配置
TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT);
TableFill gmtModified = new TableFill("gmt_modified",
FieldFill.INSERT_UPDATE);
ArrayList<TableFill> tableFills = new ArrayList<>();
tableFills.add(gmtCreate);
tableFills.add(gmtModified);
strategy.setTableFillList(tableFills);
// 乐观锁
strategy.setVersionFieldName("version");
//设置controller的请求模式按照REST请求规范设置
//就是查询getmapping 删除deletemapping 更新putmapping 添加postmapping 
strategy.setRestControllerStyle(true);
strategy.setControllerMappingHyphenStyle(true); 
mpg.setStrategy(strategy);
mpg.execute(); //执行

}

5.配置自动填充功能

实体类

private Date createTime;

private Date updateTime;

数据库表也加入对应字段

 具体实现

// 字段添加填充内容
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

 编写自动填充实现的配置类

@Slf4j//开启日志方便查看
@Component // 把处理器加到IOC容器中
public class MyHandler implements MetaObjectHandler {
    // 插入时的填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("插入时的填充策略执行了");
        // 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("更新时的填充策略执行了");
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

作用:设置完之后就不需要,插入更新的时候,在对时间属性进行操作。mp帮你完成了 


总结

笔记