实现通用的PreparedStatement插入记录的方法
准确的说是实现通用的PreparedStatement通配符对应的赋值方法。在合成PreparedStatement插入语句、找到SQL字段类型与Java类的对应关系之后,就可以实现通用的PreparedStatement插入数据的方法了。
在实现通用的PreparedStatement插入记录的方法过程中,JadePool已经解决好了以下的现实需求:
1、支持不同的数据类型的表单录入,除了流文件类型外,其它任何类型的数据均可以用字符串的形式表达;2、支持图片、多媒体等所有流文件的录入;
3、支持主键键值的自动生成;
4、支持空值录入;
5、针对不同的数据录入,如有异常,则统一抛出SQLException异常;
6、拆分条件语句,更精准地表达逻辑,优先安排高频度数据类型进行条件判断;
7、提供了灵活方便的日期型数据的录入。
以下是实现PreparedStatement通配符对应的赋值方法的核心代码
//以下列出所有的PreparedStatement支持的数据类型,大约28个数据类型,近50个方法 java.util.Calendar calendar = new GregorianCalendar(2013, 3 - 1, 13); Object value = new Object(); int index = 1; int int_sqlType = java.sql.Types.INTEGER;//4 int int_scaleOrLength = 4; int bytes_size = 256; int int_length = 10; long long_length = 10l; String str_sqlTypeName = "LONG"; pstmt.setArray(index, (java.sql.Array) value); pstmt.setAsciiStream(index, (java.io.InputStream) value); pstmt.setAsciiStream(index, (java.io.InputStream) value, int_length); pstmt.setAsciiStream(index, (java.io.InputStream) value, long_length); pstmt.setBigDecimal(index, (java.math.BigDecimal) value); pstmt.setBinaryStream(index, (java.io.InputStream) value); pstmt.setBinaryStream(index, (java.io.InputStream) value, int_length); pstmt.setBinaryStream(index, (java.io.InputStream) value, long_length); pstmt.setBlob(index, (java.sql.Blob) value); pstmt.setBlob(index, (java.io.InputStream) value); pstmt.setBlob(index, (java.io.InputStream) value, long_length); pstmt.setBoolean(index, (Boolean) value); pstmt.setByte(index, (byte) 30); pstmt.setBytes(index, (byte[]) value); pstmt.setCharacterStream(index, (java.io.Reader) value); pstmt.setCharacterStream(index, (java.io.Reader) value, int_length); pstmt.setCharacterStream(index, (java.io.Reader) value, long_length); pstmt.setClob(index, (java.sql.Clob) value); pstmt.setClob(index, (java.io.Reader) value); pstmt.setClob(index, (java.io.Reader) value, long_length); pstmt.setDate(index, (java.sql.Date) value); pstmt.setDate(index, (java.sql.Date) value, calendar); pstmt.setDouble(index, (java.lang.Double) value); pstmt.setFloat(index, (java.lang.Float) value); pstmt.setInt(index, (java.lang.Integer) value); pstmt.setLong(index, (java.lang.Long) value); pstmt.setNCharacterStream(index, (java.io.Reader) value); pstmt.setNCharacterStream(index, (java.io.Reader) value, 123l); pstmt.setNClob(index, (java.sql.NClob) value); pstmt.setNClob(index, (java.io.Reader) value); pstmt.setNClob(index, (java.io.Reader) value, 123l); pstmt.setNString(index, (String) value); pstmt.setNull(index, int_sqlType); pstmt.setNull(index, int_sqlType, str_sqlTypeName); pstmt.setObject(index, value); pstmt.setObject(index, value, int_sqlType); pstmt.setObject(index, value, int_sqlType, int_scaleOrLength); pstmt.setRef(index, (java.sql.Ref) value); pstmt.setRowId(index, (java.sql.RowId) value); pstmt.setSQLXML(index, (java.sql.SQLXML) value); pstmt.setShort(index, (java.lang.Short) value); pstmt.setString(index, (java.lang.String) value); pstmt.setTime(index, (java.sql.Time) value); pstmt.setTimestamp(index, (java.sql.Timestamp) value); pstmt.setTimestamp(index, (java.sql.Timestamp) value, calendar); pstmt.setURL(index, (java.net.URL) value); pstmt.setUnicodeStream(index, (java.io.InputStream) value, int_length);
今后的建议:
对于未实现的赋值方法,在需要的时候,可以既有的代码的条件部分加以实现;
对于未来未知的数据库供应商定义的Java类,如:com.sybase.jdbc2.tds.SybTimestamp,可以参照核心代码的相应部分实现