自己做项目的时候研究了一下反射机制,发现还是很强大的。。。下面就是运用反射机制的JDBC封装。。。具体实现如下:
/**
* @title DatabaseHelper.java
* @package com.fashion.kokozu.util
* @description file
* @author kaka hu
* @update 2012-7-19 下午5:55:12
* @version V1.0
*/
package com.kokozu.fashion.util;
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.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.naming.NamingException;
import com.kokozu.fashion.bean.MovieBean;
/**
* @description class
* @version 1.0
* @author kaka hu
* @update 2012-7-19 下午5:55:12
*/
public class DatabaseHelper {
Connection conn = null;
PreparedStatement stmt=null;
ResultSet rs = null;
//insert
Set<String> insert_key = null;
Iterator<String> insert_index = null;
//update
Set<String> update_key = null;
Set<String> where_key = null;
Iterator<String> update_index = null;
Iterator<String> where_index = null;
//select
ArrayList<Map<String,String>> all_map = null;
Map<String,String> each_map= null;
//select
ArrayList<Object> all_object = null;
Class<?> class_object = null;
Iterator<String> select_index = null;
/**
* construction method of class
*/
public DatabaseHelper(){
try{
conn = DB.getConnection();
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @description 关闭连接,每个databasehelper的对象都必须调用此方法
* @version 1.0
* @author kaka hu
* @update 2012-8-3 上午10:49:30
*/
public void close() {
if(insert_key != null)
insert_key = null;
if(insert_index != null)
insert_index = null;
if(update_key != null)
update_key = null;
if(where_key != null)
where_key = null;
if(update_index != null)
update_index = null;
if(where_index != null)
where_index = null;
if(all_map != null)
all_map = null;
if(each_map != null)
each_map = null;
if(all_object != null)
all_object = null;
if(class_object != null)
class_object = null;
if(select_index != null)
select_index = null;
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.gc();
}
/**
* @param sql语句
* @return 如果update成功返回1,否则-1
* @description 直接运行一个sql语句的更新,插入,删除,记得要加''
* @version 1.0
* @author kaka hu
* @update 2012-8-3 上午10:50:22
*/
public int update(String sql){
try {
stmt = conn.prepareStatement(sql);
return stmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return -1;
}
/**
* @param table表名
* @param paras参数Map<String,String>
* @param get_id随意
* @return 自动生成的_id
* @description method
* @version 1.0
* @author kaka hu
* @update 2012-8-3 上午10:51:20
*/
public int insert(String table,Map<String,String> paras,boolean get_id){
if(paras.size() == 0)
return -1;
insert_key = paras.keySet();
try {
String sql = "insert into "+table+"(";
insert_index = insert_key.iterator();
while(insert_index.hasNext()){
sql += insert_index.next()+",";
}
sql = sql.substring(0,sql.length()-1);
sql += ") values(";
for(int i=0;i<paras.size();i++)
sql += "?,";
sql = sql.substring(0,sql.length()-1);
sql += ")";
stmt = conn.prepareStatement(sql);
insert_index = insert_key.iterator();
for(int i=1;i<=paras.size();i++){
stmt.setString(i, paras.get(insert_index.next()));
}
if(stmt.executeUpdate() == 1){
rs=stmt.getGeneratedKeys();
if(rs.next()){
return rs.getInt(1);
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return -1;
}
/**
* @param table表名
* @param paras参数
* @return 插入的结果,1为成功,否则-1
* @description method
* @version 1.0
* @author kaka hu
* @update 2012-8-3 上午10:52:16
*/
public int insert(String table,Map<String,String> paras){
if(paras.size() == 0)
return -1;
insert_key = paras.keySet();
try {
String sql = "insert into "+table+"(";
insert_index = insert_key.iterator();
while(insert_index.hasNext()){
sql += insert_index.next()+",";
}
sql = sql.substring(0,sql.length()-1);
sql += ") values(";
for(int i=0;i<paras.size();i++)
sql += "?,";
sql = sql.substring(0,sql.length()-1);
sql += ")";
stmt = conn.prepareStatement(sql);
insert_index = insert_key.iterator();
for(int i=1;i<=paras.size();i++){
stmt.setString(i, paras.get(insert_index.next()));
}
return stmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return -1;
}
/**
* @param table表名
* @param update参数set的部分
* @param where参数where的部分
* @param other其他的部分
* @return 成功返回1,否则-1
* @description method
* @version 1.0
* @author kaka hu
* @update 2012-8-3 上午10:52:42
*/
public int update(String table,Map<String,String> update,Map<String,String> where
,String other){
update_key = update.keySet();
where_key = where.keySet();
try {
String sql = "update "+table+" set ";
update_index = update_key.iterator();
while(update_index.hasNext()){
String key = update_index.next();
sql += key+"=?,";
}
sql = sql.substring(0,sql.length()-1);
sql += " where ";
where_index = where_key.iterator();
while(where_index.hasNext()){
String key = where_index.next();
sql += key+"=? and ";
}
sql = sql.substring(0,sql.length()-5);
sql += " "+other;
// System.out.println(sql);
stmt = conn.prepareStatement(sql);
int i=1;
update_index = update_key.iterator();
where_index = where_key.iterator();
for(i=1;i<=update.size();i++){
stmt.setString(i, update.get(update_index.next()));
}
for(int j=i;j<i+where.size();j++){
stmt.setString(j, where.get(where_index.next()));
}
return stmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return -1;
}
/**
* @param sql语句
* @param paras参数select的列
* @return ArrayList<Map<String,String> ,map中的key为传入的paras,如果有t1.也需要加上
* @description method
* @version 1.0
* @author kaka hu
* @update 2012-8-3 上午10:53:33
*/
public ArrayList<Map<String,String>> select(String sql,Set<String> paras){
if(paras == null)
return all_map;
try {
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
all_map = new ArrayList<Map<String,String>>();
while(rs.next()) {
each_map = new HashMap<String,String>();
select_index = paras.iterator();
while(select_index.hasNext()){
String key = select_index.next();
each_map.put(key, rs.getString(key));
}
all_map.add(each_map);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return all_map;
}
/**
* @param sql语句
* @param paras传入参数
* @param 反射机制,class_name类名的完整路径(类里面的每个成员都必须与表的列一致!!!)
* @return ArrayList<Object> 返回类的arraylist集合,需要最后转化
* @description method
* @version 1.0
* @author kaka hu
* @update 2012-8-3 上午10:54:41
*/
public ArrayList<Object> select(String sql,Set<String> paras,String class_name){
// System.out.println(sql);
try{
class_object = Class.forName(class_name);
}catch (Exception e) {
e.printStackTrace();
}
if(class_object == null)
return null;
try {
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
all_object = new ArrayList<Object>();
while(rs.next()) {
Object o = (Object)class_object.newInstance();
Method[] ms = class_object.getDeclaredMethods();
for(int i=0; i<ms.length; i++) {
String name = ms[i].getName();
select_index = paras.iterator();
if(name.startsWith("set")) { //搜索set方法
while(select_index.hasNext()) {
String key = select_index.next();
String param = rs.getString(key);
if(key.contains(".")){
key = key.split("\\.")[1];
}
Class<?>[] cc = ms[i].getParameterTypes();
if(key.equalsIgnoreCase(name.substring(3))) {
String type = cc[0].getName(); // 参数的类型,如果还有其他类型可以在else if中加
if (param != null && !param.equals("")) {
if (type.equals("java.lang.String")) {
ms[i].invoke(o,new Object[] { param });
break;
} else if (type.equals("int")
|| type.equals("java.lang.Integer")) {
ms[i].invoke(o,new Object[] { new Integer(param) });
break;
} else if (type.equals("long")
|| type.equals("java.lang.Long")) {
ms[i].invoke(o,new Object[] { new Long(param) });
break;
} else if (type.equals("boolean")
|| type.equals("java.lang.Boolean")) {
ms[i].invoke(o,new Object[] { Boolean.valueOf(param) });
break;
} else if (type.equals("double")
|| type.equals("java.lang.Double")) {
ms[i].invoke(o,new Object[] { new Double(param) });
break;
} else {
break;
}
}
}
}
}
}
all_object.add(o);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return all_object;
}
public static void main(String[] args){
DatabaseHelper dh = new DatabaseHelper();
Set<String> paras = new HashSet<String>();
paras.add("t2._id");
paras.add("t1.movie_name");
paras.add("t1.actor");
paras.add("t1.desc");
paras.add("t1.image_small");
paras.add("t1.image_big");
ArrayList<Object> o =
dh.select("select * from movie t1,movie_image t2 where t1._id=t2.movie_id and " +
"t1.del='0'",paras,"com.kokozu.fashion.bean.MovieBean");
for(int i=0;i<o.size();i++){
MovieBean b = (MovieBean)o.get(i);
System.out.println(b.get_id());
System.out.println(b.getMovie_name());
}
dh.close();
}
}