在Java中查询Oracle单表的万能方法
2019-01-26 22:05
507 查看
public abstract class BaseDao<T> { public List<T> getList(Class<T> clazz, String sql, Object... params) { List<T> list = new ArrayList<>(); Connection conn = JdbcUtil.getConnection(); PreparedStatement stmt = null; ResultSet rs = null; try { stmt = conn.prepareStatement(sql); // 给占位符?赋值 for (int i = 0; i < params.length; i++) { stmt.setObject(i + 1, params[i]); } rs = stmt.executeQuery(); // 从结果集中获取所有的字段 ResultSetMetaData md = rs.getMetaData(); while (rs.next()) { // 用反射创建一个对象 T obj = clazz.newInstance(); // 遍历所有的字段 for (int i = 1; i <= md.getColumnCount(); i++) { // 获取当前列的列名,如果列有别名,就返回别名 String columnName = md.getColumnLabel(i).toLowerCase(); // 获取字段的值 Object columnValue = rs.getObject(columnName); if (columnValue == null) { // 结束本次循环 continue; } // 获取字段值的简短类型,例如String,Integer String type = columnValue.getClass().getSimpleName(); // oracle会将number类型的字段解析成BigDecimal类型, //mysql会将int和integer类型解析成int或Integer类型 switch (type) { case "BigDecimal": // 如果值里面有".",要当成小数来获取 if (columnValue.toString().contains(".")) { columnValue = rs.getDouble(columnName); } else { columnValue = rs.getInt(columnName); } break; case "int": case "Integer": columnValue = rs.getInt(columnName); break; } // System.out.println("列名:" + columnName + ",字段值:" + // columnValue + ",类型:" + type); // 将获取到的字段的值封装到该字段对应的同名属性上 // 获取私有属性,根据属性名获取 Field field = clazz.getDeclaredField(columnName); // 去除私有属性访问限制 field.setAccessible(true); // 将字段值赋给对象的同名属性 field.set(obj, columnValue); } // System.out.println("*****************************************"); // 将对象添加到集合中 list.add(obj); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { JdbcUtil.closeAll(rs, stmt, conn); } return list; } /** * 公共查询方法2,返回1个实体对象 * 参数1:要封装的实体类对应的class对象,用实体类.class * 参数2:查询语句 * 参数3:给占位符赋值的数据 * * @return */ public T getBean(Class<T> clazz, String sql, Object... params) { // 创建要返回的对象 T obj = null; Connection conn = JdbcUtil.getConnection(); PreparedStatement stmt = null; ResultSet rs = null; try { stmt = conn.prepareStatement(sql); // 给占位符?赋值 for (int i = 0; i < params.length; i++) { stmt.setObject(i + 1, params[i]); } rs = stmt.executeQuery(); // 从结果集中获取所有的字段 ResultSetMetaData md = rs.getMetaData(); if (rs.next()) { // 用反射创建对象 obj = clazz.newInstance(); // 遍历所有的字段 for (int i = 1; i <= md.getColumnCount(); i++) { // 获取当前列的列名,如果列有别名,就返回别名 String columnName = md.getColumnLabel(i).toLowerCase(); // 获取字段的值 Object columnValue = rs.getObject(columnName); if (columnValue == null) { // 结束本次循环 continue; } // 获取字段值的简短类型,例如String,Integer String type = columnValue.getClass().getSimpleName(); // oracle会将number类型的字段解析成BigDecimal类型, mysql会将int和integer类型解析成int或Integer类型 switch (type) { case "BigDecimal": // 如果值里面有".",要当成小数来获取 if (columnValue.toString().contains(".")) { columnValue = rs.getDouble(columnName); } else { columnValue = rs.getInt(columnName); } break; case "int": case "Integer": columnValue = rs.getInt(columnName); break; } // System.out.println("列名:" + columnName + ",字段值:" + // columnValue + ",类型:" + type); // 将获取到的字段的值封装到该字段对应的同名属性上 // 获取私有属性,根据属性名获取 Field field = clazz.getDeclaredField(columnName); // 去除私有属性访问限制 field.setAccessible(true); // 将字段值赋给对象的同名属性 field.set(obj, columnValue); } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { JdbcUtil.closeAll(rs, stmt, conn); } return obj; } }
BaseDao的适用场合
只有当查询语句是针对单表,且不包含外键字段的时候,才能调用BaseDao中的getList()和getBean()
开发规范: 如果表中有外键,那么在该表对应的实体类中,要将外键映射成一个对象的属性,此时如果查询语句中有外键字段,就不能调用getList()和getBean()了
例如:
当查询语句中有外键时,就要自己手动处理结果集
while(rs.next()){ //遍历当前行的每一列 Emp emp=new Emp(); emp.setEmpno(rs.getInt("empno")); emp.setEname(rs.getString("ename")); emp.setSal(rs.getDouble("sal")); //将外键值封装到部门对象的部门编号属性上 Dept dept=new Dept(); dept.setDeptno(rs.getInt("deptno")); //建立员工和部门对象的关联 emp.setDept(dept); //把员工添加到集合中 list.add(emp); }
相关文章推荐
- 第五课 java查询oracle里的数据两种方法
- 在Java中增删改Oracle表的万能方法
- java oracle 日期时间模糊查询的方法
- (JDBC)利用Java反射编写一个万能的数据库表查询方法
- Java对象查询方法:Jxpath(转译)
- Java对象查询方法:Jxpath(转译)
- java分页查询 方法二 Criteria
- ORACLE中的几种TOP-N查询方法
- 树结构表递归查询在ORACLE和MSSQL中的实现方法 [续]
- ORACLE 的SQL查询连接方法
- oracle提高查询效率方法
- java连接操作Oracle出现的问题及解决方法
- Oracle中的JAVA存储过程 另两方法
- Oracle 9i中包含Connect by 子句的查询向Oracle 10g移植后运行时错误及解决方法
- 查询Oracle自带的方法名字和关键字
- Oracle存储过程中执行查询返回的结果集,并使用java代码调用【转】
- Java实现的TFIDF空间向量查询方法
- oracle查询并解除死锁的方法
- Hibernate SQLQuery 查询Oracle char类型结果为一个字符的解决方法
- Java对象查询方法:Jxpath