com.baomidou
mybatis-plus-boot-starter
3.4.1
mysql
mysql-connector-java
junit
junit
# 服务端口
server.port=8001
# mysql数据库连接
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatisdemo?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
# 服务端口
server:
port: 8001
# mysql数据库连接
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatisdemo?serverTimezone=GMT%2B8
username: root
password: 123456
com.baomidou
mybatis-plus-generator
3.4.1
org.apache.velocity
velocity-engine-core
2.3
org.freemarker
freemarker
2.3.31
模板引擎两者选其一即可,这里选择的是freemarker
public class CodeGenerator {
@Test
public void run() {
// 数据库连接url
String url = "jdbc:mysql://localhost:3306/mybatisdemo?serverTimezone=GMT%2B8";
// 数据库用户名和密码
String username = "root";
String password = "123456";
// 代码生成模块地址
String moudlePath = System.getProperty("user.dir") + "/src/main/java";
// xml文件生成地址
String xmlPath = System.getProperty("user.dir") + "/src/main/resources/mapper";
// 需要生成的数据表
String[] tableArr = new String[]{
"user_info",
"comment"
};
FastAutoGenerator.create(url, username, password)
.globalConfig(builder -> {
builder.author("RedStar") // 设置作者
.enableSwagger() // 开启 swagger 模式
.disableOpenDir()
.dateType(DateType.ONLY_DATE)
.fileOverride() // 覆盖已生成文件
.outputDir(moudlePath); // 指定输出目录
})
.packageConfig(builder -> {
builder.parent("com.xbdemo.demo") // 设置模块名
.mapper("dao") // 设置mapper包名
.pathInfo(Collections.singletonMap(OutputFile.xml, xmlPath)); // 设置xml文件生成目录
})
.strategyConfig(builder -> {
builder.addInclude(tableArr) // 设置需要生成的表名
.addTablePrefix("t_", "c_") // 设置过滤表前缀
.entityBuilder()
.enableLombok()
.serviceBuilder()
.formatServiceFileName("%sService"); // //去掉Service接口的首字母I
})
.templateConfig(builder -> {
builder.disable(TemplateType.CONTROLLER); // 设置禁止生成controller
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
.execute();
}
}
注:
在handler包下新建自动填充handler类
/**
* @author RedStar
* @date 2022/05/11 14:33
* @description mybatis-plus数据插入监听器,可自动插入默认值
* 将需要此功能的属性加上注解@TableField(fill = FieldFill.INSERT/INSERT_UPDATE)
*/
@Component
public class MyMetaObjectHandler implements MetaObjectHandler{
@Override
public void insertFill(MetaObject metaObject) {
// 执行插入操作时执行该逻辑
// 实体类属性名称和要自动填充的值
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
// 执行更新操作时执行该逻辑
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
entity包下的实体类进行相应处理
@Data
@TableName("user_info")
public class UserInfo implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String name;
private String password;
private Boolean isDeleted;
private Integer version;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
}
@Service
public class UserInfoServiceImpl extends ServiceImpl implements UserInfoService {
@Override
public Integer addUser() {
UserInfo userInfo = new UserInfo();
userInfo.setName("zhangsan");
userInfo.setPassword("000000");
// service调用自己实体类对应的dao层可直接使用this.baseMapper.xxx
return this.baseMapper.insert(userInfo);
}
}
数据表中添加字段is_deleted用于标记记录是否已删除
实体类中对相应属性加上@TableLogic注解
在MyMetaObjectHandler中设置自动填充
@TableLogic
private Boolean isDeleted;
// 设置逻辑删除字段为0
this.setFieldValByName("is_deleted", 0, metaObject);
使用方式不变,无感知实现逻辑删除。
注: 只对自动注入的 sql 起效:
例如:
删除: update user set deleted=1 where id = 1 and deleted=0
查找: select id,name,deleted from user where deleted=0
逻辑删除是为了方便数据恢复和保护数据本身价值等等的一种方案,但实际就是删除。
如果你需要频繁查出来看就不应使用逻辑删除,而是以一个状态去表示。
在config包下新建MybatisConfig.class
@Configuration
public class MybatisConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
// 配置乐观锁插件
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
// 配置分页插件
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return mybatisPlusInterceptor;
}
}
多线程操作数据时会实现乐观锁功能
查询数据时新建Page对象
传入当前页和记录数
进行分页查询
@Override
public List getUserPage(Integer current, Integer size) {
// 创建page对象, 参数为第几页和记录数
Page pageObj = new Page<>(current, size);
// 按照分页查询
this.page(pageObj);
// 返回查询出来的数据
return pageObj.getRecords();
}
此外Page对象还有几个属性
records: 用来存放查询出来的数据
total:返回记录的总数
size: 每页显示条数,默认 10
current: 当前页,默认1
orders: 排序字段信息
# mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
# mybatis日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦