整合mp依赖

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

这时候

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

></if>

这样子就能接收参数0了

前言

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帮你完成了 


总结

笔记

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐