Mybatis plus
mybatis-plus配置
导包 导入springboot基本包 mybatis-plus包
最好不要同时导入mybatis包和mybatis-plus包 可能会出现兼容问题
所有sql语句都是动态语句
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>最新版本</version>
</dependency>
配置数据库配置文件
spring.datasource.username=root
spring.datasource.password=admin
#使用mysql8注意设置时区
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimeZone=Asia/Shanghai
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver编码实体类
编写Mapper接口,Mapper接口继承BaseMapper<实体类>,加上@Repository声明Mapper是持久层的类并注册
在springboot主启动类中添加@MapperScan()扫描mapper下的所有接口
配置完成,之后就可以开始使用了
mybatis-plus使用
自己编写的Mapper类继承了BaseMapper,所有的方法都来自父类,当然我们也可以编写自己的方法
参数 Wrapper 是一个条件构造器 类似sql要编写的条件
使用Mapper类就能完成一系列CRUD操作
配置日志
使用mybatis-plus之后,所有的sql语句是不可见的,要看到执行了什么sql语句,可以配置日志,在日志中查看
直接使用配置文件配置日志
记得添加log4j的配置文件
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.log4j.Log4jImplmybatis-plus主键生成策略
分布式系统唯一id生成算法:uuid、自增id、雪花算法、Redis、zookeeper
可以使用@TableId(type = Idtype.???)注解指定id的设置方式
public enum IdType {
AUTO(0),//主键自增 使用这种方式 数据库字段一定是自增的 不然报错
NONE(1),//未设置主键
INPUT(2),//手动输入 选择手动输入就必须自己写id
ASSIGN_ID(3),//默认全局唯一id
ASSIGN_UUID(4);//uuid
}雪花算法
分布式id生成算法,结果为一个long型的id,其中41bit作为毫秒数,10bit作为机器id(5bit是数据中心,5bit是机器id),12bit作为毫秒内流水号,每秒可以生成4096个id,最后还有一个符号位,永远为0
自动填充
创建时间,修改时间等操作一般都是自动化完成的,不要手动更新
不可以直接修改数据库
要使用代码的方式修改数据
使用@TableField(fill = FieldFill.???)注解进行设置
public enum FieldFill {
DEFAULT,
INSERT,//自动插入
UPDATE,//自动更新
INSERT_UPDATE;//创建时插入 更新时更新
private FieldFill() {
}
}编写一个处理器处理注解内容 实现插入时的填充策略与更新时的填充策略
/**
* 实现自动填充注解的方法
* @author liuyulin10
*/
@Slf4j//日志注解
@Component//一定要记得吧处理器加入到IOC中
public class MyMetaObjectHandler implements MetaObjectHandler {
//实现insert的操作
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert file.....");
//设置字段的值
//setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)
this.setFieldValByName("gmtCreate", new Date(), metaObject);
this.setFieldValByName("gmtModified", new Date(), metaObject);
}
//实现update的操作
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update file.....");
this.setFieldValByName("gmtModified", new Date(), metaObject);
}
}一定要记得给处理器加入到IOC容器中
实体类中的时间使用Java.util.Data的时间,使用sql包下的时间会报错
在配置文件中使用时间Asia/Shanghai保证时间的正确
乐观锁 与 悲观锁
面试中常被问道的
乐观锁总是认为不会出现问题,无论干什么都不会去上锁,如果出现了问题就再次更新测试
悲观锁十分悲观,认为总是会出现问题,无论干什么都会上锁,再去操作
主要讲解乐观锁
乐观锁实现方式:取出记录时,获取当前 version; 更新时,带上这个 version; 执行更新时, set version = newVersion where version = oldVersion ;如果 version 不对,就更新失败
在实体类中添加version字段并加上@Version注解表明该字段是一个乐观锁
实现乐观锁需要注册组件 在配置类中注册乐观锁插件
/**
* mybatis-plus配置类
* @author liuyulin10
*/
@EnableTransactionManagement//自动管理事务
@MapperScan("com.liuyulin10.mybatisplus.mapper")//让配置类来扫描包
@Configuration
public class MyBatisPlusConfig {
//注册乐观锁插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}多线程下一定要记得加锁
查询操作
用一个List批量查询
List<T> selectBatchIds(@Param("coll") Collection<?extends Serializable> idList);用map实现条件查询
List<Map<String, Object>>selectMaps(@Param("ew") Wrapper<T> queryWrapper);分页查询
mybatis-plus内置了分页插件
首先配置分页插件
@Bean
public MybatisPlusInterceptor paginationInnerInterceptor(){
MybatisPlusInterceptor interceptor=new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}配置好之后直接使用Page对象
//测试分页操作
@Test
public void testPage(){
//参数一:当前页
//参数二:页面大小
Page<User> page=new Page<>(1,5);
Page<User> userPage=userMapper.selectPage(page,null);
page.getRecords().forEach(System.out::println);
}删除操作
有delete()、deleteById()、deleteBatchIds()、deleteByMap方法
逻辑删除
在数据库中没有被移除,而是通过一个变量让它失效,管理员可以查看被删除的记录,防止数据丢失,类似于回收站
在数据库中需要有deleted字段
在实体类中添加@TableLogic注解
@TableLogic
private Integer deleted;注册逻辑删除组件
高版本已经不需要注册Bean了,添加了注解就可以了
配置逻辑删除的配置
mybatis-plus:
global-config:
db-config:
logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)性能分析插件
新版本推荐使用p6spy
条件构造器 Wrapper
new一个wrapper,然后给wrapper添加各种条件,然后传入wrapper执行各种操作