##使用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();
}
}