一、Mybatis plus使用流程
1、导入依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.7.1</version>
</dependency>
2、配置
3、编写测试代码
po层实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String name;
private Integer age;
private String email;
}
mapper(继承BaseMapper即可)
@Repository
public interface UserMapper extends BaseMapper<User> {
}
编写测试代码
@GetMapping("user")
public String test(){
List<User> user = userMapper.selectList(null);
System.out.println("user---"+user);
return "ok";
}
二、日志输出配置
# mybatis-plus的日志输出
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
三、Mybatis-Plus代码生成器配置操作
1、依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.0.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
2、编写配置文件
//代码生成
public class Codegenerator {
public static void main(String[] args) {
//构建代码生成对象
AutoGenerator mpg = new AutoGenerator();
//配置策略
//1、全局配置
GlobalConfig gc = new GlobalConfig();
String path = System.getProperty("user.dir");//输出目录
gc.setOutputDir(path+"/src/main/java");
gc.setAuthor("mp");
gc.setOpen(false);
gc.setFileOverride(false);//是否覆盖原文件
gc.setServiceName("%sService");// 去I前缀
gc.setIdType(IdType.NONE);
gc.setDateType(DateType.ONLY_DATE);
gc.setSwagger2(true);
gc.setServiceName("%sService");
mpg.setGlobalConfig(gc);//放入全局配置
//2、设置数据源
DataSourceConfig dc = new DataSourceConfig();
dc.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai");
dc.setUsername("root");
dc.setPassword("123456");
dc.setDriverName("com.mysql.cj.jdbc.Driver");
dc.setDbType(DbType.MYSQL);
mpg.setDataSource(dc);
//3、包配置(生成文件地址)
PackageConfig pc = new PackageConfig();
// pc.setModuleName("model");
pc.setParent("com.above.test");
pc.setEntity("po");
pc.setMapper("dao");
pc.setService("service");
pc.setController("controller");
pc.setServiceImpl("service.impl");
pc.setXml("mapper");
mpg.setPackageInfo(pc);
//4、策略配置
StrategyConfig sc = new StrategyConfig();
sc.setInclude("user");//设置映射的表名
sc.setNaming(NamingStrategy.underline_to_camel);//表面转驼峰
sc.setColumnNaming(NamingStrategy.underline_to_camel);//字段名转驼峰
sc.setEntityLombokModel(true);//lombok注释
sc.setRestControllerStyle(true);//生成@RestController注解
sc.setEntityTableFieldAnnotationEnable(true);//生成字段注解
//自动填充
TableFill creatTime = new TableFill("creat_time", FieldFill.INSERT);
TableFill updateTime = new TableFill("update_time", FieldFill.INSERT);
ArrayList<TableFill> tableFiles = new ArrayList<>();
tableFiles.add(creatTime);
tableFiles.add(updateTime);
sc.setTableFillList(tableFiles);
sc.setVersionFieldName("version");//乐观锁
sc.setRestControllerStyle(true);
// sc.setControllerMappingHyphenStyle(true);//localhost:8080/hello_id_2 url转下划线
mpg.setStrategy(sc);
mpg.execute();//执行
}
}
3、直接运行main方法即可
四、自动填充配置
1、字段注释
可在生成器中配置自动生成
在策略配置中添加
生成后的效果:
字段中有注释即可!
2、配置处理器
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入填充策略
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
//default MetaObjectHandler setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)
this.setFieldValByName("creatTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
//更新填充策略
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
五、乐观锁
1、配置插件
@EnableTransactionManagement//自动管理事务
@Configuration//配置类
public class MPVersionConfig {
//注册乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
}
2、新增字段
新增version字段
3、使用@Version注解
六、分页
1、原始limit
2、mp内置分页插件、
配置插件
3、使用page
七、逻辑删除
1、配置插件
2、在实体类中使用注解
@TableLogic
3、在yaml中配置
配置删除和未删除的字段状态
八、条件构造器Wrapper
1、查询
// 普通查询
@Test
void test1(){
//查询email不为空,name不为空的,年龄大于
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.isNotNull("email")
.isNotNull("name")
.ge("age",20);
userMapper.selectList(wrapper).forEach(System.out::println);
}
//查询单条数据
@Test
void test2(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name","Sandy");
User user = userMapper.selectOne(wrapper);
System.out.println(user);
}
//范围查询
@Test
void test3(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.between("age",20,30);
Integer integer = userMapper.selectCount(wrapper);
System.out.println(integer);
}
//模糊查询
@Test
void test4(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.notLike("name","b").likeLeft("email","m");
List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
maps.forEach(System.out::println);
}
//内嵌sql
@Test
void test5(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.inSql("id","select id from user where id<3");
List<Object> objects = userMapper.selectObjs(wrapper);
objects.forEach(System.out::println);
}
// 排序
@Test
void test6(){
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.orderByDesc("id");//Desc降序 AESC升序
List<User> userList = userMapper.selectList(wrapper);
userList.forEach(System.out::println);
}