模板泛型的常见应用

帮同学写东西,没必要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;
	}
	
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值