帮同学写东西,没必要j2ee,直接用的servlet,但是写着写着又到那边去了,实现dao的时候写了个GenericDao<T>,任何一个pojoDao继承了都能实现增删查改。
1. 使用T继续做泛型模板。List<T>。
2. 使用T做参数类型 T entity。
3. 使用T得到其Class类,用于进行包括创建该类和描述该类的各种活动。
4. 使用Class可以得到T的所有属性和方法。
5. 通过属性可以得到特定的方法。
6.通过属性和类型可以得到带参数的方法。
package com.kiln.dao;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import com.kiln.common.DBManager;
public abstract class GenericDao<T> {
Class clazz;
public GenericDao() {
clazz = getGenericType();
}
public T jsonToObject(String str){
JSONObject jsonObject = JSONObject.fromObject(str);
T obj = (T)JSONObject.toBean(jsonObject,clazz);
return obj;
}
public String toJson(List<T> list){
return JSONArray.fromObject(list).toString();
}
public String toJson(T obj){
return JSONObject.fromObject(obj).toString();
}
protected ResultSet executeQuery(String sql){
Statement stt = connectDB();
if (stt == null)
return null;
System.out.println(sql);
ResultSet rs = null;
try {
rs = stt.executeQuery(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return rs;
}
protected boolean executeUpdate(String sql){
boolean res=true;
Statement stt = connectDB();
if (stt == null)
return false;
System.out.println(sql);
try{
stt.executeUpdate(sql);
}catch(SQLException e){
e.printStackTrace();
res=false;
}
try {
stt.close();
} catch (SQLException e) {
e.printStackTrace();
}
return res;
}
protected Class getGenericType() {
Type genType = getClass().getGenericSuperclass();
if (!(genType instanceof ParameterizedType)) {
return Object.class;
}
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
if (!(params[0] instanceof Class)) {
return Object.class;
}
return (Class) params[0];
}
protected Statement connectDB() {
Connection conn = null;
try {
conn = DBManager.getInstance().getConnection("mysql");
} catch (SQLException e) {
e.printStackTrace();
return null;
}
Statement stt = null;
try {
stt = conn.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
return stt;
}
public boolean insert(T object) {
StringBuffer sql = new StringBuffer("insert into ");
sql.append(clazz.getSimpleName().toLowerCase());
Field[] fields = clazz.getDeclaredFields();
sql.append("(");
for (int i = 0; i < fields.length; i++) {
sql.append(fields[i].getName());
if (i != fields.length - 1)
sql.append(",");
}
sql.append(") values(");
String st = null;
Method mt = null;
try {
for (int i = 0; i < fields.length; i++) {
st = fields[i].getName();
mt = clazz.getMethod("get" + st.substring(0, 1).toUpperCase()
+ st.substring(1, st.length()));
Object tmp = mt.invoke(object);
if (tmp == null)
st = "null";
else
st = "'" + tmp.toString() + "'";
sql.append(st);
if (i != fields.length - 1)
sql.append(",");
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("��ȡ���Գ���:" + st);
}
sql.append(");");
return executeUpdate(sql.toString());
}
public boolean update(T object) {
String st = null;
Method mt = null;
StringBuffer sql = new StringBuffer("update ");
sql.append(clazz.getSimpleName().toLowerCase());
Field[] fields = clazz.getDeclaredFields();
sql.append(" set ");
try {
for (int i = 0; i < fields.length; i++) {
st = fields[i].getName();
if(st.equals("id"))
continue;
sql.append(st);
sql.append("=");
mt = clazz.getMethod("get" + st.substring(0, 1).toUpperCase()
+ st.substring(1, st.length()));
Object tmp = mt.invoke(object);
if (tmp == null)
st = "null";
else
st = "'" + tmp.toString() + "'";
sql.append(st);
if (i != fields.length - 1)
sql.append(",");
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("can't read attribute:" + st);
return false;
}
try {
mt = clazz.getMethod("getId");
sql.append(" where id='"+mt.invoke(object)+"'");
} catch (Exception e1) {
e1.printStackTrace();
return false;
}
sql.append(";");
return executeUpdate(sql.toString());
}
public boolean delete(int id){
StringBuffer sql = new StringBuffer("delete from ");
sql.append(clazz.getSimpleName().toLowerCase());
sql.append(" where id='"+id+"'");
System.out.println(sql.toString());
return executeUpdate(sql.toString());
}
public T getById(int id){
StringBuffer sql = new StringBuffer("select * from ");
sql.append(clazz.getSimpleName().toLowerCase());
sql.append(" where id='"+id+"'");
System.out.println(sql.toString());
ResultSet rs = executeQuery(sql.toString());
if(rs==null)
return null;
try {
while(rs.next()){
T object = (T)clazz.newInstance();
Field[] fields = clazz.getDeclaredFields();
Method mt = null;
String st = null;
for(int i=0;i<fields.length;i++){
st = fields[i].getName();
mt = clazz.getMethod("set"+ st.substring(0, 1).toUpperCase()
+ st.substring(1, st.length()),fields[i].getType());
mt.invoke(object, rs.getObject(st));
}
rs.close();
return object;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public List<T> getAll(){
StringBuffer sb = new StringBuffer("select * from ");
sb.append(clazz.getSimpleName().toLowerCase());
ResultSet rs = this.executeQuery(sb.toString());
List<T> list = new ArrayList<T>();
if(rs==null)
return list;
try{
Field[] fields = clazz.getDeclaredFields();
T t;
Method mt;
String st;
while(rs.next()){
t = (T)clazz.newInstance();
for(int i=0;i<fields.length;i++){
st = fields[i].getName();
mt = clazz.getMethod("set"+ st.substring(0, 1).toUpperCase()
+ st.substring(1, st.length()),fields[i].getType());
mt.invoke(t,rs.getObject(st));
}
list.add(t);
}
}catch(Exception e){
e.printStackTrace();
}
return list;
}
}