經由過程署理類完成java銜接數據庫(應用dao層操作數據)實例分享。本站提示廣大學習愛好者:(經由過程署理類完成java銜接數據庫(應用dao層操作數據)實例分享)文章只能為提供參考,不一定能成為您想要的結果。以下是經由過程署理類完成java銜接數據庫(應用dao層操作數據)實例分享正文
起首,我們在一個java文件中界說要存儲的構造類型:
import java.util.Date ;
/**
*
* @author Nero
*/
public class Emp {
private int empno ;
private String ename ;
private String job ;
private Date hiredate ;
private float sal ;
public void setEmpno(int empno){
this.empno = empno ;
}
public void setEname(String ename){
this.ename = ename ;
}
public void setJob(String job){
this.job = job ;
}
public void setHiredate(Date hiredate){
this.hiredate = hiredate ;
}
public void setSal(float sal){
this.sal = sal ;
}
public int getEmpno(){
return this.empno ;
}
public String getEname(){
return this.ename ;
}
public String getJob(){
return this.job ;
}
public Date getHiredate(){
return this.hiredate ;
}
public float getSal(){
return this.sal ;
}
}
上面我們界說一個數據庫銜接類,擔任向數據庫提議銜接。java銜接數據庫須要驅動包,我們可以自行下載,測試的時刻我應用的是mysql-connector-java-5.0.5-bin.jar。在運轉法式的時刻Eclipse會提醒須要加載的數據庫驅動包,一些是相似於"org.gjt.mm.mysql.Driver" 之類的尺度包,普通來講我們選擇任務目次裡的驅動包便可以了。
import java.sql.Connection ;
import java.sql.DriverManager ;
/**
*
* @author Nero
*/
public class DatabaseConnection {
private static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
private static final String DBURL = "jdbc:mysql://localhost:3306/mldn" ;
private static final String DBUSER = "root" ;
private static final String DBPASSWORD = "root" ;
private Connection conn ;
public DatabaseConnection() throws Exception {
Class.forName(DBDRIVER) ;
this.conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ;
}
public Connection getConnection(){
return this.conn ;
}
public void close() throws Exception {
if(this.conn != null){
try{
this.conn.close() ;
}catch(Exception e){
throw e ;
}
}
}
}
接上去我們界說一個接口,這個接口可以或許贊助我們輕松地完成署理辦法。接口內的辦法只要三個:拔出、查找全體和經由過程ID查找。
import java.util.* ;
/**
*
* @author Nero
*/
public interface IEmpDAO {
public boolean doCreate(Emp emp) throws Exception ;
public List<Emp> findAll(String keyWord) throws Exception ;
public Emp findById(int empno) throws Exception ;
}
然後呢,我們繼續這個接口,完成詳細數據庫的操作類,都是一些很根本的數據庫操作,沒啥好說的。重要要留意的是結構函數那邊,參數應用Connection對象,前面應用這個類的時刻要傳入後面界說的數據庫銜接類DatabaseConnection中的函數getConnection()前往的Connection對象。
import java.sql.* ;
/**
*
* @author Nero
*/
public class EmpDAOImpl implements IEmpDAO{
private Connection conn = null ;
private PreparedStatement pstmt = null ;
public EmpDAOImpl(Connection conn)
{
this.conn = conn;
}
public boolean doCreate(Emp emp) throws Exception{
boolean flag = false;
String sql = "INSERT INTO emp(empno,ename,job,hiredate,sal) VALUES(?,?,?,?,?)";
this.pstmt = this.conn.prepareStatement(sql);
this.pstmt.setInt(1, emp.getEmpno());
this.pstmt.setString(2,emp.getEname()) ;
this.pstmt.setString(3,emp.getJob()) ;
this.pstmt.setDate(4,new java.sql.Date(emp.getHiredate().getTime())) ;
this.pstmt.setFloat(5,emp.getSal()) ;
if(this.pstmt.executeUpdate() > 0)
{
flag = true;
}
this.pstmt.close();
return flag;
}
public List<Emp> findAll(String keyWord) throws Exception{
List<Emp> all = new ArrayList<Emp>();
String sql = "SELECT empno,ename,job,hiredate,sal FROM emp WHERE ename LIKE ? OR job LIKE ?";
this.pstmt = this.conn.prepareStatement(sql);
this.pstmt.setString(1,"%"+keyWord+"%"); //本義字符
this.pstmt.setString(2,"%"+keyWord+"%");
ResultSet rs = this.pstmt.executeQuery(sql);
Emp emp = null;
while(rs.next())
{
emp = new Emp();
emp.setEmpno(rs.getInt(1));
emp.setEname(rs.getString(2)) ;
emp.setJob(rs.getString(3)) ;
emp.setHiredate(rs.getDate(4)) ;
emp.setSal(rs.getFloat(5)) ;
all.add(emp);
}
this.pstmt.close();
return all;
}
public Emp findById(int empno) throws Exception{
Emp emp = null ;
String sql = "SELECT empno,ename,job,hiredate,sal FROM emp WHERE empno=?" ;
this.pstmt = this.conn.prepareStatement(sql) ;
this.pstmt.setInt(1,empno) ;
ResultSet rs = this.pstmt.executeQuery() ;
if(rs.next()){
emp = new Emp() ;
emp.setEmpno(rs.getInt(1)) ;
emp.setEname(rs.getString(2)) ;
emp.setJob(rs.getString(3)) ;
emp.setHiredate(rs.getDate(4)) ;
emp.setSal(rs.getFloat(5)) ;
}
this.pstmt.close() ;
return emp ;
}
}
上面我們看看署理類的完成,小我認為到這裡就比擬成心思了。在這個類外面,聲清楚明了一個數據庫銜接類DatabaseConnection的對象,一個數據庫運用類EmpDAOImpl對象,用DatabaseConnection對象初始化EmpDAOImpl對象,然後在署理類的每一個函數中都應用EmpDAOImpl對象去挪用從統一接口繼續而來的辦法,如許即對詳細完成辦法停止了必定水平的隱蔽。
import java.sql.* ;
/**
*
* @author Nero
*/
public class EmpDAOProxy implements IEmpDAO{
private DatabaseConnection dbc = null ;
private EmpDAOImpl dao = null ;
public EmpDAOProxy() throws Exception{
this.dbc = new DatabaseConnection();
this.dao = new EmpDAOImpl(this.dbc.getConnection());
}
public boolean doCreate(Emp emp) throws Exception{
boolean flag = false;
try{
if(this.dao.findById(emp.getEmpno()) == null)
{
flag = this.dao.doCreate(emp);
}
}catch(Exception e)
{
throw e;
}finally{
this.dbc.close();
}
return flag;
}
public List<Emp> findAll(String keyWord) throws Exception{
List<Emp> all = null ;
try{
all = this.dao.findAll(keyWord) ;
}catch(Exception e){
throw e ;
}finally{
this.dbc.close() ;
}
return all ;
}
public Emp findById(int empno) throws Exception{
Emp emp = null ;
try{
emp = this.dao.findById(empno) ;
}catch(Exception e){
throw e ;
}finally{
this.dbc.close() ;
}
return emp ;
}
}
這還不是全體,我們可以再加一個工場類來完成工場形式:
/**
*
* @author Nero
*/
public class DAOFactory {
public static IEmpDAO getIEmpDAOInstance() throws Exception{
return new EmpDAOProxy() ;
}
}
這個工場類有甚麼用呢?最初我們在主類文件中停止挪用,可以看看工場類有甚麼感化:
/**
*
* @author Nero
*/
public class TestDAOInsert {
public static void main(String args[]) throws Exception{
Emp emp = null ;
for(int x=0;x<5;x++){
emp = new Emp() ;
emp.setEmpno(1000 + x) ;
emp.setEname("中文顯示測試 - " + x) ;
emp.setJob("法式員 - " + x) ;
emp.setHiredate(new java.util.Date()) ;
emp.setSal(500 * x) ;
DAOFactory.getIEmpDAOInstance().doCreate(emp) ;
}
}
}
可見詳細的完成辦法隱蔽得比擬好,經由過程工場類挪用get辦法獲得署理類,署理類挪用特定辦法,然後由署理類內的詳細操尴尬刁難象去挪用詳細的操作辦法。
其實這些器械看起來會認為很簡略,然則本身設計的時刻常常會忘卻。重要是由於用得不多吧,一開端老是要強制本身想起往來來往做,然後漸漸地能力釀成一種習氣。