封装工具类SQL查询注意事项
在测试封装工具类SQL查询时出现Exception in thread "main"的警告
at util.DUtil.select(DUtil.java:36)
at util.Test.main(Test.java:10)
SQL查询的封装问题所在
Class cls = Class.forName(ClassName);
//获取成员变量存入field数组
Field [] fields = cls.getDeclaredFields();
//使用工具类连接数据库静态处理块
Statement st = GetConn.getStatement();
ResultSet rs = st.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
String [] colname = new String[rsmd.getColumnCount()];
**for (int i = 1; i < colname.length; i++) {**
colname[i - 1] = rsmd.getColumnName(i);
}
报错的行没问题 , 研究半天发现主要是上文出现的代码中
for (int i = 1; i < colname.length; i++) {
缺少了“=”,使得最后一个値没有赋到。
SQL查询的封装注意事项
重点在于反射与通过工具类连接数据库创建静态处理块
Class cls = Class.forName(ClassName);
//获取成员变量存入field数组
Field [] fields = cls.getDeclaredFields();
使用工具类连接数据库静态处理块
Statement st = GetConn.getStatement();
ResultSet rs = st.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
以及后面多得多重嵌套循环
String [] colname = new String[rsmd.getColumnCount()];
for (int i = 1; i <= colname.length; i++) {
colname[i - 1] = rsmd.getColumnName(i);
}
while (rs.next()) {
Object obj = cls.newInstance();
arrayList.add(obj);
for (String columnn : colname) {
for (Field field : fields) {
再之后就是查找对应的属性对对象进行赋值
if (field.getName().toUpperCase().equals(columnn.toUpperCase())) {
if ("int".equals(field.getType().getName())) {
field.set(obj, rs.getInt(columnn));
}else if ("java.sql.Date".equals(field.getType().getName())) {
field.set(obj, rs.getDate(columnn));
}else if ("float".equals(field.getType().getName())) {
field.set(obj, rs.getFloat(columnn));
}else if ("java.lang.String".equals(field.getType().getName())) {
field.set(obj, rs.getString(columnn));
}
以上就是对封装SQL查询的经验