1、gitee:fluent-mybatis
2、使用idea搭建一个maven项目,如图:
pom文件;
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>xyz.haijin.test</groupId>
<artifactId>fluentMybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<fluent-mybatis.version>1.9.8</fluent-mybatis.version>
<java.version>1.8</java.version>
<msbs.version>2.2.0</msbs.version>
<druid.version>1.2.8</druid.version>
<mysql.version>8.0.29</mysql.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${msbs.version}</version>
</dependency>
<!-- 引入fluent-mybatis 运行依赖包, scope为compile -->
<dependency>
<groupId>com.github.atool</groupId>
<artifactId>fluent-mybatis</artifactId>
<version>${fluent-mybatis.version}</version>
</dependency>
<!-- 引入fluent-mybatis-processor, scope设置为provider 编译需要,运行时不需要 -->
<dependency>
<groupId>com.github.atool</groupId>
<artifactId>fluent-mybatis-processor</artifactId>
<scope>provided</scope>
<version>${fluent-mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<!-- Logback依赖,还会传递 slf4j 和 logback-core -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
</project>
application.yaml:
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/fluent_mybatis?useUnicode=true&characterEncoding=utf8
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
#自动往数据库建表
# schema:
# - classpath:department.sql
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
3、创建一个生成代码类,如图:
EntityGeneratorDemo:
public class EntityGeneratorDemo {
// 数据源 url
static final String url = "jdbc:mysql://localhost:3306/fluent_mybatis?useUnicode=true&characterEncoding=utf8";
// 数据库用户名
static final String username = "root";
// 数据库密码
static final String password = "123456";
@Test
public void generate() throws Exception {
// 引用配置类,build方法允许有多个配置类
FileGenerator.build(Empty.class);
}
@Tables(
// 设置数据库连接信息
url = url, username = username, password = password,
// 设置entity类生成src目录, 相对于 user.dir
srcDir = "src/main/java",
// 设置entity类的package值
basePack = "xyz.haijin.test",
// 设置dao接口和实现的src目录, 相对于 user.dir
daoDir = "src/main/java",
// 设置哪些表要生成Entity文件
tables = {@Table(value = {"hello_world"})}
)
static class Empty { //类名随便取, 只是配置定义的一个载体
}
}
点击后就会在相应的路径下生成相关的class文件,生成后在可能回出现相关的依赖不存在,通过刷新maven可解决,如图:
在项目的路径下能够看到可通过业务修改的模板相关代码,如图:
其中, HelloWorldDao 和 HelloWorldDaoImpl是空类,再次运行代码不会覆盖生成
Entity是Fluent Mybatis运行的正主, 不要手工改动, 重新运行代码生成会进行覆盖, 保持数据库变更的一致。
在taget目录下能够看到不需要改动的生成代码,如图:
在Entity代码生成后,执行IDE编译,或者maven(gradle)编译,会在target目录下生成下面代码列表,如图:
大家重点关注 XyzMapper, XyzQuery, XyzUpdate 这3个类即可
Mapper类是Mybatis的接口类,需要加入到mybatis的扫描路径中
@MapperScan({"cn.org.atool.fluent.mybatis.demo.mapper"})
XyzQuery和XyzUpdate是应用中用来拼装查询语句和更新语句的工具类。
4、创建一个springboot的启动类,FluentTest:
@SpringBootApplication
@RestController
public class FluentTest {
public static void main(String[] args) {
SpringApplication.run(FluentTest.class, args);
}
@GetMapping("/")
public String hello() {
return "Hello World";
}
}
启动,测试一下项目能不能启动。
5、完善项目的增删改查,如图:
ApplicationConfig:
@Configuration
@MapperScan({"xyz.haijin.test.mapper"})
public class ApplicationConfig {
@Bean
public MapperFactory mapperFactory() {
return new MapperFactory();
}
}
TestController:
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private TestService testService;
@GetMapping("/hello")
public List<HelloWorldEntity> hello() {
return testService.hello();
}
@PostMapping("/save")
public boolean save(@RequestBody HelloSaveDTO helloSaveDTO) {
return testService.save(helloSaveDTO);
}
}
HelloSaveDTO:
@Data
public class HelloSaveDTO {
private Integer isDeleted;
private String sayHello;
private String yourName;
}
HelloWorldEntity:
@Data
@Accessors(
chain = true
)
@EqualsAndHashCode(
callSuper = false
)
@AllArgsConstructor
@NoArgsConstructor
@FluentMybatis(
table = "hello_world",
schema = "fluent_mybatis",
desc = "简单演示表"
)
public class HelloWorldEntity extends RichEntity {
private static final long serialVersionUID = 1L;
@TableId("id")
private Long id;
@TableField(
value = "gmt_created",
desc = "创建时间"
)
private Date gmtCreated;
@TableField(
value = "gmt_modified",
desc = "更新时间"
)
private Date gmtModified;
@TableField(
value = "is_deleted",
desc = "是否逻辑删除"
)
private Integer isDeleted;
@TableField("say_hello")
private String sayHello;
@TableField("your_name")
private String yourName;
@Override
public final Class entityClass() {
return HelloWorldEntity.class;
}
}
dfsTestService:
@Slf4j
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@Service
public class TestService {
private final HelloWorldMapper helloWorldMapper;
public List<HelloWorldEntity> hello() {
List<HelloWorldEntity> helloWorldEntities = helloWorldMapper.listEntity(helloWorldMapper.query());
return helloWorldEntities;
}
public boolean save(HelloSaveDTO helloSaveDTO) {
// 构造一个对象
HelloWorldEntity entity = new HelloWorldEntity();
entity.setYourName(helloSaveDTO.getYourName());
entity.setGmtCreated(new Date());
entity.setGmtModified(new Date());
entity.setSayHello(helloSaveDTO.getSayHello());
entity.setIsDeleted(helloSaveDTO.getIsDeleted());
// 插入操作
int count = helloWorldMapper.insert(entity);
log.info("TestService-save-保存数据【{}】",count);
return true;
}
}
HelloVo:
@Data
public class HelloVo {
private Long id;
private Date gmtCreated;
private Date gmtModified;
private Integer isDeleted;
private String sayHello;
private String yourName;
}
FluentTest:
@SpringBootApplication
public class FluentTest {
public static void main(String[] args) {
SpringApplication.run(FluentTest.class, args);
}
}
启动如下: