JFinal

登录 注册

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了很多次,不知道为什么会格式乱掉

评论

  • 03-11 16:23
    jfinal 3.7 发布的同时,会发布 ActiveRecordPlugin 的独立版本,大量的 spring boot 项目在使用 ActiveRecordPlugin
  • 03-11 18:07
    @JFinal 这个好!
  • 03-13 09:37
    @JFinaL 给力
  • 03-21 10:28
    波总 ActiveRecordPlugin的独立版本在哪里?@JFinal
  • 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

    当然,实例看文档也是一样的
  • 03-21 10:50
    @GSir @沙发迪 jfinal activerecord 已独立发布到中心库:
    https://search.maven.org/search?q=a:activerecord
  • 03-21 11:28
    @JFinal 波总厉害...爱你
  • 03-21 11:31
    @JFinal 波总,这个如果用在springboot项目里,关于事物的处理是不是要做特殊操作?不能直接使用spring的 @Transactional
  • 03-21 11:46
    @mr_wangyan 参考 jfinal 的 Tx 拦截器,在 springboot 里面也做一个 springboot 的拦截器就可以了,机制是一样的,只是实现方式不同

    你甚至可以将拦截器的代码进一步简化,直接在 Spring boot 的拦截器用上 Db.tx 就可以了
  • 03-21 13:17
    @JFinal 好像不是这样的吧.如果是自己定义的拦截器那 @Transactional(rollbackFor = Exception.class, noRollbackFor = NoRollbackException.class) rollbackFor ,noRollbackFor 这些相关操作都要在拦截器里重新实现一遍对吗?不知道我理解的对不对
  • 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 机制
  • 03-22 11:43
    @JFinal service 是需要带返回值的,使用Db.tx 那么lambda就返回不了东西了.这种不可行啊.
  • 03-22 12:02
    @mr_wangyan 你的 Db.tx 是在拦截器中使用,专门用于开启事务的,而你的 Service 中该怎么用还怎么用,完全透明,无需理会 Db.tx 的存在
  • 03-23 06:42
  • 发送