模板泛型的常见应用
来源:互联网 发布:wp8怎么下载软件 编辑:程序博客网 时间:2024/05/22 17:31
帮同学写东西,没必要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 blocke.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";elsest = "'" + 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";elsest = "'" + 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;}}
- 模板泛型的常见应用
- [设计模式]模板方法模式(Template Method)---抽象类的常见应用
- Filter常见的应用
- 常见的应用服务器
- CALayer的常见应用
- 数据库的常见应用
- 二分法的常见应用
- request的常见应用
- 过滤器的常见应用
- word模板的应用
- 模板页的应用
- thinkphp模板的应用
- ThinkPHP模板的应用
- c++模板的应用
- 模板的应用排序
- 类模板的应用
- jquery 模板的应用
- 网站模板的应用
- VMware虚拟机中ubuntu系统内安装VMwareTools
- Windows Phone 7(WP7)开发 网络操作(2) HttpWebRequest GET请求队列
- IClassFactory = interface(IUnknown) ['{00000001-0000-0000-C000-000000000046}']
- 动态加载和静态加载及其编译步骤
- WP7 开发学习(2):在WP7中使用网络请求
- 模板泛型的常见应用
- 各种显示器的简单比较
- Java对集合的排序
- gcc 调试汇编 以及 对函数堆栈 的观察
- MIDL_INTERFACE("00000001-0000-0000-C000-000000000046") IClassFactory : public IUnknown
- Hadoop0.20更新笔记
- python第一天_欢迎来到python的世界
- 两个使用Page.ClientScript. 的方法 在后台写script脚本语言
- android中文件的保存与读取