最近公司其它部门的同事还有朋友都表示对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。
时间: 2024-10-10 22:59:24