32 Dao層和impl層


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來保存它們,如果要修改他們,只需要修改配置文件即可。

這樣也方便使用專門的一個工具(類)來獲取它們。這個我們將在后面的文章中詳解。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM