quick start
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1.tmp</version>
</dependency>
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mess?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
@SpringBootApplication
@MapperScan("org.example.mybatisplusdemo.mapper")
public class MybatisPlusDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusDemoApplication.class, args);
}
}
public interface OrderMapper extends BaseMapper<Orders> {
}
@SpringBootTest
class MybatisPlusDemoApplicationTests {
@Test
void contextLoads() {
}
@Autowired
private OrderMapper orderMapper;
@Test
public void testSelect() {
List<Orders> ordersList = orderMapper.selectList(null);
for (Orders orders : ordersList) {
System.out.println(orders);
}
}
}
在idea里面,注入的变量orderMapper会冒红,但是并不影响。应该是底层会扫描mapper包自动实例化。
mybatis-plus也无需再设置驼峰命名规则映射。
其它常用功能
日志
配置文件,输出SQL语句
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
常用注解
- @TableName 用于定义表名
- @TableId 用于定义表的主键
| 属性 |
用途 |
可选值 |
| value |
用于定义主键字段名 |
|
| type |
用于定义主键类型(主键策略 IdType) |
IdType.AUTO 主键自增,系统分配,不需要手动输入 |
|
|
IdType.NONE 未设置主键 |
|
|
IdType.INPUT 需要自己输入 主键值 |
|
|
IdType.ASSIGN_ID 系统分配 ID,用于数值型数据(Long,对应 mysql 中 BIGINT 类型) |
|
|
IdType.ASSIGN_UUID 系统分配 UUID,用于字符串型数据(String,对应 mysql 中 varchar(32) 类型)。 |
- @TableField 用于定义表的非主键字段。
| 属性 |
用途 |
可选值 |
| value |
用于定义非主键字段名 |
|
| exist |
用于指明是否为数据表的字段, true 表示是,false 为不是 |
|
| fill |
用于指定字段填充策略(FieldFill) |
FieldFill.DEFAULT 默认不填充 |
|
|
FieldFill.INSERT 插入时填充 |
|
|
FieldFill.UPDATE 更新时填充 |
|
|
FieldFill.INSERT_UPDATE 插入、更新时填充 |
- @TableLogic 用于定义表的字段进行逻辑删除(非物理删除)
| 属性 |
用途 |
| value |
用于定义未删除时字段的值 |
| delval |
用于定义删除时字段的值 |
- @Version 用于字段实现乐观锁
代码生成器
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.1.tmp</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>
// Step1:代码生成器
AutoGenerator mpg = new AutoGenerator();
// Step2:全局配置
GlobalConfig gc = new GlobalConfig();
// 填写代码生成的目录(需要修改)
String projectPath = "/Users/xxx/gitee_projects/demo/mybatis-plus-demo";
// 拼接出代码最终输出的目录
gc.setOutputDir(projectPath + "/src/main/java");
// 配置开发者信息(可选)(需要修改)
gc.setAuthor("wxy");
// 配置是否打开目录,false 为不打开(可选)
gc.setOpen(false);
// 实体属性 Swagger2 注解,添加 Swagger 依赖,开启 Swagger2 模式(可选)
// gc.setSwagger2(true);
// 重新生成文件时是否覆盖,false 表示不覆盖(可选)
gc.setFileOverride(false);
// 配置主键生成策略,此处为 ASSIGN_ID(可选)
gc.setIdType(IdType.ASSIGN_ID);
// 配置日期类型,此处为 ONLY_DATE(可选)
gc.setDateType(DateType.ONLY_DATE);
// 默认生成的 service 会有 I 前缀
gc.setServiceName("%sService");
mpg.setGlobalConfig(gc);
// Step3:数据源配置(需要修改)
DataSourceConfig dsc = new DataSourceConfig();
// 配置数据库 url 地址
dsc.setUrl("jdbc:mysql://localhost:3306/mess?useUnicode=true&characterEncoding=utf8");
// dsc.setSchemaName("testMyBatisPlus"); // 可以直接在 url 中指定数据库名
// 配置数据库驱动
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
// 配置数据库连接用户名
dsc.setUsername("root");
// 配置数据库连接密码
dsc.setPassword("123456");
mpg.setDataSource(dsc);
// Step:4:包配置
PackageConfig pc = new PackageConfig();
// 配置父包名(需要修改)
pc.setParent("org.example.mybatisplusdemo");
// 配置模块名(需要修改)
// pc.setModuleName("mybatis-plus-demo");
// 配置 entity 包名
pc.setEntity("model");
// 配置 mapper 包名
pc.setMapper("mapper");
// 配置 service 包名
pc.setService("service");
// 配置 controller 包名
pc.setController("controller");
mpg.setPackageInfo(pc);
// Step5:策略配置(数据库表配置)
StrategyConfig strategy = new StrategyConfig();
// 指定表名(可以同时操作多个表,使用 , 隔开)(需要修改)
strategy.setInclude("test_user");
// 配置数据表与实体类名之间映射的策略
strategy.setNaming(NamingStrategy.underline_to_camel);
// 配置数据表的字段与实体类的属性名之间映射的策略
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
// 配置 lombok 模式
strategy.setEntityLombokModel(true);
// 配置 rest 风格的控制器(@RestController)
strategy.setRestControllerStyle(true);
// 配置驼峰转连字符
strategy.setControllerMappingHyphenStyle(true);
// 配置表前缀,生成实体时去除表前缀
// 此处的表名为 test_user,去除前缀后剩下为 user。
strategy.setTablePrefix("test_");
mpg.setStrategy(strategy);
// Step6:执行代码生成操作
mpg.execute();
自动填充数据
@Component
public class MetaHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
}
}
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
逻辑删除
@TableLogic(value = "0", delval = "1")
@TableField(fill = FieldFill.INSERT)
private Integer delFlag;
@Component
public class MetaHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "delFlag", Integer.class, 0);
}
@Override
public void updateFill(MetaObject metaObject) {
}
}
分页插件
@Configuration
public class MyBatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
// Step1:创建一个 Page 对象
Page<User> page = new Page<>();
// Page<User> page = new Page<>(2, 5);
// Step2:调用 mybatis-plus 提供的分页查询方法
userService.page(page, null);
// Step3:获取分页数据
System.out.println(page.getCurrent()); // 获取当前页
System.out.println(page.getTotal()); // 获取总记录数
System.out.println(page.getSize()); // 获取每页的条数
System.out.println(page.getRecords()); // 获取每页数据的集合
System.out.println(page.getPages()); // 获取总页数
System.out.println(page.hasNext()); // 是否存在下一页
System.out.println(page.hasPrevious()); // 是否存在上一页
乐观锁
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
User user = new User();
user.setGender(false).setPhoneNumber("999");
userService.save(user);
System.out.println(userService.list());
user.setPhoneNumber("998");
userService.update(user,null);
System.out.println(userService.list());
插入时version是1,更新后version变成2
网友评论