国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

基于JDBC封裝的BaseDao(實例代碼)

2019-11-26 14:03:51
字體:
來源:轉載
供稿:網友

最近閑暇時萌發寫一寫dao的封裝的例子,就將以前寫的整理一下。

public class BaseDao<T> {	Connection conn;	PreparedStatement st;	ResultSet rs;		JdbcUtil jdbcUtil = new JdbcUtil();		int result = 0;		private Class<T> persistentClass;		@SuppressWarnings("unchecked")	public BaseDaoUtil(){				conn = jdbcUtil.getConnection();		ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();		persistentClass = (Class<T>) type.getActualTypeArguments()[0];			}		  /**   * 保存    * @param entity   * @return   */	public int save(T entity) throws Exception{				String sql = "INSERT INTO "+ entity.getClass().getSimpleName().toLowerCase() +" (";				List<Method> list = this.matchPojoMethods(entity,"get");				Iterator<Method> iter = list.iterator();					Object obj[] = new Object[list.size()];		int i = 0;		//拼接字段順序 insert into table name(id,name,email,         while(iter.hasNext()) {            Method method = iter.next();            sql += method.getName().substring(3).toLowerCase() + ",";             if (method.getReturnType().getSimpleName().indexOf("Date") !=-1) {				SimpleDateFormat sbf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");				obj[i] = sbf.format(method.invoke(entity, new Object[]{}));		   }else {				obj[i] = method.invoke(entity, new Object[]{});		   }           i++;    }        //去掉最后一個,符號insert insert into table name(id,name,email) values(    sql = sql.substring(0, sql.lastIndexOf(",")) + ") values(";        //拼裝預編譯SQL語句insert insert into table name(id,name,email) values(?,?,?,    for(int j = 0; j < list.size(); j++) {    	sql += "?,";     }    //去掉SQL語句最后一個,符號insert insert into table name(id,name,email) values(?,?,?);    sql = sql.substring(0, sql.lastIndexOf(",")) + ")";        //到此SQL語句拼接完成,打印SQL語句    System.out.println(sql);        try {    	st = conn.prepareStatement(sql);    	for (int j = 0; j < obj.length; j++) {				st.setObject(j+1, obj[j]);			}			result = st.executeUpdate();		} catch (SQLException e) {			e.printStackTrace();		}    		jdbcUtil.getClose(rs, st, conn);				return result;		}		/**	 * 刪除	 * @param object	 * @return	 * @throws SQLException	 */	public int deleteId(Object object) throws Exception{				String sql = "delete from "+ persistentClass.getSimpleName().toLowerCase() +" where ";				//通過子類的構造函數,獲得參數化類型的具體類型.比如BaseDAO<T>也就是獲得T的具體類型    T entity = persistentClass.newInstance();        //存放Pojo(或被操作表)主鍵的方法對象    Method idMethod = null;        List<Method> list = this.matchPojoMethods(entity, "set");    Iterator<Method> iter = list.iterator();        //過濾取得Method對象    while(iter.hasNext()) {      Method tempMethod = iter.next();      if(tempMethod.getName().indexOf("Id") != -1 && tempMethod.getName().substring(3).length() == 2) {        idMethod = tempMethod;      } else if((entity.getClass().getSimpleName() + "Id").equalsIgnoreCase(tempMethod.getName().substring(3))){        idMethod = tempMethod;      }    }    //第一個字母轉為小寫    sql += idMethod.getName().substring(3,4).toLowerCase()+idMethod.getName().substring(4) + " = ?";    			System.out.println(sql);				st = conn.prepareStatement(sql);				//判斷id的類型    if(object instanceof Integer) {      st.setInt(1, (Integer)object);    } else if(object instanceof String){      st.setString(1, (String)object);    }				result = st.executeUpdate();				jdbcUtil.getClose(rs, st, conn);				return result;		}		/**	 * 修改	 * @param entity	 * @return	 * @throws Exception	 */	public int update(T entity) throws Exception{				String sql = "update "+ entity.getClass().getSimpleName().toLowerCase() +" set ";				List<Method> list = this.matchPojoMethods(entity, "get");				//裝載參數		Object obj[] = new Object[list.size()];		int i = 0;				//臨時Method對象,負責迭代時裝method對象.    Method tempMethod = null;        //由于修改時不需要修改ID,所以按順序加參數則應該把Id移到最后.    Method idMethod = null;    Iterator<Method> iter = list.iterator();    while(iter.hasNext()) {      tempMethod = iter.next();       //如果方法名中帶有ID字符串并且長度為2,則視為ID.      if(tempMethod.getName().lastIndexOf("Id") != -1 && tempMethod.getName().substring(3).length() == 2) {      	obj[list.size()-1] = tempMethod.invoke(entity, new Object[]{});        //把ID字段的對象存放到一個變量中,然后在集合中刪掉.        idMethod = tempMethod;        iter.remove();      //如果方法名去掉set/get字符串以后與pojo + "id"想符合(大小寫不敏感),則視為ID      } else if((entity.getClass().getSimpleName() + "Id").equalsIgnoreCase(tempMethod.getName().substring(3))) {      	obj[list.size()-1] = tempMethod.invoke(entity, new Object[]{});      	idMethod = tempMethod;        iter.remove();              }    }		    //把迭代指針移到第一位    iter = list.iterator();    while(iter.hasNext()) {      tempMethod = iter.next();      sql += tempMethod.getName().substring(3).toLowerCase() + "= ?,";      obj[i] = tempMethod.invoke(entity, new Object[]{});      i++;    }        //去掉最后一個,符號    sql = sql.substring(0,sql.lastIndexOf(","));        //添加條件    sql += " where " + idMethod.getName().substring(3).toLowerCase() + " = ?";        //SQL拼接完成,打印SQL語句    System.out.println(sql);		    st = conn.prepareStatement(sql);        for (int j = 0; j < obj.length; j++) {			st.setObject(j+1, obj[j]);		}        result = st.executeUpdate();    jdbcUtil.getClose(rs, st, conn);    		return result;	}			public T findById(Object object) throws Exception{				String sql = "select * from "+ persistentClass.getSimpleName().toLowerCase() +" where ";				//通過子類的構造函數,獲得參數化類型的具體類型.比如BaseDAO<T>也就是獲得T的具體類型    T entity = persistentClass.newInstance();        //存放Pojo(或被操作表)主鍵的方法對象    Method idMethod = null;        List<Method> list = this.matchPojoMethods(entity, "set");    Iterator<Method> iter = list.iterator();        //過濾取得Method對象    while(iter.hasNext()) {      Method tempMethod = iter.next();      if(tempMethod.getName().indexOf("Id") != -1 && tempMethod.getName().substring(3).length() == 2) {        idMethod = tempMethod;      } else if((entity.getClass().getSimpleName() + "Id").equalsIgnoreCase(tempMethod.getName().substring(3))){        idMethod = tempMethod;      }    }    //第一個字母轉為小寫    sql += idMethod.getName().substring(3,4).toLowerCase()+idMethod.getName().substring(4) + " = ?";    			System.out.println(sql);				st = conn.prepareStatement(sql);				//判斷id的類型    if(object instanceof Integer) {      st.setInt(1, (Integer)object);    } else if(object instanceof String){      st.setString(1, (String)object);    }		    rs = st.executeQuery();            //把指針指向迭代器第一行    iter = list.iterator();        //封裝    while(rs.next()) {      while(iter.hasNext()) {        Method method = iter.next();        if(method.getParameterTypes()[0].getSimpleName().indexOf("String") != -1) {          //由于list集合中,method對象取出的方法順序與數據庫字段順序不一致(比如:list的第一個方法是setDate,而數據庫按順序取的是"123"值)          //所以數據庫字段采用名字對應的方式取.          this.setString(method, entity, rs.getString(method.getName().substring(3).toLowerCase()));        } else if(method.getParameterTypes()[0].getSimpleName().indexOf("Date") != -1){          this.setDate(method, entity, rs.getDate(method.getName().substring(3).toLowerCase()));        }else {          this.setInt(method, entity, rs.getInt(method.getName().substring(3).toLowerCase()));        }        }    }		    jdbcUtil.getClose(rs, st, conn);    		return entity;			}						/**   * 過濾當前Pojo類所有帶傳入字符串的Method對象,返回List集合.   */  private List<Method> matchPojoMethods(T entity,String methodName) {    //獲得當前Pojo所有方法對象    Method[] methods = entity.getClass().getDeclaredMethods();        //List容器存放所有帶get字符串的Method對象    List<Method> list = new ArrayList<Method>();        //過濾當前Pojo類所有帶get字符串的Method對象,存入List容器    for(int index = 0; index < methods.length; index++) {      if(methods[index].getName().indexOf(methodName) != -1) {        list.add(methods[index]);      }    }        return list;  }    /**   * 參數類型為String時,為entity字段設置參數,對應set   */  public String setString(Method method, T entity, String arg) throws Exception{    return (String)method.invoke(entity, new Object[]{arg});  }      /**   * 參數類型為Date時,為entity字段設置參數,對應set   */  public Date setDate(Method method, T entity, Date arg) throws Exception{    return (Date)method.invoke(entity, new Object[]{arg});  }		  /**   * 參數類型為Integer或int時,為entity字段設置參數,對應set   */  public Integer setInt(Method method, T entity, Integer arg) throws Exception{    return (Integer)method.invoke(entity, new Object[]{arg});  } 	}

以上這篇基于JDBC封裝的BaseDao(實例代碼)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 梅州市| 裕民县| 海宁市| 富蕴县| 社会| 南木林县| 甘谷县| 宜宾市| 大洼县| 佛坪县| 昭通市| 周口市| 平塘县| 砚山县| 汤阴县| 成武县| 馆陶县| 库车县| 四川省| 上高县| 五台县| 永福县| 黄梅县| 客服| 洛扎县| 石狮市| 临潭县| 曲阳县| 公安县| 渭南市| 页游| 襄汾县| 玉田县| 临城县| 荆州市| 乐清市| 永靖县| 平定县| 遂川县| 万山特区| 平安县|