模板泛型的常见应用

原创 2012年03月30日 21:27:21

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


相关文章推荐

泛型和标准模板类库

  • 2016年03月17日 23:39
  • 1.02MB
  • 下载

模板,泛型编程系列

  • 2007年09月23日 15:26
  • 9.44MB
  • 下载

C++泛型编程2——类模板,容器适配器,仿函数

模板编译  当编译器遇到一个模板定义时,它并不生成代码。只有当我们实例化出模板的一个特定版本时,编译器才会生成代码。当我们使用模板时,比编译器才生成代码。  这一特性影响了我们如何组织代码以及错误何时...

Effective c++ 第7章 模板与泛型编程

模板与泛型程序可以创造出“在C++编译器内执行并于”

模板和泛型编程

  • 2013年12月28日 13:08
  • 195KB
  • 下载

C++泛型机制—模板

  • 2013年04月24日 10:43
  • 298KB
  • 下载

结合泛型与模板的STL.NET

开始之前,先来看一个笑话,当问一个C++程序员怎样完成一个给定的任务时,他(她)可能会提供一打或更多的潜在解决方案列表,但又会极其详细地标出每种方案的问题之处,让你不知所措,难以选择。而Visual ...

C++标准模板库STL和泛型编程简介

  • 2011年11月10日 23:09
  • 310KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:模板泛型的常见应用
举报原因:
原因补充:

(最多只允许输入30个字)