【文件属性】:
文件名称:java万能DAO
文件大小:6KB
文件格式:JAVA
更新时间:2015-05-15 09:12:37
commonDAO.java
所有业务逻辑类皆可调用该类
package com.parddu.dao;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* 通用DAO类
* @author parddu
* @version Sep 29, 2010 10:16:23 AM
*/
public class CommonDAO {
/**
* 修改数据
* @param sql sql语句
* @param param 参数列表
* @return 修改记录行数
*/
public int update(String sql,List param){
int row = -1;
Connection conn = null;
PreparedStatement update = null;
try {
conn = DButil.getConn();
update = conn.prepareStatement(sql);
this.setParam(update, param);
row = update.executeUpdate();
}
catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
finally{
DButil.closeConn(update, conn);
}
return row;
}
/**
* 查询数据
* @param sql sql语句
* @param param 参数
* @return 结果集HashMap<列名,值对象>
*/
public List query(String sql,List param) {
List list = new ArrayList();
Connection conn = null;
PreparedStatement query = null;
ResultSet rs = null;
try {
conn = DButil.getConn();
query = conn.prepareStatement(sql);
this.setParam(query, param);
rs = query.executeQuery();
if(rs!=null){
//取得所有的列名
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
String[] columnNameArray = new String[columnCount];
for(int i=0;i hm = new HashMap();
for(String cn : columnNameArray){
hm.put(cn, rs.getObject(cn));
}
list.add(hm);
}
}
}
catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
finally{
DButil.closeConn(rs,query, conn);
}
return list;
}
/**
* 查询数据
* @param sql sql语句
* @param param 参数
* @return 结果集List<实体对象>
*/
public List query(String sql,List param,Class cla){
List list = new ArrayList();
Connection conn = null;
PreparedStatement query = null;
ResultSet rs = null;
try {
conn = DButil.getConn();
query = conn.prepareStatement(sql);
this.setParam(query, param);
rs = query.executeQuery();
if(rs!=null){
//取得所有的列名
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
String[] columnNameArray = new String[columnCount];
for(int i=0;i mList = new ArrayList();
for(String columnName : columnNameArray){
Method m = this.getMethod(cla,columnName);
if(m!=null){
PropertyMthod pm = new PropertyMthod(m,columnName);
mList.add(pm);
}
}
//读取结果
while(rs.next()){
Object o = cla.newInstance();
for(PropertyMthod pm : mList){
this.invokeSetMethod(o, pm.getMethod(), rs, pm.getColumn());
}
list.add(o);
}
}
}
catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
finally{
DButil.closeConn(rs,query, conn);
}
return list;
}
/**
* 调用目标对象的set方法
* @param o 目标对象
* @param m set方法
* @param rs 结果集
* @param columnName 列名
* @throws SecurityException
* @throws NoSuchMethodException
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
private void invokeSetMethod(Object o,Method m,ResultSet rs,String columnName)
throws SecurityException, NoSuchMethodException,
IllegalArgumentException, IllegalAccessException,
InvocationTargetException{
String paramType = m.getParameterTypes()[0].getName();
paramType = paramType.substring(paramType.lastIndexOf(".")+1);
/*****特殊类型处理******/
if("Integer".equals(paramType)){
paramType = "Int";
}
String strName = "get" + this.firstUpper(paramType);
Method rsMethod = rs.getClass().getDeclaredMethod(strName, String.class);
m.invoke(o, rsMethod.invoke(rs, columnName));
}
/**
* 匹配指定列名的set方法
* @param o
* @param column
* @return
* @throws NoSuchMethodException
* @throws SecurityException
*/
private Method getMethod(Class o,String column)
throws SecurityException, NoSuchMethodException{
Method m = null;
List strList = new ArrayList();
/********set方法转换设置***********/
strList.add(column);
//去掉下划线stu_name--->stuName
strList.add(this.delLine(column,"_"));
boolean flage = false;
Method[] mlist = o.getDeclaredMethods();
for(Method tempm : mlist){
for(String s:strList){
String name = "set"+this.firstUpper(s);
if(tempm.getName().equals(name)){
m=tempm;
flage = true;
break;
}
}
if(flage){
break;
}
}
if(!flage){
System.out.println("查询列名" + column +
"在实体中无方法名匹配,值将不会被设置!");
}
return m;
}
/**
* 删除列分割符
* @return
*/
private String delLine(String str,String fg){
String result = str;
if(str.indexOf(fg)!=-1){
result = str.substring(0,str.indexOf(fg))+
this.firstUpper(str.substring(str.indexOf(fg)+1));
result = delLine(result,fg);
}
return result;
}
/**
* 将给定字符串首字母修改为小写
* @param str 字符串
* @return 转换后的字符串
*/
private String firstUpper(String str){
return (str.charAt(0)+"").toUpperCase()+str.substring(1);
}
/**
* 设置参数
* @param ps 预编译对象
* @param param 参数集合
* @throws SQLException
*/
private void setParam(PreparedStatement ps,List param) throws SQLException{
if(param!=null&¶m;.size()>0){
for(int i=0;i