fluent-mybatis相关学习

我爱海鲸 2022-07-12 11:42:20 暂无标签

简介springboot、阿里出品的orm框架,fluentmybatis, mybatis语法增强框架, 综合了mybatis plus, danymic sql, jpa等框架特性和优点, 利用annotation processor生成代码

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);
    }


}

启动如下:

你好:我的2025