一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 通過代理類實現java連接數據庫(使用dao層操作數據)實例分享

通過代理類實現java連接數據庫(使用dao層操作數據)實例分享

2019-10-26 16:32java教程網 JAVA教程

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方法獲取代理類,代理類調用特定方法,然后由代理類內的具體操作對象去調用具體的操作方法。

其實這些東西看起來會覺得很簡單,但是自己設計的時候往往會忘記。主要是因為用得不多吧,一開始總是要強迫自己想起來去做,然后慢慢地才能變成一種習慣。

延伸 · 閱讀

精彩推薦
  • JAVA教程idea遠程調試spark的步驟講解

    idea遠程調試spark的步驟講解

    今天小編就為大家分享一篇關于idea遠程調試spark的步驟講解,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來...

    雙斜杠少年4702019-06-23
  • JAVA教程Scala之文件讀取、寫入、控制臺操作的方法示例

    Scala之文件讀取、寫入、控制臺操作的方法示例

    這篇文章主要介紹了Scala之文件讀取、寫入、控制臺操作的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,...

    robwang1513752019-07-07
  • JAVA教程Java線程優先級示例代碼

    Java線程優先級示例代碼

    使用過Bit下載軟件的同學應該很清楚,我們有多個下載任務同時執行,而其中的某一個或多個是非常重要的,于是給這些任務設定一個高度優先,以便任務...

    Java教程網2292019-10-13
  • JAVA教程java階乘計算獲得結果末尾0的個數代碼實現

    java階乘計算獲得結果末尾0的個數代碼實現

    今天偶然看到一個要求,求1000~10000之間的數n的階乘并計算所得的數n!末尾有多少個0?要求: 不計算 只要得到末尾有多少個0就可以了,看下面的代碼吧 ...

    java代碼網4412019-10-23
  • JAVA教程Java 添加Word目錄的2種方法示例代碼詳解

    Java 添加Word目錄的2種方法示例代碼詳解

    目錄是一種能夠快速、有效地幫助讀者了解文檔或書籍主要內容的方式。這篇文章主要介紹了Java 添加Word目錄的2種方法 ,需要的朋友可以參考下...

    E-iceblue2772019-07-04
  • JAVA教程Struts2源碼分析之ParametersInterceptor攔截器

    Struts2源碼分析之ParametersInterceptor攔截器

    這篇文章主要介紹了Struts2源碼分析之ParametersInterceptor攔截器,ParametersInterceptor攔截器其主要功能是把ActionContext中的請求參數設置到ValueStack中,,需要的朋友...

    chen_hao1672019-07-04
  • JAVA教程log4j的使用詳細解析

    log4j的使用詳細解析

    最近在整理公司產品的日志輸出規范,涉及log4j的使用介紹,就簡單整理了一下。需要的朋友可以過來參考參考 ...

    java之家4152019-10-11
  • JAVA教程Java parseInt解釋加方法示例

    Java parseInt解釋加方法示例

    使用此方法得到的原始數據類型的一個特定的字符串。 parseXxx()是一個靜態方法,可以有一個參數或兩個 ...

    java教程網4652019-10-18
主站蜘蛛池模板: 果冻传媒在线视频观看免费 | www.91在线视频| 麻豆视频免费在线播放 | 99午夜高清在线视频在观看 | 国产成人亚洲综合91精品555 | 日本高清视频一区二区 | 免费观看在线永久免费xx视频 | 亚洲欧美一区二区三区在饯 | 国产精品极品 | 国产亚洲一区二区三区 | 色老妇 | chinese野外gay军人 | 美女牲交毛片一级视频 | 国产精品自在欧美一区 | 福利视频导航大全 | 国产 国语对白 露脸正在播放 | 精品国产乱码久久久久久人妻 | 久久热这里只有 精品 | 成人在线小视频 | 视频一区久久 | 久久久精品国产免费A片胖妇女 | 久久亚洲精品AV成人无码 | 校园全肉高h湿一女多男 | 国内精品一区二区三区东京 | 欧美不卡一区二区三区 | 草久久网 | 男同互操| 天天综合天天综合 | 情趣内衣在线观看 | 91啦中文在线观看 | 日本深夜影院 | 大桥未久midd—962在线 | 55夜色66夜亚州精品站 | 国产一级一级一级成人毛片 | 特级毛片免费视频观看 | 男女视频在线观看 | 日韩综合久久 | 国产精品福利在线观看秒播 | 三级aa久久| 423hk四虎| 亚洲麻豆精品 |