JFinal

登录 注册

SpringBoot or Spring 接入 Jfinal-Db 替换Mybatis和datasource资源池共享

基于Jfinal3.4(老版本也能如此操作,但是需要多一步就是了)

SpringBoot

// ========= SpringBoot ============
@Configuration
public class JDbConfig {
    @Autowired
	// 等待db1Source启动后注入
    @Qualifier("db1Source")
    private DataSource ds;
	
	/**
     * 注入
     * @return JDb (JDb enxtends Db)
     * @throws Exception
     */
    @Bean(name = "jdb")
    @Primary
    public JDb jdb() throws Exception {
    	ActiveRecordPlugin arp = new ActiveRecordPlugin(ds);
    	arp.getEngine().setSourceFactory(new ClassPathSourceFactory());
        arp.addSqlTemplate("/sql/all_sqls.sql");
    	// 启动Record容器
    	arp.start();    	    	
    	System.out.println("===Jfinal - Db启动成功===");
    	// Db初始化
    	JDb db = new JDb();  	
    	return db;
    }	
}


// ===== JDb.java ============
/**
 * 集成jfinal Db
 * @author MrYang
 *
 */
public class JDb extends Db{
}


springBoot到这里的配置就结束了,就是这么简单!!!

下面的部分是 SpringMvc 的部分


========= SpringMvc============

在xml里配置个项目启动类,然后将数据源赋予这个类即可

例如:

<!-- CoralDbc  -->
<bean id="jdb" class="cn.com.???.coral.core.db.JDb" init-method="start">
  <property name="datasource">
     <ref bean="datasource" />
  </property>
  <property name="sqlPath" value="/sql/all_sqls.sql" />
</bean>


       

/**
 * 集成jfinal Db
 * @author MrYang
 *
 */
public class JDb extends Db{
   @Autowired
   private DataSource datasource;
   private String sqlPath;
   public void start(){
        ActiveRecordPlugin arp = new ActiveRecordPlugin(datasource);
    	arp.getEngine().setSourceFactory(new ClassPathSourceFactory());
    	//
        arp.addSqlTemplate(sqlPath);
    	// 启动Record容器
    	arp.start();    	    	
    	System.out.println("===Jfinal - Db启动成功===");
   }
   
   public String getSqlPath(){
       return this.sqlPath;
   }
   
    public void getSqlPath(String sqlPath){
       this.sqlPath=sqlPath;
   }
}

      

    =============================================

如果是直接用 jfinal 事务去操作的,而不需要用到spring事务注解标签的,请忽略这部分内容

jfinal事务和spring事务,如何统一整合,直接使用spring的事务标签呢,这个需要单独建一个插件或者直接复写 com.jfinal.plugin.activerecord.Config.getConnection() 和getThreadLocalConnection()  方法
或者切面在 service 层实现(然后要求大家遵守约束规范)

Config.java

public final Connection getConnection() throws SQLException {
		//System.out.println("== 获取改造的连接 ==");
		return DataSourceUtils.getConnection(this.getDataSource());
}
// 开启tx事务时会去判断和影响,所以这里要注意
public final Connection getThreadLocalConnection() {
		//return threadLocal.get();
		return DataSourceUtils.getConnection(this.getDataSource());
	}


这样子,大家就可以愉快的用spring的事务玩耍了!!!! 

备注:两个事务事件请不要混用!!! 或者要改造的点就更多了!!!

==============================================


项目里使用的时候,直接注入即可

    @Autowired    
    JDb jdb;
    
    public void test(){
        // 接下来,你们懂的
        jdb.find("select count(1) from tb");
        // 读取sql脚本
        jdb.getSqlPara("index.getProjectList",100)
    }


对应的日志:


// jdb.find("select count(1) from tb");
2018-07-05 17:41:12.831|XNIO-2 task-1|DEBUG|{conn-10005, pstmt-20000} created.   select count(1) from tb

// jdb.getSqlPara("index.getProjectList",100)
Sql: 	select p.id,
		substring(p.title, 1, 100) as title,
		substring(p.content, 1, 180) as content,
		a.avatar,
		a.id as accountId
	from project p inner join account a on p.accountId = a.id
	where report < ?
	order by p.id asc limit 10

Para: [100]




评论

  • 07-05 16:40
    因为jfinal在某方面比spring强大多了,包括sql模板的部分,所以用了以上方法,就可以把 Mybatis 踢掉,实现高效的开发
  • 07-05 16:52
    要是再来一点使用的代码就好了,感谢你的分享
  • 07-05 17:44
    @JFinal 已添加
  • 07-05 18:05
    学习一下
  • 08-23 17:50
    jfinal事务和spring事务,如何统一整合 楼主能再说详细点吗 谢谢
  • 08-23 17:53
    jdb都是静态方法 注入好像意义不大
  • 09-08 14:29
    @晴天009 嗯,习惯性用法,因为我秉承spirng体系一脉,会比较舒服点,让spring-bean托管容器,是根本性意识
  • 09-08 14:43
    @晴天009 我文章有小改,关于tx事务和jfinal事务重叠的部分,需要替换对应的类和方法,建议做成中间插件覆盖即可
  • 发送