您的位置:首页 > 数据库 > Oracle

在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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: