JDBC之簡單封裝

本文是JDBC的簡單封裝,吸收了一些思想經行的封裝,封裝的很通用,每種數據庫都可用,如果有什麼錯誤請指教,,謝謝:

1.配置文件

<?xml version="1.0" encoding="UTF-8"?>
<db>
	<driver>oracle.jdbc.driver.OracleDriver</driver>
	<url>jdbc:oracle:thin:@192.168.3.27:1521:orcl</url>
	<login_name>scott</login_name>
	<login_password>tiger</login_password>
</db>

 本來想再寫個藉口屏蔽 實現。。。懶得寫了

 2.DBUtil類 獲取連接

/**
 * Copyright (C), 1995-2010, ChengDu Lovo info. Co., Ltd.
 * FileName: DBUtil  .java
 * <p> DBUtil  實現</p>
 * 
 * @author  Tjee
 * @Date  2010-5-12  
 * @version 1.00 9999/99/99 類創建者姓名
 * @see     參考類1
 * @see     參考類2
 */
public class DBUtil  implements IConnection{
	/**
	 * 字段
	 **/
	// 單例模式只允許 產生一個對象
	private static DBUtil instanse=null;
	private String driver;
	private String url;
	private String login_name;
	private String login_password;
	private Connection con;
	/**
	 * 構造方法
	 * */
	private DBUtil(){
		//讀取配置
		this.readConfig();
	}
	/**
	 * 方法
	 * */
//用static  一開始就被加載 
	public static DBUtil getInstanse(){
		if(instanse==null){ //  排除不是第一次產生的對象
			synchronized(DBUtil.class){// synchronized同步  讓都是第一次產生對象多線程  在此排隊
				if(instanse==null){  // 那個線程先進來  就只讓他產生對象
					instanse=new DBUtil();
				}
			}
		}
		return instanse;
	}
/**
 * 獲取 dbxml  配置文件的 路徑
 * */
	private InputStream getPath(){
		InputStream is=this.getClass().getResourceAsStream("/com/lovo/config/db.xml");
		return is;
	}
	private void readConfig(){
		//讀取文件中的數據
		SAXReader saxreader= new SAXReader();
		try {
		Document doc =	saxreader.read(this.getPath());//讀取 xml 文件中的數據 放到 doc裏面
		List<Element> list =doc.selectNodes("/db/driver");
			this.driver=list.get(0).getTextTrim();
		
			List<Element> list1 =doc.selectNodes("/db/url");
			this.url=list1.get(0).getTextTrim();
			
			List<Element> list2 =doc.selectNodes("/db/login_name");
			this.login_name=list2.get(0).getTextTrim();
			
			List<Element> list3 =doc.selectNodes("/db/login_password");
			this.login_password=list3.get(0).getTextTrim();
			
			System.out.println("driver:"+this.driver);
			System.out.println("url:"+this.url);
			System.out.println("login_name:"+this.login_name);
			System.out.println("login_password:"+this.login_password);

		} catch (Exception e) {
			
			e.printStackTrace();
		}	
	}

	/**
	 *  獲得連接 並返回 Connection
	 * @throws ClassNotFoundException 
	 * @throws SQLException 
	 */
	public Connection getConnection() throws Exception{
		
			Class.forName(driver);
			con=DriverManager.getConnection(url,login_name,login_password);
			return con;
	}
	/**
	 * 關閉 連接 和回滾事務
	 * 由於要關閉的連接是實際情況中具體的 所以需要傳參數
	 * @throws SQLException 
	 * @throws SQLException */
	 public void closeConnectionRollback(Connection con,PreparedStatement pre,ResultSet rs)throws Exception {
		 /**如果rs不爲空關閉連接*/
		if(rs!=null)rs.close();
		 /**如果pre不爲空關閉連接*/
		if(pre!=null)pre.close();
		 /**如果con不爲空關閉連接   回滾*/
		if(con!=null){
			if(!con.getAutoCommit()){
				con.rollback();
			}
			con.close();
		}
	 }
	 /**
		 * 關閉 連接 和提交事務
		 * 由於要關閉的連接是實際情況中具體的 所以需要傳參數
		 * @throws SQLException 
		 * @throws SQLException */
		 public void closeConnectionCommit(Connection con,PreparedStatement pre,ResultSet rs)throws Exception {
			 /**如果rs不爲空關閉連接*/
			if(rs!=null)rs.close();
			 /**如果pre不爲空關閉連接*/
			if(pre!=null)pre.close();
			 /**如果con不爲空關閉連接  提交事務*/
			if(con!=null){
				if(!con.getAutoCommit()){
					con.commit();
				}
				con.close();
			}
		 } 
}

 

3.DataAccessObject 用的類繼承他 就可以了 通用增、刪、改、查。

/**
 * Copyright (C), 1995-2010, ChengDu Lovo info. Co., Ltd.
 * FileName: DataAccessObject.java
 * <p> DataAccessObject實現</p>
 * 
 * @author  Tjee
 * @Date  2010-5-12  
 * @version 1.00 9999/99/99 類創建者姓名
 * @see     參考類1
 * @see     參考類2
 */
public class DataAccessObject {
	protected Connection con=null;
	protected PreparedStatement pre=null;
	protected ResultSet rs=null;
	
	private IConnection  connect;
	
	/**獲得連接
	 * @throws Exception */
	protected void getConnection() throws Exception{
		con=	DBUtil.getInstanse().getConnection();
	}
	/**關閉連接和回滾*/
	 public void closeConnectionRollback(Connection con,PreparedStatement pre,ResultSet rs)throws Exception{
		 DBUtil.getInstanse().closeConnectionRollback(con, pre, rs);
	 }
	 /**關閉連接和提交*/
	 public void closeConnectionCommit(Connection con,PreparedStatement pre,ResultSet rs)throws Exception{
		 DBUtil.getInstanse().closeConnectionRollback(con, pre, rs);
	 }
	/**
	 * 開始事務,設置爲手動提交
	 */
	public void beginTransation()throws Exception {
		this.con.setAutoCommit(false);
	}
	/**
	 *  跟新數據庫 
	 *  封裝非查詢語句(insert,delete,update-返回影響的行數;DDL:create,drop,truncate-返回0)
	 * @param sql sql語句
	 * @param args 問號的值
	 * @return
	 * @return int 影響幾行
	 * @throws Exception 
	 */
	public int executeSQL(String sql,Object[] args )throws Exception{
		int row = 0;
		/**獲得數據庫連接*/
		try {
			con=DBUtil.getInstanse().getConnection();
			pre=con.prepareStatement(sql);
			/**判斷是否爲空在進行對問號賦值*/
			if(args!=null && args.length>0){
				for(int i=0;i<args.length;i++){
					pre.setObject(i+1, args[i]);
				}
			}
			row = pre.executeUpdate();
		} catch (Exception e) {
			/**通知事務中其它sql要回滾*/
			throw e;
		}
		return row;
	}
	/**查詢 所有字段
	 * @param sql
	 * @param args
	 * @param cls
	 * @return
	 * @throws Exception
	 * @return List
	 */
	public List queryForList(String sql,Object[] args,Class cls) throws Exception{
		
			List list = new ArrayList();
			try{
				System.out.println(sql);
			pre = con.prepareStatement(sql);
			if(args!=null && args.length>0){
				for(int i=0;i<args.length;i++){
					pre.setObject(i+1, args[i]);
				}
			}
			/**得到結果集*/
			rs = pre.executeQuery();
		
			/**獲取類模板的所有字段*/
			Field[] fields = cls.getDeclaredFields();
			while(rs.next()){
				Object obj = cls.newInstance();
				//通過反射對各個屬性進行賦值
				for(int i=0;i<fields.length;i++){
					Field field = fields[i];
					//直接訪問private屬性
					field.setAccessible(true);
					Class type = field.getType();
					/**用oracle才使用 判斷*/
					if(type==Double.class||type==double.class){
						String str = rs.getString(i+1);
						if(str!=null){
							Double value = Double.parseDouble(str);
							field.set(obj, value);//obj.name='mike'
						}
					}else if(type==Integer.class||type==int.class){
						String str = rs.getString(i+1);
						if(str!=null){
							Integer value = Integer.parseInt(str);
							field.set(obj, value);
						}
					}else if(type==Float.class||type==float.class){
							String str = rs.getString(i+1);
								if(str!=null){
									Integer value = Integer.parseInt(str);
									field.set(obj, value);
									}
					}else if(type==java.sql.Timestamp.class){
						String str = rs.getString(i+1);
						if(str!=null){
							java.sql.Timestamp rq = strToDateTime(str);
							field.set(obj, rq);
							}
			}
					else{
						field.set(obj, rs.getObject(i+1));
					}
				}
				list.add(obj);
			}
			}catch(Exception e){
				throw e;
			}
		return list;

	}
	/** 
	 * 查詢  包括單個字段,和多個字段的查詢
	 * 注意(如果與數據庫字段不一致 請用       別名     代替 使之與javabean保持一致)
	 * @param sql  語句
	 * @param args 問號的值
	 * @param cls bean模板
	 * @throws Exception
	 * @return List  返回這個bean結合
	 */
	public List querySQL(String sql,Object[] args,Class cls) throws Exception{
		List list = new ArrayList();
		pre = con.prepareStatement(sql);
		/**設置問號*/
		if(args!=null && args.length>0){
			for(int i=0;i<args.length;i++){
				pre.setObject(i+1, args[i]);
			}
		}		
		/**獲取類模板的所有字段*/
		Field[] fields = cls.getDeclaredFields();
		/**得到結果集*/
		rs = pre.executeQuery();
		ResultSetMetaData rsmd=rs.getMetaData();
		while(rs.next()){
			   /** 得到cls實例*/
			Object obj=cls.newInstance();
			for(int i=1;i<=rs.getMetaData().getColumnCount();i++) {
				
			   /**判斷結果集是否存在Javabean 裏面的字段    匹配 別名或者是字段名*/
					for(int j=0;j<fields.length;j++ ){
						if( rsmd.getColumnLabel(i).equalsIgnoreCase(fields[j].getName()) ||
							rsmd.getColumnName(i).equalsIgnoreCase(fields[j].getName())){
							
							fields[j].setAccessible(true);
							Class type =  fields[j].getType();
							if(type==Double.class||type==double.class){
								String str = rs.getString(j+1);
								/**判斷取出來的值是否爲空 在處理*/
								if(str!=null){
									Double value = Double.parseDouble(str);
									fields[j].set(obj, value);
								}
							}else if(type==Integer.class||type==int.class){
								String str = rs.getString(j+1);
								if(str!=null){
									Integer value = Integer.parseInt(str);
									fields[j].set(obj, value);
								}
							}else if(type==Float.class||type==float.class){
								String str = rs.getString(j+1);
								if(str!=null){
									Integer value = Integer.parseInt(str);
									 fields[j].set(obj, value);
									}
							}else{
								 fields[j].set(obj, rs.getObject(j+1));
							}
						
					}  
			   }
					
		   }
			 list.add(obj);
		}
		return list;
		
	}
	
	/**
	 * 從網頁上或外部輸入時(一般不會輸入時分秒),需要將日期轉化爲數據庫的日期類型
	 */
	public final static java.sql.Timestamp strToDateTime(String dateStr)
	throws Exception{
		int len = dateStr.length();
		String format = "yyyy-MM-dd HH:mm:ss.SSS".substring(0, len);
		DateFormat df = new SimpleDateFormat(format);
		java.util.Date timeDate = df.parse(dateStr);
		System.out.println("dasdasdadasdass"+timeDate);
		java.sql.Timestamp dateTime = new java.sql.Timestamp(timeDate.getTime());// sql類型
		System.out.println("dasdasdadasdass"+dateTime);
		return dateTime;
	}
	

	
	
}

 

發佈了18 篇原創文章 · 獲贊 4 · 訪問量 7854
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章