最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2016年07月15日 09:32:56   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇基于JDBC封裝的BaseDao(實(shí)例代碼)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

最近閑暇時(shí)萌發(fā)寫(xiě)一寫(xiě)dao的封裝的例子,就將以前寫(xiě)的整理一下。

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++;
    }
    
    //去掉最后一個(gè),符號(hào)insert insert into table name(id,name,email) values(
    sql = sql.substring(0, sql.lastIndexOf(",")) + ") values(";
    
    //拼裝預(yù)編譯SQL語(yǔ)句insert insert into table name(id,name,email) values(?,?,?,
    for(int j = 0; j < list.size(); j++) {
    	sql += "?,"; 
    }

    //去掉SQL語(yǔ)句最后一個(gè),符號(hào)insert insert into table name(id,name,email) values(?,?,?);
    sql = sql.substring(0, sql.lastIndexOf(",")) + ")";
    
    //到此SQL語(yǔ)句拼接完成,打印SQL語(yǔ)句
    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 ";
		
		//通過(guò)子類(lèi)的構(gòu)造函數(shù),獲得參數(shù)化類(lèi)型的具體類(lèi)型.比如BaseDAO<T>也就是獲得T的具體類(lèi)型
    T entity = persistentClass.newInstance();
    
    //存放Pojo(或被操作表)主鍵的方法對(duì)象
    Method idMethod = null;
    
    List<Method> list = this.matchPojoMethods(entity, "set");
    Iterator<Method> iter = list.iterator();
    
    //過(guò)濾取得Method對(duì)象
    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;
      }
    }
    //第一個(gè)字母轉(zhuǎn)為小寫(xiě)
    sql += idMethod.getName().substring(3,4).toLowerCase()+idMethod.getName().substring(4) + " = ?";
    	
		System.out.println(sql);
		
		st = conn.prepareStatement(sql);
		
		//判斷id的類(lèi)型
    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");
		
		//裝載參數(shù)
		Object obj[] = new Object[list.size()];
		int i = 0;
		
		//臨時(shí)Method對(duì)象,負(fù)責(zé)迭代時(shí)裝method對(duì)象.
    Method tempMethod = null;
    
    //由于修改時(shí)不需要修改ID,所以按順序加參數(shù)則應(yīng)該把Id移到最后.
    Method idMethod = null;
    Iterator<Method> iter = list.iterator();
    while(iter.hasNext()) {
      tempMethod = iter.next();
 
      //如果方法名中帶有ID字符串并且長(zhǎng)度為2,則視為ID.
      if(tempMethod.getName().lastIndexOf("Id") != -1 && tempMethod.getName().substring(3).length() == 2) {
      	obj[list.size()-1] = tempMethod.invoke(entity, new Object[]{});
        //把ID字段的對(duì)象存放到一個(gè)變量中,然后在集合中刪掉.
        idMethod = tempMethod;
        iter.remove();
      //如果方法名去掉set/get字符串以后與pojo + "id"想符合(大小寫(xiě)不敏感),則視為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++;
    }
    
    //去掉最后一個(gè),符號(hào)
    sql = sql.substring(0,sql.lastIndexOf(","));
    
    //添加條件
    sql += " where " + idMethod.getName().substring(3).toLowerCase() + " = ?";
    
    //SQL拼接完成,打印SQL語(yǔ)句
    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 ";
		
		//通過(guò)子類(lèi)的構(gòu)造函數(shù),獲得參數(shù)化類(lèi)型的具體類(lèi)型.比如BaseDAO<T>也就是獲得T的具體類(lèi)型
    T entity = persistentClass.newInstance();
    
    //存放Pojo(或被操作表)主鍵的方法對(duì)象
    Method idMethod = null;
    
    List<Method> list = this.matchPojoMethods(entity, "set");
    Iterator<Method> iter = list.iterator();
    
    //過(guò)濾取得Method對(duì)象
    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;
      }
    }
    //第一個(gè)字母轉(zhuǎn)為小寫(xiě)
    sql += idMethod.getName().substring(3,4).toLowerCase()+idMethod.getName().substring(4) + " = ?";
    	
		System.out.println(sql);
		
		st = conn.prepareStatement(sql);
		
		//判斷id的類(lèi)型
    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對(duì)象取出的方法順序與數(shù)據(jù)庫(kù)字段順序不一致(比如:list的第一個(gè)方法是setDate,而數(shù)據(jù)庫(kù)按順序取的是"123"值)
          //所以數(shù)據(jù)庫(kù)字段采用名字對(duì)應(yīng)的方式取.
          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;
		
	}
	
	
	
	
	
	/**
   * 過(guò)濾當(dāng)前Pojo類(lèi)所有帶傳入字符串的Method對(duì)象,返回List集合.
   */
  private List<Method> matchPojoMethods(T entity,String methodName) {
    //獲得當(dāng)前Pojo所有方法對(duì)象
    Method[] methods = entity.getClass().getDeclaredMethods();
    
    //List容器存放所有帶get字符串的Method對(duì)象
    List<Method> list = new ArrayList<Method>();
    
    //過(guò)濾當(dāng)前Pojo類(lèi)所有帶get字符串的Method對(duì)象,存入List容器
    for(int index = 0; index < methods.length; index++) {
      if(methods[index].getName().indexOf(methodName) != -1) {
        list.add(methods[index]);
      }
    }    
    return list;
  }
  

  /**
   * 參數(shù)類(lèi)型為String時(shí),為entity字段設(shè)置參數(shù),對(duì)應(yīng)set
   */
  public String setString(Method method, T entity, String arg) throws Exception{
    return (String)method.invoke(entity, new Object[]{arg});
  }
  
  
  /**
   * 參數(shù)類(lèi)型為Date時(shí),為entity字段設(shè)置參數(shù),對(duì)應(yīng)set
   */
  public Date setDate(Method method, T entity, Date arg) throws Exception{
    return (Date)method.invoke(entity, new Object[]{arg});
  }
	
	
  /**
   * 參數(shù)類(lèi)型為Integer或int時(shí),為entity字段設(shè)置參數(shù),對(duì)應(yīng)set
   */
  public Integer setInt(Method method, T entity, Integer arg) throws Exception{
    return (Integer)method.invoke(entity, new Object[]{arg});
  }
 	
}

以上這篇基于JDBC封裝的BaseDao(實(shí)例代碼)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring高級(jí)接口A(yíng)ware淺析

    Spring高級(jí)接口A(yíng)ware淺析

    通過(guò)aware接口可以獲取Spring容器相關(guān)信息,但這樣會(huì)與Spring容器耦合,這篇文章主要介紹了Spring aware接口理解,需要的朋友可以參考下
    2023-01-01
  • Java中ArrayList和LinkedList的區(qū)別

    Java中ArrayList和LinkedList的區(qū)別

    ArrayList和LinkedList在這個(gè)方法上存在一定的性能差異,本文就介紹了Java中ArrayList和LinkedList的區(qū)別,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Spring框架AOP面向切面編程原理全面分析

    Spring框架AOP面向切面編程原理全面分析

    這篇文章主要介紹了Spring框架AOP面向切面編程的全面分析,文中附含詳細(xì)的示例代碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • maven實(shí)現(xiàn)jar包導(dǎo)入+導(dǎo)出方式

    maven實(shí)現(xiàn)jar包導(dǎo)入+導(dǎo)出方式

    這篇文章主要介紹了maven實(shí)現(xiàn)jar包導(dǎo)入+導(dǎo)出方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • IDEA連接達(dá)夢(mèng)數(shù)據(jù)庫(kù)的詳細(xì)配置指南

    IDEA連接達(dá)夢(mèng)數(shù)據(jù)庫(kù)的詳細(xì)配置指南

    達(dá)夢(mèng)數(shù)據(jù)庫(kù)(DM Database)作為國(guó)產(chǎn)關(guān)系型數(shù)據(jù)庫(kù)的代表,廣泛應(yīng)用于企業(yè)級(jí)系統(tǒng)開(kāi)發(fā),本文將詳細(xì)介紹如何在IntelliJ IDEA中配置并連接達(dá)夢(mèng)數(shù)據(jù)庫(kù),助力開(kāi)發(fā)者高效完成數(shù)據(jù)庫(kù)開(kāi)發(fā)工作,需要的朋友可以參考下
    2025-03-03
  • Java動(dòng)態(tài)代理的應(yīng)用詳解

    Java動(dòng)態(tài)代理的應(yīng)用詳解

    本篇文章介紹了,Java動(dòng)態(tài)代理的應(yīng)用詳解,需要的朋友參考下
    2013-05-05
  • Scala文件操作示例代碼講解

    Scala文件操作示例代碼講解

    本文章向大家介紹Scala 學(xué)習(xí)筆記之文件操作,主要內(nèi)容包括其使用實(shí)例、應(yīng)用技巧、基本知識(shí)點(diǎn)總結(jié)和需要注意事項(xiàng),具有一定的參考價(jià)值,需要的朋友可以參考一下
    2023-04-04
  • 詳解Java編程中面向字符的輸出流

    詳解Java編程中面向字符的輸出流

    這篇文章主要介紹了Java編程中面向字符的輸出流,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • 郵件收發(fā)原理你了解嗎? 郵件發(fā)送基本過(guò)程與概念詳解(一)

    郵件收發(fā)原理你了解嗎? 郵件發(fā)送基本過(guò)程與概念詳解(一)

    你真的了解郵件收發(fā)原理嗎?這篇文章主要為大家詳細(xì)介紹了郵件發(fā)送基本過(guò)程與概念,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 詳解MyBatis 常用寫(xiě)法

    詳解MyBatis 常用寫(xiě)法

    MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。這篇文章給大家介紹了MyBatis 常用寫(xiě)法,感興趣的朋友跟隨小編一起看看吧
    2018-11-11

最新評(píng)論

新建县| 老河口市| 舟山市| 德州市| 客服| 汽车| 台山市| 行唐县| 策勒县| 钟山县| 新津县| 阿尔山市| 临漳县| 沈丘县| 彰化市| 图木舒克市| 晋城| 五台县| 磐安县| 田东县| 万盛区| 青海省| 涡阳县| 铁岭县| 合江县| 聂拉木县| 宁夏| 晋宁县| 高唐县| 胶州市| 崇阳县| 湖口县| 蒙阴县| 乌鲁木齐市| 柞水县| 巍山| 同仁县| 牙克石市| 黎城县| 女性| 绥阳县|