3.2K Star 8.8K Fork 3.6K

GVPJFinal / JFinal

 / 详情

建议Db.save新增 SqlPara 的支持用于采用SQL语句模板并能返回主键的需求

待办的
创建于  
2018-03-13 00:27

现在开发一个功能,A表的主键是自增型,而insert语句我有一个排序字段,它的值是来自该表max({排序字段})+1,若采用Db.save原有的方法,是没有采用自定义SQL语句的保存方法,从而改为用Db.update来操作虽然保存成功,但是却获得不到主键导致后续关联表操作缺失主键而报错!所以自己就修改了 DbPro 和 DB 的源码

DbPro 文件新增以下两个方法,用于采用自定义SqlPara插入语句并能获得自增主键

/**
	 * 新增执行 SQL模板中的insert语句
	 * @param sqlPara
	 * @param primaryKey  主键字符串,多个用英文逗号分隔
	 * @param primaryValue 主键值map对象,适用于单个或者多个主键值的返回(其实还有更好的方法,不过需要修改SqlPara添加相关的主键值对象来完成,感觉影响有点大就只能暂时用这个对象来存储主键值了)
	 * @return
	 */
	
	public boolean save(SqlPara sqlPara, String primaryKey, Map<String,Object> primaryValue) {
		Connection conn = null;
		try {
			conn = config.getConnection();
			return save(config, conn, sqlPara, primaryKey, primaryValue);
		} catch (Exception e) {
			throw new ActiveRecordException(e);
		} finally {
			config.close(conn);
		}
	}
	/**
	 * 新增执行 SQL模板中的insert语句
	 * @param config
	 * @param conn
	 * @param sqlPara
	 * @param primaryKey  主键字符串,多个用英文逗号分隔
	 * @param primaryValue 主键值map对象,适用于单个或者多个主键值的返回(其实还有更好的方法,不过需要修改SqlPara添加相关的主键值对象来完成,感觉影响有点大就只能暂时用这个对象来存储主键值了)
	 * @return
	 * @throws SQLException
	 */
	boolean save(Config config, Connection conn,SqlPara sqlPara,String primaryKey,Map<String,Object> primaryValue)throws SQLException{
		String[] pKeys = primaryKey.split(",");
		
		PreparedStatement pst;
		if (config.dialect.isOracle()) {
			pst = conn.prepareStatement(sqlPara.getSql(), pKeys);
		} else {
			pst = conn.prepareStatement(sqlPara.getSql(), Statement.RETURN_GENERATED_KEYS);
		}
		config.dialect.fillStatement(pst, sqlPara.getPara());
		int result = pst.executeUpdate();
		ResultSet rs = pst.getGeneratedKeys();
		primaryValue = primaryValue == null ? new HashMap<String,Object>(): primaryValue;
		for (String pKey : pKeys) {
			System.out.println("pKey:"+pKey);
			if (primaryValue.get(pKey) == null || config.dialect.isOracle()) {
				if (rs.next()) {
					primaryValue.put(pKey, rs.getObject(1));	// It returns Long for int colType for mysql
				}
			}
		}
		rs.close();
		DbKit.close(pst);
		return result >= 1;
	}

Db 新增以下方法

public static boolean save(SqlPara sqlPara, String primaryKey, Map<String,Object> primaryValue){
		return MAIN.save(sqlPara, primaryKey, primaryValue);
	}

使用

Map<String,Object> primaryValue = new HashMap<String,Object>();
Db.save(Db.getSqlPara("xxx.insert", params),"xxx_id",primaryValue);

System.out.println("主键:"+primaryValue.get("xxx_id"));

@瞻总 是否可以考虑把这个集成到最新版本中?

评论 (0)

LinCH 创建了任务

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(1)
Java
1
https://gitee.com/jfinal/jfinal.git
git@gitee.com:jfinal/jfinal.git
jfinal
jfinal
JFinal

搜索帮助