JDBC學習筆記(六):批量提交與DAO

##批量提交
##使用Batch有關方法
三個方法 :
1.ps.addBatch()將一條SQL語句添加到ps中。
2.ps.executeBatch()執行Batch中所有的SQL語句。
3.ps.clearBatch()清空Batch中的SQL語句。

100條語句提交一次方法:修改一次執行一次addBatch,%100時executeBatch,然後cleatBatch,繼續。


批量提交代碼實現:

需求:添加一百個編過號的“大爺”到員工表,職位爲“門衛”,一次提交20條語句。

	public void testBatch(){  
	    Connection con = null;  
	    try{  
	        con = DBUtil.getConnection();           //使用之前編寫好的DBUtil線程池工具類  
	        con.setAutoCommit(false);           //在事務完成前不自動提交  
	        String sql = "INSERT INTO emps VALUES(emps_seq.nextval,?,?,?,?,?,?,?)"; //使用sequence生成員工號  
	        PreparedStatement ps = con.prepareStatement(sql);       //解析語句  
	                      
	        for(int i=0;i<100;i++){  
	            ps.setString(1,"大爺"+i);  
	            ps.setString(2,"門衛");  
	            ps.setInt(3,1);  
	            ps.setDate(4,new Date(System.currentTimeMillis());  //使用當前時間作爲僱傭時間  
	            ps.setDouble(5,3000.0);  
	            ps.setDouble(6,4000.0);  
	            ps.setInt(7, 3);  
	  
	            ps.addBatch();          //將當前語句添加到ps中  
	            if(i%20==0){  
	                ps.executeBatch();  //執行當前ps中的語句。  
	                ps.clearBatch();    //清空語句避免重複執行。  
	            }  
	        }  
	        con.commit();  
	    }catch(SQLException e){  
	        try{  
	            con.rollback();     //發生異常則事務回滾  (back不大寫!!!)
	        }catch(SQLException e1){  
	            e1.printStackTrace();  
	            throw new RuntimeException("事務回滾失敗",e1);  
	        }  
	        e.printStackTrace();  
	        throw new RuntimeException("添加員工失敗",e);  
	    }finally{  
	        DBUtil.close(con);          //用封裝好的方法將連接返回線程池  
	    }  
	      
	    System.out.println("添加成功");  
	}  






#DAO

思想:先將需要封裝的類封裝成一個對象,

其中屬性一般用包裝類封裝(因爲包裝類可以接受null參數,null在數據庫中是很常見的)。

然後新建一個***DAO的接口類(***一般是表名),接口內定義了對錶進行操作的常用方法。

然後新建實現類,實現接口內方法。

意義:減少了程序的耦合性,方便後續修改。也簡化了常用操作。


例:EmpDaoImpl中實現EmpDao接口的findAll(查詢所有員工)和findById(根據ID查找員工)方法。

代碼實現:


<pre name="code" class="java">	public List<Emp> findAll(){		//返回一個裝有所有員工的List
		Connection con = null;
		List<Emp> emps= new ArrayList<Emp>();
		Emp emp = null;
		try{
			con = DBUtil.getConnection();
			String sql = "SELECT * FROM emps";
			PreparedStatement ps = con.prepareStatement(sql);		//沒有查詢條件,所以這裏也可以用Statement
			ResultSet rs = ps.executeQuery();
			while(rs.next()){				//迭代查詢rs
				emp = new Emp();
				emp.setEmpno(rs.getObject("empno"));			//使用getObject()是因爲返回值有可能爲空,getObject可以接收空參數,否則容易發生
				emp.setEname(rs.getObject("ename"));			//NullPointerException
				emp.setJob(rs.getObject("job"));
				emp.setMgr(rs.getObject("mgr"));
				emp.setDate(rs.getDate("hiredate"));			//getDate()可以接收空參數,故可以使用
				emp.setSal(rs.getObject("sal"));
				emp.setComm(rs.getObject("comm"));
				emp.setDeptno(rs.getObject("deptno"));
				emps.add(emp);
			}
			return emps;
		}catch(SQLException e){
			e.printStackTrace();
			throw new RuntimeException("查詢員工失敗",e);
		}finally{
			DBUtil.close(con);
		}
		System.out.println("查詢完畢");
	}

	public Emp findById(int id){
		Connection con = null;
		Emp emp = new Emp();
		try{
			con = DBUtil.getConnection();
			String sql = "SELECT * FROM emps WHERE empno=?";
			PreparedStatement ps = con.prepareStatement(sql);
			ps.setInt(1,id);
			ResultSet rs = ps.executeQuery();
			rs.next();
			emp.setEname(rs.getObject("ename"));			//同上
			emp.setJob(rs.getObject("job"));
			emp.setMgr(rs.getObject("mgr"));
			emp.setDate(rs.getDate("hiredate"));			
			emp.setSal(rs.getObject("sal"));
			emp.setComm(rs.getObject("comm"));
			emp.setDeptno(rs.getObject("deptno"));
			emps.add(emp);

			return emp;
		}catch(SQLException e){
			e.printStackTrace();
			throw new RuntimeException("查詢員工失敗",e);
		}finally{
			DBUtil.close();
		}
	}




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