尽量不要同时导入mybatis和mybatis-plus。添加mybatis-plus之后,mapper的xml文件也可以写动态sql,实现较复杂的查询。
主键生成策略
分布式系统唯一id生成:
public enum IdType {
AUTO(0),//数据库id自增
NONE(1),//未设置主键
INPUT(2),//手动输入
ID_WORKER(3),//默认的全局唯一id
UUID(4),//全局唯一id
ID_WORKER_STR(5);//ID_WORKER 字符串表示法
private final int key;
private IdType(int key) {
this.key = key;
}
public int getKey() {
return this.key;
}
}
乐观锁
乐观锁:它总是认为不会出现问题,无论干什么都不去上锁!如果出现了问题,再去更新值测试。
悲观锁:它总是认为总是出现问题,无论干什么都会上锁!再去操作!
乐观锁实现方式:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时,set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
乐观锁:先查询,获得版本号 version=1
--A
update user set name = "ming", version = version + 1
where id = 2 and version = 1
--B 线程抢先完成,这个时候version = 2 ,会导致A修改失败
update user set name = "ming", version = version + 1
where id = 2 and version = 1
逻辑删除
-
在数据表中增加一个deleted字段
-
实体类中增加属性
-
在application.yml中配置
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2) logic-delete-value: 1 logic-not-delete-value: 0 mapper-locations: classpath:mymapper/*.xml
测试
进行map删除
//通过map删除
@Test
public void testDeleteMap() {
HashMap<String, Object> map = new HashMap<>();
map.put("name", "小明");
userMapper.deleteByMap(map);
}
原本的物理删除都会变成逻辑删除
条件构造器
用来替代复杂的sql
模糊查询
@Test
void test3() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.notLike("name", "e")
.like("email", "t");
List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
maps.forEach(System.out::println);
}
子查询
@Test
void test4() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.inSql("id", "select id from user where id<3");
List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
maps.forEach(System.out::println);
}
降序查询
@Test
void test5() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.orderByDesc("id");
List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
maps.forEach(System.out::println);
}
代码生成器
- 添加依赖
<!--代码生成器默认的模板引擎依赖-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>
<!--代码生成器依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.2.0</version>
</dependency>
- 编写代码生成器代码
package com.demo;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import java.util.AbstractList;
import java.util.ArrayList;
public class AutoCode {
public static void main(String[] args) {
AutoGenerator mpg = new AutoGenerator();
//配置策略
//1.全局配置
GlobalConfig gc = new GlobalConfig();
String project = System.getProperty("user.dir");//当前项目路径
gc.setOutputDir(project + "/src/main/java");
gc.setAuthor("Evan");
gc.setOpen(false);
gc.setFileOverride(false); //是否覆盖
//gc.setServiceName("%sService"); //去掉Service的I前缀
gc.setIdType(IdType.ID_WORKER);
gc.setDateType(DateType.ONLY_DATE);
gc.setSwagger2(true);
mpg.setGlobalConfig(gc);
//2.设置数据源
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/mybatisplus?userUnicode=true&characterEncoding=utf-8&serverTimezone=UTC")
.setDriverName("com.mysql.cj.jdbc.Driver")
.setUsername("root")
.setPassword("123456")
.setDbType(DbType.MYSQL);
mpg.setDataSource(dsc);
//3.包的配置
PackageConfig pc = new PackageConfig();
pc.setModuleName("blog")
.setParent("com.evan")
.setEntity("entity")
.setMapper("mapper")
.setService("service")
.setController("controller");
mpg.setPackageInfo(pc);
//4.策略配置
StrategyConfig strategy = new StrategyConfig();
//可以设置多个表
//strategy.setInclude("user", "course", "links");
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 gmtModify = new TableFill("gmt_modify", FieldFill.INSERT_UPDATE);
ArrayList<TableFill> tableFills = new ArrayList<>();
tableFills.add(gmtCreate);
tableFills.add(gmtModify);
strategy.setTableFillList(tableFills);
//乐观锁配置
strategy.setVersionFieldName("version");
strategy.setRestControllerStyle(true);
strategy.setControllerMappingHyphenStyle(true); // localhost:8080/hello_id_2
mpg.setStrategy(strategy);
mpg.execute();//执行代码构造器
}
}
tVersionFieldName("version");
strategy.setRestControllerStyle(true);
strategy.setControllerMappingHyphenStyle(true); // localhost:8080/hello_id_2
mpg.setStrategy(strategy);
mpg.execute();//执行代码构造器
}
}