关闭

模板泛型的常见应用

525人阅读 评论(0) 收藏 举报

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

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:250973次
    • 积分:3576
    • 等级:
    • 排名:第9123名
    • 原创:98篇
    • 转载:52篇
    • 译文:1篇
    • 评论:51条
    文章分类
    最新评论