代码拉取完成,页面将自动刷新
现在开发一个功能,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"));
@瞻总 是否可以考虑把这个集成到最新版本中?