https://baomidou.com/introduce/
依赖
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--代码自动生成-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
配置
spring:
# 配置环境
profiles:
active: dev
# 配置数据库连接
# mysql 8 兼容 mysql 5
datasource:
url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=true&useUnicode=true&charsetEncoding=UTF-8&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
configuration:
# 配置日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
# 配置逻辑删除
logic-delete-value: 1
logic-not-delete-value: 0
实体类
public class User {
// 数据库主键,mybatis-plus默认使用雪花算法生成
// IdType指定生成策略
@TableId(type = IdType.ID_WORKER)
private Long id;
private String name;
private Integer age;
private String email;
// 乐观锁注解
@Version
private Integer version;
// 插入时自动填充
@TableField(fill = FieldFill.INSERT)
private Date gmtCreate;
// 插入、修改时自动填充
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date gmtModified;
//逻辑删除
@TableLogic
private Integer deleted;
}
持久层
// 注入持久层
@Repository
public interface UserMapper extends BaseMapper<User> {
}
自定义字段填充策略
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
// 插入时的填充策略
@Override
public void insertFill(MetaObject metaObject) {
// 字段值,字段名,数据类型
this.setFieldValByName("gmtCreate", new Date(), metaObject);
this.setFieldValByName("gmtModified", new Date(), metaObject);
}
// 更新时的填充策略
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("gmtModified", new Date(), metaObject);
}
}
配置类
// 扫描mapper接口
@MapperScan("com.example.mapper")
// 开启事务
@EnableTransactionManagement
// 配置类
@Configuration
public class MybatisPlusConfig {
// 注册乐观锁插件
// 修改前查询version,将version作为判断条件
// update user set age = ?,version = version + 1 where id = ? and version = ?
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
// 注册分页插件
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
// 逻辑删除组件
@Bean
public ISqlInjector iSqlInjector(){
return new LogicSqlInjector();
}
// SQL执行效率插件
@Bean
// 只在指定环境下开启,保证效率
@Profile({"dev","test"})
public PerformanceInterceptor performanceInterceptor(){
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
// SQL执行的最大时间(毫秒),超过时间就不执行,抛出异常
performanceInterceptor.setMaxTime(100);
// SQL语句格式化
performanceInterceptor.setFormat(true);
return performanceInterceptor;
}
}
测试
// SELECT xxx FROM user
List<User> userList = userMapper.selectList(null);
// 批量查询
// SELECT xxx FROM user WHERE id IN ( ? , ? , ? )
List<User> userList = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
// 条件查询
// SELECT xxx FROM user WHERE name = ? AND age = ?
Map<String,Object> map = new HashMap<>();
map.put("name", "Jone");
map.put("age", 18);
List<User> userList = userMapper.selectByMap(map);
// 分页查询,查询之前会先执行 SELECT COUNT(1) FROM user
// SELECT xxx FROM user LIMIT 0,5
Page<User> page = new Page<>(1,5);
IPage<User> userIPage = userMapper.selectPage(page, null);
userIPage.getRecords().forEach(System.out::println);
// 插入
userMapper.insert(user);
// 修改
userMapper.updateById(user);
// 逻辑删除:UPDATE user SET deleted=1 WHERE id=? AND deleted=0
userMapper.deleteById(1L);
// 条件构造器
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.isNotNull("name")
.eq("name", "zhangsan")// 等于
.ge("age", 1)// 大于
.notLike("name", "a")// name not like '%a%'
.likeRight("name", "b")// name like 'b%'
.likeLeft("name", "b")// name like '%b'
.inSql("id", "select id from user where id > 0")// 子查询
.orderByDesc("id")
.between("age", 1, 100);
userMapper.selectList(wrapper);
代码生成器
import com.baomidou.mybatisplus.annotation.*
import com.baomidou.mybatisplus.generator.*
public class MyGenerator {
public static void main(String[] args) {
// 代码生成器对象
AutoGenerator generator = new AutoGenerator();
// 全局配置
GlobalConfig global = new GlobalConfig();
global.setOutputDir(System.getProperty("user.dir") + "/src/main/java");// 输出目录
global.setAuthor("作者");
global.setOpen(false);// 打开输出目录
global.setFileOverride(false);// 文件覆盖
global.setServiceName("%sService");
global.setIdType(IdType.ID_WORKER);// 主键生成策略
global.setDateType(DateType.ONLY_DATE);// 数据库时间类型使用 java.util.date 代替
global.setSwagger2(true);
generator.setGlobalConfig(global);
// 数据源
DataSourceConfig dataSource = new DataSourceConfig();
dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis_plus?useSSL=true&useUnicode=true&charsetEncoding=UTF-8&serverTimezone=UTC");
dataSource.setUsername("root");
dataSource.setPassword("root");
dataSource.setDbType(DbType.MYSQL);
generator.setDataSource(dataSource);
// 生成的包:com.example.generator.pojo
PackageConfig pack = new PackageConfig();
pack.setModuleName("generator");
pack.setParent("com.example");
pack.setEntity("pojo");
pack.setMapper("mapper");
pack.setService("service");
pack.setController("controller");
generator.setPackageInfo(pack);
// 策略
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude("user","product");// 要映射的表(任意个)
strategy.setNaming(NamingStrategy.underline_to_camel);// 表名下划线转驼峰
strategy.setColumnNaming(NamingStrategy.underline_to_camel);// 字段名下划线转驼峰
strategy.setEntityLombokModel(true);// 生成 lombok
strategy.setLogicDeleteFieldName("deleted");// 逻辑删除字段名
strategy.setVersionFieldName("version");// 乐观锁字段名
strategy.setRestControllerStyle(true);
strategy.setControllerMappingHyphenStyle(true);// localhost:8080/login_id_1
// 自动填充策略
List<TableFill> tableFillList = new ArrayList<>();
TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT);
TableFill gmtModified = new TableFill("gmt_modified", FieldFill.INSERT_UPDATE);
tableFillList.add(gmtCreate);
tableFillList.add(gmtModified);
strategy.setTableFillList(tableFillList);
generator.setStrategy(strategy);
// 执行生成
generator.execute();
}
}
4万+

被折叠的 条评论
为什么被折叠?



