Dao層是啥
dao層又稱數據訪問層,全稱為data Access object ,屬於一種比較底層,比較基礎的操作,具體到對某個表、某個實體的增刪改查。
在java項目中,我們通常單獨使用一個包來代表dao層,例如:com.xxx.xxx.dao
dao層主要用來對數據庫的表進行增刪改查,每一個表用一個類來操作。通常還會把dao層細分為兩個子層,一個inter包用來做接口,一個impl包用來實現inter包中的各接口。
來我們做個實例
有一個學生表如:
我們在eclipse中寫相應的dao層如:
package com.xiaohei.daoimpl; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import com.xiaohei.pojo.Student; public class StudentDaoImpl { private Connection conn =null; private PreparedStatement stmt = null; private String driver = "oracle.jdbc.driver.OracleDriver"; private String url = "jdbc:oracle:thin:@localhost:1521:XE"; private String user; private String password; private ArrayList<Student> list; public StudentDaoImpl(String user, String password) { super(); this.user = user; this.password = password; //執行加載驅動 建立連接 創建statement對象的方法 init(url,user,password); } /** * 初始化數據庫連接 * @param url * @param user * @param password */ private void init(String url, String user, String password) { //加載驅動 try { Class.forName(driver); //建立連接 conn = DriverManager.getConnection(url, user, password); conn.setAutoCommit(false); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch(SQLException e) { e.printStackTrace(); } } /** * 增加一個學生通過姓名,年齡和金錢 * @param sname 學生姓名,sage 學生年齡,money 錢 * @return i 返回-1表示失敗,返回其它值表示成功執行的SQL語句條數 */ public int insertStu(String sname,int sage,double money) { try { //sql語句 String sql = "insert into student values(stu_seq.nextval,?,?,?)"; //創建執行對象 stmt = conn.prepareStatement(sql); //設置占位符 stmt.setString(1, sname); stmt.setInt(2, sage); stmt.setDouble(3, money); //執行SQL語句 int i = stmt.executeUpdate(); //手動提交 conn.commit(); //處理結果 return i; }catch(SQLException e) { e.printStackTrace(); try { conn.rollback(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } return -1; } /** * 刪除學生按指定的學號 * @param sno 學生學號 * @return i 返回-1表示失敗,返回其它值表示成功執行的SQL語句條數 */ public int deleteStu(int sno) { try { //SQL語句 String sql ="delete student where sno=?"; //stmt對象 stmt= conn.prepareStatement(sql); //占位符賦值 stmt.setInt(1, sno); //執行SQL int i = stmt.executeUpdate(); //手動提交 conn.commit(); //處理結果 return i; }catch(SQLException e) { e.printStackTrace(); try { conn.rollback(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } return -1; } /** * update操作:修改學生姓名,年齡和金錢 通過 學生sno * @param sno 學生學號 * @return */ public int updateStu(int sno,String sname,int sage,double money) { try { //sql語句 String sql = "update student set sname=?,sage=?,money=? where sno=?"; //stmt對象 stmt=conn.prepareStatement(sql); //占位符賦值 stmt.setString(1,sname); stmt.setInt(2,sage); stmt.setDouble(3,money); stmt.setInt(4,sno); //執行sql int i = stmt.executeUpdate(); //手動提交 conn.commit(); //處理結果 return i; }catch(SQLException e) { e.printStackTrace(); try { conn.rollback(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } return -1; } /** * 查詢 * @return 返回一個ArrayList<Student>對象 */ public ArrayList<Student> queryStu(){ list = new ArrayList<>(); try { //SQL語句 String sql = "select * from student order by sno"; //stmt對象 stmt = conn.prepareStatement(sql); //占位符賦值 //執行SQL ResultSet set = stmt.executeQuery(); //處理結果 while(set.next()) { Student s = new Student(); s.setSno(set.getInt("sno")); s.setSage(set.getInt("sage")); s.setSname(set.getString("sname")); s.setMoney(set.getDouble("money")); list.add(s); } return list; }catch(SQLException e) { e.printStackTrace(); } return list; } }
以上代碼中,我們看到driver、url、user和password這四個數據,將來很容易變動,我們建議使用一個配置文件properties來保存它們,如果要修改他們,只需要修改配置文件即可。
這樣也方便使用專門的一個工具(類)來獲取它們。這個我們將在后面的文章中詳解。