集成和Demo

    Spring集成和Demo

    • BeetlSqlScannerConfigurer 根据包名和类后缀来自动注入Dao类,如果没有Dao,可以不配置此项
    • cs: 指定ConnectionSource,可以用系统提供的DefaultConnectionSource,支持按照CRUD决定主从。例子里只有一个master库
    • dbStyle: 数据库类型,目前只支持org.beetl.sql.core.db.MySqlStyle,以及OralceSytle,PostgresStyle,SQLiteStyle,SqlServerStyle,H2Style
    • sqlLoader: sql语句加载来源
    • nc: 命名转化,有默认的DefaultNameConversion,数据库跟类名一致,还有有数据库下划线的UnderlinedNameConversion,JPANameConversion,
    • interceptors:DebugInterceptor 用来打印sql语句,参数和执行时间

    注意: 任何使用了Transactional 注解的,将统一使用Master数据源,例外的是@Transactional(readOnly=true),这将让Beetsql选择从数据库。

    1. public class MyServiceImpl implements MyService {
    2. @Autowired
    3. @Autowired
    4. SQLManager sql;
    5. @Override
    6. @Transactional()
    7. public int total(User user) {
    8. int total = list .size();
    9. User u =new User();
    10. u.id = 3;
    11. u.name="hello";
    12. u.age = 12;
    13. dao.insert(u);
    14. return total;
    15. }

    其他集成配置还包括:

    • functions 配置扩展函数
    • tagFactorys 配置扩展标签
    • configFileResource 扩展配置文件位置,beetlsql将读取此配置文件覆盖beetlsql默认选项
    • defaultSchema 数据库访问schema

    SpringBoot集成

    1. <dependency>
    2. <groupId>com.ibeetl</groupId>
    3. <version>1.2.14.RELEASE</version>
    4. </dependency>
    @Configuration
    public class DataSourceConfig {    
    
     @Bean(name="datasource")
      public DataSource datasource(Environment env) {
        HikariDataSource ds = new HikariDataSource();
        ds.setJdbcUrl(env.getProperty("spring.datasource.url"));
        ds.setUsername(env.getProperty("spring.datasource.username"));
        ds.setPassword(env.getProperty("spring.datasource.password"));
        ds.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
        return ds;
      }
    }

    提供如下配置

    beetl-framework-starter 会读取application.properites如下配置

    • beetlsql.sqlPath,默认为/sql, 作为存放sql文件的根目录,位于/resources/sql目录下

    • beetlsql.nameConversion: 默认是org.beetl.sql.core.UnderlinedNameConversion,能将下划线分割的数据库命名风格转化为java驼峰命名风格,还有常用的DefaultNameConversion,数据库命名完全和Java命名一直,以及JPA2NameConversion,兼容JPA命名

    • beetl-beetlsql.dev:默认是true,即向控制台输出执行时候的sql,参数,执行时间,以及执行的位置,每次修改sql文件的时候,自动检测sql文件修改.

    • beetlsql.daoSuffix:默认为Dao。

    • beetlsql.basePackage:默认为com,此选项配置beetlsql.daoSuffix来自动扫描com包极其子包下的所有以Dao结尾的Mapper类。以本章例子而言,你可以配置“com.bee.sample.ch5.dao”

    如果你想配置主从或者指定一个已经配置好的数据源,可以自己创建一个 BeetlSqlDataSource的Bean,比如,在你的配置代码里

    @Bean
    public BeetlSqlDataSource beetlSqlDataSource(@Qualifier("master")  DataSource dataSource,@Qualifier("slave")  DataSource slave){
        BeetlSqlDataSource source = new BeetlSqlDataSource();
        source.setMasterSource(dataSource);
        source.setSlaves(new DataSource[]{slave});
        return source;
    }
    

    注意,可以通过Application.properties 配置如下属性禁用BeetlSQL或者禁用Beetl

    可以实现BeetlSqlCustomize接口来定制BeetlSQL,比如

    @Configuration
    public MyConfig{
      @Bean
      public BeetlSqlCustomize beetlSqlCustomize(){
        return  new BeetlSqlCustomize(){
          public void customize(SqlManagerFactoryBean sqlManagerFactoryBean){
            //....
          } 
        };
      }
    }

    可以掉用SqlManagerFactoryBean来配置,或者获得SQLManager 进一步配置

    SpringBoot集成多数据源

    单数据源情况,BeetlSQL配置方式如上一节所示,BeetlSQL会自动根据单数据源配置好BeetlSQL,多数据源情况下,需要配置指定的多数据源,如下俩个数据源

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

    对于数据源a,b,需要配置beetlsql如下配置

    beetlsql.ds.a.basePackage=com.bee.sample.ch5.xxxdao.
    beetlsql.ds.b.basePackage=com.bee.sample.ch5.yyyydao
    beetlsql.mutiple.datasource=a,b

    以beetlsql.ds 为前缀,需要分别配置每个数据源的basePackage,nameConversion等配置,如果没有,则使用默认配置,比如beetlsql.ds.a.nameConversion= ….OralceStyle;beetlsql.ds.b.nameConversion= ….MySqlStyle;beetlsql.mutiple.datasource 则配置了多个数据源列表。

    如果需要定制每一个SQLManager,需要提供BeetlSqlMutipleSourceCustomize

    @Bean
        public BeetlSqlMutipleSourceCustomize beetlSqlCustomize() {
            return new BeetlSqlMutipleSourceCustomize() {
                @Override
                public void customize(String dataSource,SQLManager sqlManager) {
                    //可以在这里添加各种扩展,指定主从等
                }
    
            };
        }

    JFinal集成和Demo

    在configPlugin 里配置BeetlSql

    默认会采用c3p0 作为数据源,其配置来源于jfinal 配置,如果你自己提供数据源或者主从,可以如下

    JFinalBeetlSql.init(master,slaves);

    在controller里,可以通过JFinalBeetlSql.dao 方法获取到SQLManager

    SQLManager dao = JFinalBeetlSql.dao();
    BigBlog blog = getModel(BigBlog.class);
    dao.insert(BigBlog.class, blog);

    如果想控制事物,还需要注册Trans

    public void configInterceptor(Interceptors me) {
        me.addGlobalActionInterceptor(new Trans());
    }

    然后业务方法使用

    @Before(Trans.class)
    public void doXXX(){....}

    这样,方法执行完毕才会提交事物,任何RuntimeException将回滚,如果想手工控制回滚.也可以通过

    如果习惯了JFinal Record模式,建议用户创建一个BaseBean,封装SQLManager CRUD 方法即可。然后其他模型继承此BaseBean

    动态切换数据源

    Spring提供了一个AbstractRoutingDataSource,可以使用此类构建DataSource从而完成数据源切换操作,在BeetlSQL里,这要求数据源对应的数据库schema 是一样的,否则切换到其他数据源会出现找不到表,或者列不匹配情况。

    也可以参考org.beetl.sql.ext.spring.MultiTenantSpringConnectionSourcece 实现一个SQLManager的ConnectionSource,这是再BeetlSQL层进行数据源切换,代码如下