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來保存它們,如果要修改他們,只需要修改配置文件即可。
這樣也方便使用專門的一個工具(類)來獲取它們。這個我們將在后面的文章中詳解。
