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