程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 經由過程署理類完成java銜接數據庫(應用dao層操作數據)實例分享

經由過程署理類完成java銜接數據庫(應用dao層操作數據)實例分享

編輯:關於JAVA

經由過程署理類完成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辦法獲得署理類,署理類挪用特定辦法,然後由署理類內的詳細操尴尬刁難象去挪用詳細的操作辦法。

其實這些器械看起來會認為很簡略,然則本身設計的時刻常常會忘卻。重要是由於用得不多吧,一開端老是要強制本身想起往來來往做,然後漸漸地能力釀成一種習氣。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved