码迷,mamicode.com
首页 > 编程语言 > 详细

JFinal Dao 集成到 Spring

时间:2015-03-19 13:29:20      阅读:256      评论:0      收藏:0      [点我收藏+]

标签:

        最近公司其它部门的同事还有朋友都表示对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。






JFinal Dao 集成到 Spring

标签:

原文地址:http://my.oschina.net/idreamblue/blog/388875

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!