JFinal Dao 集成到 Spring

        最近公司其它部门的同事还有朋友都表示对jfinal有很大的兴趣,我发现最主要的一点是jfianl极简风格和牛x的开发效率让大家为之兴奋,尤其是jfinal的dao设计。至于没有在新项目中进行尝试,因为好多项目需要对事务尤其是多库事务上进行处理,而这点也让大家犯难了起来。公司目前的项目是基于springmvc+mybatis,所以我将jfinal dao 集成到spring上,利用spring 强大的事务抽象能力解决事务难题。

      不说了,先上代码。。

    <bean id="jFinalDaoConfig" class="com.jfinal.plugin.activerecord.JFinalDaoConfig" init-method="init">
        <property name="configName" value="main" />
        <property name="dataSource" ref="dataSource"/>
        <property name="dialect">
             <bean class="com.jfinal.plugin.activerecord.dialect.AnsiSqlDialect"/>
        </property>
        <property name="modelsClasses">
            <set>
                 <value>test.AAA</value>
            </set>
        </property>        
    </bean>

        

public class JFinalDaoConfig {
    
    protected final Logger log = Logger.getLogger(getClass());
    
    public void init(){
        if (null == dialect) {
            log.warn("Using mysql dialect as default.");
            dialect = new MysqlDialect();//默认mysql方言
        }
        
        //config与dataSource相关绑定
        Config config = new Config(configName, dataSource, dialect);
        
        DbKit.addConfig(config);
        
        Iterator<Class<Model>> iterModel = modelsClasses.iterator();
        Class modelClass = null;
        
        while (iterModel.hasNext()) {
            modelClass = iterModel.next();
            
            Class superClass = modelClass.getSuperclass();
            if (null==superClass || superClass!=Model.class) {
                log.warn(modelClass + " should extends com.jfinal.plugin.activerecord.Model");
                continue;
            }
            
            DbKit.addModelToConfigMapping(modelClass, config);//model与config绑定
            
            TableBinding tb = (TableBinding) modelClass.getAnnotation(TableBinding.class);//获取model对应的表信息
            if (tb != null) {
                Table table = null;
                if (StrKit.notBlank(tb.pkName())) {
                    table = new Table(tb.tableName(), tb.pkName(), modelClass);
                } else {
                    table = new Table(tb.tableName(), modelClass);
                }
                
                tableList.add(table);
            }
        }

        if (!tableList.isEmpty()){
            TableBuilder.build(tableList, config);
        }
        Db.init();
    }
    
    private List<Table> tableList = new ArrayList<Table>();
    
    private String configName;
    private DataSource dataSource;
    private Dialect dialect;
    private Set<Class<Model>> modelsClasses;
    
    public void setConfigName(String configName) {
        if (configName == null) {
            throw new IllegalArgumentException("Config name can not be null");
        }
        this.configName = configName;
    }
    public void setDataSource(DataSource dataSource) {
        if (dataSource == null) {
            throw new IllegalArgumentException("DataSource can not be null");
        }
        this.dataSource = dataSource;
    }
    public void setDialect(Dialect dialect) {
        this.dialect = dialect;
    }
    public void setModelsClasses(Set<Class<Model>> modelsClasses) {
        this.modelsClasses = modelsClasses;
    }
}

    JFinalDaoConfig的作用就是将config与数据库绑定,模型与config进行绑定,这个类的作用我相信大家如果对jfinal比较熟悉,应该不难理解。

    jfianl Model、DbPro 的获取和释放连接采用了spring的DataSourceUtils进行替换

    //conn = config.getConnection();
       conn = DataSourceUtils.getConnection(config.getDataSource());

        JdbcUtils.closeStatement(pst);
        DataSourceUtils.releaseConnection(conn, config.getDataSource());

    由于jfianl某些类的可见性,JFinalDaoConfig需要放到com.jfinal.plugin.activerecord下

    这样就可以利用spring的事务和jfinal dao的方便性了。

    本文算是抛砖引玉,不正确之处还请大家指正。本文不涉及框架和轮子问题,可以理解为对jfianl致敬且需要对事务有更高期望的jfinaler。






转载于:https://my.oschina.net/idreamblue/blog/388875

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值