当前位置: 首页 > 工具软件 > Beetl > 使用案例 >

SpringBoot-整合Beetlsql

师增
2023-12-01

beetlsql 优点

  • 开发效率

    • 无需注解,自动使用大量内置SQL,轻易完成增删改查功能,节省50%的开发工作量
    • 数据模型支持Pojo,也支持Map/List这种快速模型,也支持混合模型
    • SQL 模板基于Beetl实现,更容易写和调试,以及扩展
  • 维护性

    • SQL 以更简洁的方式,Markdown方式集中管理,同时方便程序开发和数据库SQL调试。
    • 可以自动将sql文件映射为dao接口类
    • 灵活直观的支持支持一对一,一对多,多对多关系映射而不引入复杂的OR Mapping概念和技术。
    • 具备Interceptor功能,可以调试,性能诊断SQL,以及扩展其他功能
  • 其他
  1. * 内置支持主从数据库支持的开源工具
  2. * 支持跨数据库平台,开发者所需工作减少到最小,目前跨数据库支持mysql,postgres,oracle,sqlserver,h2,sqllite,DB2.

引用依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>provided</scope>
</dependency>

配置

beetlsql:
  
    # 数据源名称
    ds: ds1

    # 要扫描 Mapper 的包名
    basePackage: com.xxx.mapper

    # 指明 mapper 类的结尾 扫描到以 Mapper 结尾的类会为其自动生成代理类 注册为 Spring 的 Bean
    # 默认扫描 Mapper 结尾 可不配置。如果你不是 xxxMapper 这样以 Mapper 结尾的 则需要配置
    daoSuffix: Mapper

    # POJO 和数据表列的名称转换 如驼峰 userName 转换为下划线的 user_name
    nameConversion: org.beetl.sql.core.UnderlinedNameConversion

    # 数据库方言(这里我用的sqlserver)
    dbStyle: org.beetl.sql.core.db.SqlServerStyle

    # 是否是开发模式
    dev: true

    # 存放 sql 文件的根目录 默认就是 resources/sql/下 所以可以不配置
    sqlPath: /sql

    # sql 文件编码
    sqlFileCharset: utf-8


datasource:
    druid:
      username: xxx
      password: xxx
      url:jdbc:sqlserver:
      driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver

Spring配置类

  • datasource,这个是在SimpleDataSourceConfig 类里配置的数据源,命名为ds1
  • beetlsql 配置一个名为sqlManager1的SQLManager实例,其后的配置beetlsql.sqlManager1.ds 配置了关联的数据源ds1

SimpleDataSourceConfig定义如下,会配置一个叫ds1的数据源

package com.walmart.test.Configuration;

import com.zaxxer.hikari.HikariDataSource;
import org.beetl.sql.core.SQLManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;

import javax.sql.DataSource;

@Configuration
public class SimpleDataSourceConfig {
    @Primary
    @Bean(name = "ds1")
    public DataSource datasource(Environment env) {
        HikariDataSource ds = new HikariDataSource();
        ds.setJdbcUrl(env.getProperty("spring.datasource.druid.url"));
        ds.setUsername(env.getProperty("spring.datasource.druid.username"));
        ds.setPassword(env.getProperty("spring.datasource.druid.password"));
        ds.setDriverClassName(env.getProperty("spring.datasource.druid.driver-class-name"));
        return ds;
    }

    @Bean
    public SQLManagerCustomize mySQLManagerCustomize(){
        return new SQLManagerCustomize(){
            @Override
            public void customize(String sqlMangerName, SQLManager manager) {
                //初始化sql,这里也可以对sqlManager进行修改
//                DBInit.executeSqlScript(manager,"db/schema.sql");

            }
        };
    }
}

UserMapper是一个BeetlSQL3的Mapper,我们使用BaseMapper提供的内置insert方法操作

@SqlResource("user")/*寻找sql目录配置的文件夹下的user.md文件,参考spring集成*/
public interface SimpleUserInfoMapper extends BaseMapper<UserEntity> {
    List<UserEntity> findByDepartmentId(Integer template);
}

BaseMapper提供了POJO常用的CRUD方法,每个BaseMapper的接口方法都是通过@AutoMapper注解申明一个实现类,实现类调用SQLManager相关得API。 关于此实现类,可以参考BeetlSQL3官方文档

UserInfo定义如下

@Table(name="sys_user")
@Data
public class UserInfo {
    @AssignID
    private Integer id;
    private String name;
    private Integer departmentId;
}

注解    说明
AutoID    作用于属性字段或者 getter 方法 告诉 beetlsql 这是自增主键 对应于数据自增长
AssignID    作用于属性字段或者 getter 方法 告诉 beetlsql 这是程序指定主键
SeqID    作用于 getter 方法 告诉 beetlsql 这是序列主键

UserService是一个Spring的Service,简单的调用userMapper.insert

@Service
public class UserService {
    @Resource
    SimpleUserInfoMapper userInfoMapper;

    @Autowired
    SQLManager sqlManager;

    public void test(){
//        UserEntity single2 = sqlManager.unique(UserEntity.class,1);

        UserEntity template = new UserEntity();
        template.setDepartmentId(1);
        List<UserEntity> list = userInfoMapper.findByDepartmentId(1);
        System.out.println("list=="+list);

        UserEntity single = userInfoMapper.single(1);
        System.out.println("single =="+single);
    }
}

user.md文件(放在src/main/resources/sql/ 目录下)

findByDepartmentId /*这里的名称对应mapper的接口*/
===
select * from sys_user where
@if(!isEmpty(template)){ 
 department_id = #template#
-- @ }

 类似资料: