public class BaseDao { /**
* 反射封装查询
*/
public static List queryList(String tableName,Object obj) throws Exception{
Class c = obj.getClass();//获取映射对象
Field[] f = c.getDeclaredFields();//获取传进来的对象的所有属性
Connection conn = ConnUtil.getConn();
StringBuilder sql = new StringBuilder("select * from "+tableName+" t where 1=1 ");
List valueList = new ArrayList();//如果属性值不为空,我就把值保存到valueList内
for(int i = 0;i<f.length;i++){
String str = f[i].getName();//获取属性名
//拼接属性对象的访问器方法名
String methodName = "get"+str.substring(0,1).toUpperCase()+str.substring(1);
Method m = c.getMethod(methodName);
Object value = m.invoke(obj, null);//调用属性对象的访问器,获取返回值
if(value != null){
valueList.add(value);
sql.append(" and t."+str+" = ?");
}
}
PreparedStatement ps = conn.prepareStatement(sql.toString());//预处理sql语句
//填坑
int count = 0;
for(int i = 0;i<valueList.size();i++){
ps.setObject(++count, valueList.get(i));
}
ResultSet rs = ps.executeQuery();//获取结果集
List result =new ArrayList();//定义返回结果集合
while(rs.next()){
Object o = c.newInstance();
for(int i = 0;i<f.length;i++){
String name = f[i].getName();
String methodSetName = "set"+name.substring(0,1).toUpperCase()+name.substring(1);
Method mSet = c.getMethod(methodSetName,f[i].getType());
String[] fieldType = f[i].getType().getName().split("\\.");
if(rs.getObject(name) != null){
String[] resultValue = rs.getObject(name).getClass().getName().split("\\.");
if(resultValue[resultValue.length-1].equals("BigDecimal")){
if(fieldType[fieldType.length-1].equ("Integer")){
mSet.invoke(o, ((BigDecimal)rs.getObject(name)).intValue());
}else if (fieldType[fieldType.length-1].equals("Double")){
mSet.invoke(o, ((BigDecimal)rs.getObject(name)).doubleValue());
}else if(fieldType[fieldType.length-1].equals("Long")){
mSet.invoke(o, ((BigDecimal)rs.getObject(name)).longValue());
}
}else if(resultValue[resultValue.length-1].equals("Date")){
mSet.invoke(o,((java.sql.Date)rs.getObject(name)).toString());
}else{
mSet.invoke(o,rs.getObject(name));
}
}
}
result.add(o);
}
return result;
}
}
我这里用一个表测了一下,里面有一个日期型的,我把它定义成string了,但是查的时候有问题了,就是上面的sql.append(" and t."+str+" = ?");
这句话,如果t.str在oracle里是日期的话,而问号时字符串类型的话,这个该怎么封装呀,难道用日期就不可以查了吗?
* 反射封装查询
*/
public static List queryList(String tableName,Object obj) throws Exception{
Class c = obj.getClass();//获取映射对象
Field[] f = c.getDeclaredFields();//获取传进来的对象的所有属性
Connection conn = ConnUtil.getConn();
StringBuilder sql = new StringBuilder("select * from "+tableName+" t where 1=1 ");
List valueList = new ArrayList();//如果属性值不为空,我就把值保存到valueList内
for(int i = 0;i<f.length;i++){
String str = f[i].getName();//获取属性名
//拼接属性对象的访问器方法名
String methodName = "get"+str.substring(0,1).toUpperCase()+str.substring(1);
Method m = c.getMethod(methodName);
Object value = m.invoke(obj, null);//调用属性对象的访问器,获取返回值
if(value != null){
valueList.add(value);
sql.append(" and t."+str+" = ?");
}
}
PreparedStatement ps = conn.prepareStatement(sql.toString());//预处理sql语句
//填坑
int count = 0;
for(int i = 0;i<valueList.size();i++){
ps.setObject(++count, valueList.get(i));
}
ResultSet rs = ps.executeQuery();//获取结果集
List result =new ArrayList();//定义返回结果集合
while(rs.next()){
Object o = c.newInstance();
for(int i = 0;i<f.length;i++){
String name = f[i].getName();
String methodSetName = "set"+name.substring(0,1).toUpperCase()+name.substring(1);
Method mSet = c.getMethod(methodSetName,f[i].getType());
String[] fieldType = f[i].getType().getName().split("\\.");
if(rs.getObject(name) != null){
String[] resultValue = rs.getObject(name).getClass().getName().split("\\.");
if(resultValue[resultValue.length-1].equals("BigDecimal")){
if(fieldType[fieldType.length-1].equ("Integer")){
mSet.invoke(o, ((BigDecimal)rs.getObject(name)).intValue());
}else if (fieldType[fieldType.length-1].equals("Double")){
mSet.invoke(o, ((BigDecimal)rs.getObject(name)).doubleValue());
}else if(fieldType[fieldType.length-1].equals("Long")){
mSet.invoke(o, ((BigDecimal)rs.getObject(name)).longValue());
}
}else if(resultValue[resultValue.length-1].equals("Date")){
mSet.invoke(o,((java.sql.Date)rs.getObject(name)).toString());
}else{
mSet.invoke(o,rs.getObject(name));
}
}
}
result.add(o);
}
return result;
}
}
我这里用一个表测了一下,里面有一个日期型的,我把它定义成string了,但是查的时候有问题了,就是上面的sql.append(" and t."+str+" = ?");
这句话,如果t.str在oracle里是日期的话,而问号时字符串类型的话,这个该怎么封装呀,难道用日期就不可以查了吗?
解决方案 »
- 在myeclipse中如何将JAVA小程序做成可以执行的文件,如JAR或BAT?
- 最通常的按任一键退出的方法是什么??
- 多线程 多个JDBC并行实现
- 如何判断一个15位身份证号为有效的身份证号??
- 请问,数据库编程如何做单元测试呢?网络编程如何做单元测试?
- 如何用POI取得Excel单元格的背景颜色?
- java的datasource使用sqlserver2005不能连接的问题。紧急呀!
- 奇怪了,这段代码会报错??
- 请问什么叫API?它有什么用?
- 磐英的板子-7KXA 能不能支持80或120G的硬盘,另外买什么硬盘好些?
- 求教java中关于事件监听的一个问题
- java serversocket在win7上的问题
str是表里的字段名吗?
果果,你要考虑到布尔型的is
String methodName = "get"+str.substring(0,1).toUpperCase()+str.substring(1);
DAO层处理的东西太多了。用反射处理这个,不一定是最好的,效率会比较低下的。