springboot整合jfinal中的ActiveRecordPlugin和enjoy,为后续做准备

springboot不熟,代码可优化空间比较大

spring.datasource.url=jdbc:mysql://****:3306/jfinal_club?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false&useInformationSchema=true
spring.datasource.username=root
spring.datasource.password=****
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8


 

package com.skywalker.arp.config;

import com.alibaba.druid.wall.WallFilter;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.template.source.ClassPathSourceFactory;
import com.mysql.jdbc.Connection;
import com.skywalker.model._MappingKit;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ActiveRecordPluginConfig {

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;

    @Value("${spring.datasource.url}")
    private String url;

    @Bean
    public ActiveRecordPlugin ininitActiveRecordPlugin(){
        DruidPlugin druidPlugin= new DruidPlugin(url,username,password);
        // 加强数据库安全
        WallFilter wallFilter=new WallFilter();
        wallFilter.setDbType("mysql");
        druidPlugin.addFilter(wallFilter);
        // 添加 StatFilter 才会有统计数据
        // druidPlugin.addFilter(new StatFilter());
        // 必须手动调用start
        druidPlugin.start();
        ActiveRecordPlugin arp=new ActiveRecordPlugin(druidPlugin);
        arp.setTransactionLevel(Connection.TRANSACTION_READ_COMMITTED);
        _MappingKit.mapping(arp);
        arp.setShowSql(false);
        arp.getEngine().setSourceFactory(new ClassPathSourceFactory());
        arp.addSqlTemplate("/sql/all_sqls.sql");
        // 必须手动调用start
        arp.start();
        return arp;
    }

}

EnjoyConfig抄jfinal文档即可。copy了很多次,不知道为什么会格式乱掉

评论区

JFinal

2019-03-11 16:23

jfinal 3.7 发布的同时,会发布 ActiveRecordPlugin 的独立版本,大量的 spring boot 项目在使用 ActiveRecordPlugin

GSir

2019-03-11 18:07

@JFinal 这个好!

沙发迪

2019-03-13 09:37

mr_wangyan

2019-03-21 10:28

波总 ActiveRecordPlugin的独立版本在哪里?@JFinal

JFinal

2019-03-21 10:49

@mr_wangyan 在 maven 库里,已经可以直接使用了:
https://search.maven.org/search?q=a:activerecord

只要引入 maven 坐标就可以了,源码里面也给了 demo,极简实例在此:
https://gitee.com/jfinal/activerecord/tree/master/src/test/java/com/jfinal/plugin/activerecord

当然,实例看文档也是一样的

JFinal

2019-03-21 10:50

@GSir @沙发迪 jfinal activerecord 已独立发布到中心库:
https://search.maven.org/search?q=a:activerecord

mr_wangyan

2019-03-21 11:28

@JFinal 波总厉害...爱你

mr_wangyan

2019-03-21 11:31

@JFinal 波总,这个如果用在springboot项目里,关于事物的处理是不是要做特殊操作?不能直接使用spring的 @Transactional

JFinal

2019-03-21 11:46

@mr_wangyan 参考 jfinal 的 Tx 拦截器,在 springboot 里面也做一个 springboot 的拦截器就可以了,机制是一样的,只是实现方式不同

你甚至可以将拦截器的代码进一步简化,直接在 Spring boot 的拦截器用上 Db.tx 就可以了

mr_wangyan

2019-03-21 13:17

@JFinal 好像不是这样的吧.如果是自己定义的拦截器那 @Transactional(rollbackFor = Exception.class, noRollbackFor = NoRollbackException.class) rollbackFor ,noRollbackFor 这些相关操作都要在拦截器里重新实现一遍对吗?不知道我理解的对不对

JFinal

2019-03-21 16:43

@mr_wangyan 这种需求在拦截器里面使用 Db.tx 机制实现起来简单,下面给出 jfinal 拦截器的实现方式:
Db.tx(() -> {
try {
inv.invoke();
return true;
} catch (Exception e) {
Transactional tx = inv.getMethod().getAnnotation(Transactional);
Class rollbackFor = tx.rollbackFor;
if (e instanceof rollbackFor) {
return false;
}

Class noRollbackFor = tx.noRollbackFor;
if (e instanceof noRollbackFor) {
return true;
}

// 其它异常是否要回滚,选择 return xxx
return true;
}
});

与上面的方式类似,你可以使用 spring boot 的拦截器也来实现 Db.tx 机制

mr_wangyan

2019-03-22 11:43

@JFinal service 是需要带返回值的,使用Db.tx 那么lambda就返回不了东西了.这种不可行啊.

JFinal

2019-03-22 12:02

@mr_wangyan 你的 Db.tx 是在拦截器中使用,专门用于开启事务的,而你的 Service 中该怎么用还怎么用,完全透明,无需理会 Db.tx 的存在

GSir

2019-03-23 06:42