1
回答
能不能添加一个tx(LinkedHashMap<String,Object[]> sqlAndParas)方法?
华为云4核8G,高性能云服务器,免费试用   

@JFinal 你好,想跟你请教个问题:

由于项目中频繁使用db.tx方法,每次都要写一些IAtom()的样板代码,费时费力,代码还不简洁,能不能封装一个简洁些的方法,我的大概想法是在db类中添加如下方法:

/**
	 * Execute blend and different of SQL INSERT, UPDATE, or DELETE in one transaction
	 * Example:
	 * Construct a parameter that follows the structure as below
	 * {
	 * 	{"insert into user(name, cash) values(?, ?)",{"James", 888}},
	 *  {"update table1 set column=? ",{123}},
	 *  {"delete from table2",null}
	 * }
	 * boolean result = db.tx(sqlAndParas);
	 * @param config
	 * @param conn
	 * @param sqlAndParas
	 * @return
	 */
	public static boolean tx(LinkedHashMap<String,Object[]> sqlAndParas){
		Connection conn = null;
		Boolean autoCommit = null;
		boolean rtn = true;
		try {
			conn = config.getConnection();
			autoCommit = conn.getAutoCommit();
			conn.setAutoCommit(false);
		    Object[] nullParas = new Object[0];
		    for (Iterator it =  sqlAndParas.keySet().iterator();it.hasNext();){
			    Object sql = it.next();
			    Object[] paras = sqlAndParas.get(sql) == null? nullParas:sqlAndParas.get(sql);
			    this.update(config, conn, (String)sql, paras);
		    }
		    conn.commit();
		} catch (SQLException e) {
			e.printStackTrace();
			rtn = false;
		} finally {
			if (autoCommit != null)
				try { conn.setAutoCommit(autoCommit); } catch (SQLException e) { e.printStackTrace(); }
			config.close(conn);
		}
		return rtn;
	}

这样的话就省去了写如下的样板代码

new IAtom(){
    public boolean run() throws SQLException {
        ... ...
    }
}

不知道这种想法是否可行?

举报
贝宝明
发帖于11个月前 1回/62阅

    频繁的使用 Db.tx(IAtom) 方法,自然是做点封装更能节省代码,例如可以封装一个 DbExt 工具类,里面放一些常用的扩展就好

    还有一个办法就是使用 java 8 的 lambda表达式,代码量也会少很多,不需要再 new IAtom 了

--- 共有 1 条评论 ---
贝宝明自己封装一个dbExt也是一个方式,但是这样的话,让开发人员读JFinal文档时候,文档中里面写的都是db.xxx()方法,而实际写代码的时候用dbExt.xxx()方法,有些混乱! 11个月前 回复
顶部