合成PreparedStatement插入语句
String preparedStatementInsert = ""; Map<String, Object> _m = new LinkedHashMap(listRecord.get(0));//获取一条记录,作为创建preparedStatementSQL语句的依据 Object maxFieldValue = null; String[] tableFields = db.getFields(tableName);//表中的字段名的集合 //db是DbCenter的一个实例 String[] tableKeys = db.getKeys(tableName);//表中的主键字段集 if (autoInsertKey) { Map lastRecord = this.queryLastRecord(tableName);//准备自动插入的主键 if (tableKeys.length > 0) { maxFieldValue = lastRecord.get(tableKeys[0]); _m.put(tableKeys[0], "");//防止记录中不含tableKeys[0]主键字段 } else { maxFieldValue = lastRecord.get(tableFields[0]); _m.put(tableFields[0], "");//防止记录中不含tableKeys[0]主键字段 } } Object[] recordFields = (_m.keySet()).toArray(); //获取记录里的字段名的集合 //private JadeTool tool = new JadeTool(); for (int i = 0; i < recordFields.length; i++) { if (!tool.isInFields(tableFields, recordFields[i].toString())) { _m.remove(recordFields[i].toString());//移除无效字段, 查看记录中的字段在表中是否存在,如果不存在,则移除 } } Object[] fields = (_m.keySet()).toArray(); //过滤后的有效字段 String[] values = new String[fields.length]; //保存通配符'?' for (int i = 0; i < fields.length; i++) { values[i] = "?"; } String sql_field = tool.arryToString(fields, ","); String sql_values = tool.arryToString(values, ","); preparedStatementInsert = "insert into " + tableName + " (" + sql_field + " ) values (" + sql_values + ")";//合成preparedStatement语句
完整地源代码参见源文件ProcessVO.java的方法_preparedStatementInsert。
通过以上算法,可以看出,JadePool不需要xml映射、注入映射,而是通过查询已经实例化的DbCenter实例得到数据库的结构信息;对照数据库结构信息过滤掉无效字段,进一步区分主键字段、非主键字段,针对有效字段进一步合成插入语句;因此,JadePool插入操作具有较高的智能化水平,给JadePool用户带来了方便。