MyBatisPlus

MybatisPlus和mybatis的区别:

MybatisPlus是mybatis的增强版本,只做增强不做修改、简化开发,提高效率;

如何使用mybatisplus:

1、添加mybatisplus依赖:

        <!--Mybatis-plus的依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.1</version>
        </dependency>
        <!--mysql的依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--lombok的依赖,为了优化实体类,可以不去实现实体类的set()、get()-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

#在使用lombok的前需要去下载一个lombok插件

配置application.properties文件


#数据库的驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#mysql的地址,还有所在时区
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis-plus?serverTimezone=GMT%2b8
#mysql的用户名和地址
spring.datasource.username=root
spring.datasource.password=123
#mybatis的日志、可以看到mybatisPlus的执行语句,参数等详细信息
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

数据库表的信息:

 数据库的表数据:

mapper接口:

//通过泛型的student类型找到对应的实体类
@Repository//@Repository这个注解可以消除@Autowired的报错,不添加也没事

/**
*MybatisPlus在mapper接口中继承BaseMapper接口。可以直接使用BaseMapper接口中定义的方法,
*省的自己编写接口,也不需要编写sql语句
*/
public interface StudentMapper extends BaseMapper<student>{
}


public interface BaseMapper<T> extends Mapper<T> {
    int insert(T entity);

    int deleteById(Serializable id);

    int deleteByMap(@Param("cm") Map<String, Object> columnMap);

    int delete(@Param("ew") Wrapper<T> wrapper);

    int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);

    int updateById(@Param("et") T entity);
}

 实体类

//一个实体类对应一张表,实体类中的类名对应表名,属性对应字段名
//@Date注解可以提供set()、get();
@Data
public class student {
    //主键策略:采用雪花算法随机生成id值,java中id为Long类型,mysql中id为BigInt,随机id为19位,所以数据类型必须大
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String name;
    private int age;
    //属性填充的注解MetaObjectHandler会解析这个注解,执行不同的方法,进行属性填充
    @TableField(fill = FieldFill.INSERT)
    private Date creatTime;//creat_time  :采用驼峰命名法
    //aop,spring把实体类注入到sql语句时,会根据注解,去执行MetaObjectHandle中的方法,和bean后置处理器差不多
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;//update_time
    //创建乐观锁的版本号
   /*
    * 乐观锁的原理:通过版本号来实现,在数据中添加一个版本号;
    * 两个修改的线程同时拿到一个version,此时A线程修改了数据并且点击提交,对比两个version相同
    * 提交成功,然后version就会+1,然后B线程也修改完了数据,点击提交,对比两个version,
    * version不一致,提交失败;
    * */
    private int version;
    //逻辑删除的标记
    * 逻辑删除和物理删除
    * 物理删除:指的是在数据库的表中删除了该数据;
    * 逻辑删除:通过logic标记,默认情况下logic是0;代表存在;删除logic是1;
    * 删除的底层逻辑是update  
    * 查询的底层逻辑是select  where logic=0;
    * */
    @TableLogic
    private int logic;
}

MetaObjectHandler实现类的使用:

/*
* 把这个类注册成为spring的组件
* 1.spring扫描到@Component注解,判断这个类是是否是MetaObject的实现类,存放在list集合中
* 2.在创建实体类的时候拿出来,根据注解来判断是否执行重写的方法

* */
@Component
public class MyDateHandler implements MetaObjectHandler {
    //插入时,调用下面的方法
    @Override
    public void insertFill(MetaObject metaObject) {
        //往实体类的creatTime属性中填充new Date(),属性
        this.setFieldValByName("creatTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);

    }
     //在更新时执行下面的方法
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

配置类:

乐观锁的实现、分页查询的实现

@Configuration
@MapperScan("com.example.demo.mapper")
public class Config {

     /*
     * 乐观锁的实现类
     * 这个类来实现乐观锁
     * */
    @Bean
    public OptimisticLockerInterceptor createVersionLocker(){
        return new OptimisticLockerInterceptor();
    }



    //这是用来完成分页查询的插件
    @Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor();
    }
}

#Mybatis-plus复杂查询

 //按照医院的编号获取医院签名
        QueryWrapper<HospitalSet> wrapper = new QueryWrapper<>();
        wrapper.eq("hoscode",hoscode);
        HospitalSet hospitalSet = baseMapper.selectOne(wrapper);
        return hospitalSet.getSignKey();


版权声明:本文为m0_60213304原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。