整合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帮你完成了
总结
笔记