亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

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

2019-11-26 15:49:59
字體:
來源:轉載
供稿:網友

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产视频久久久久| 亚洲色图色老头| 国产精品丝袜白浆摸在线| 国产精品福利在线观看| 91久久在线观看| 久久夜色精品国产亚洲aⅴ| 亚洲经典中文字幕| 78m国产成人精品视频| 日韩中文字幕免费视频| 国产精品扒开腿爽爽爽视频| 国产精品pans私拍| 精品国产一区二区三区久久狼5月| 久久久久www| 欧洲成人在线观看| 国产精品爽爽爽爽爽爽在线观看| 亚洲欧美日韩一区在线| 欧美性xxxxxxx| 亚洲精品美女免费| 国产精品视频精品| 国产精品私拍pans大尺度在线| 一区二区三区回区在观看免费视频| 亚洲另类激情图| 欧美激情视频在线| 91精品在线影院| 国产精品扒开腿做爽爽爽男男| 成人xvideos免费视频| 亚洲精品色婷婷福利天堂| 国产精品免费福利| 久久精品亚洲一区| 91久久久在线| 欲色天天网综合久久| 欧美日韩在线视频一区| 国产精品成人免费电影| 亚洲成av人片在线观看香蕉| 日韩av手机在线看| 在线精品91av| 岛国精品视频在线播放| 欧美极品在线视频| 亚洲成人久久一区| 日韩欧美国产视频| 日韩激情视频在线| 亚洲国产成人精品久久久国产成人一区| 亚洲深夜福利网站| 日本人成精品视频在线| 97精品国产97久久久久久春色| 色综合伊人色综合网站| 亚洲丝袜在线视频| 欧美日韩久久久久| 国产精品亚洲精品| 亚洲三级 欧美三级| 亚洲欧美日韩国产中文专区| 亚洲精品ady| 亚洲综合大片69999| 亚洲欧美日韩中文在线制服| 亚洲人成网站999久久久综合| 亚洲成人动漫在线播放| 国产日韩欧美另类| 欧美xxxx18性欧美| 91九色视频在线| 亲爱的老师9免费观看全集电视剧| 一区二区三区www| 欧美一级淫片aaaaaaa视频| 欧美午夜激情在线| 成人h视频在线观看播放| 91人人爽人人爽人人精88v| 亚洲激情久久久| 51精品在线观看| 亚洲97在线观看| 国产精品久久久久久婷婷天堂| 国产午夜精品理论片a级探花| 国产精品美女www| 狠狠爱在线视频一区| 97国产成人精品视频| 国产ts人妖一区二区三区| 亚洲精品久久久久久久久久久久久| 另类视频在线观看| 日韩av在线资源| 国内精品久久久| 国内自拍欧美激情| 国产做受高潮69| 成人做爽爽免费视频| 深夜福利日韩在线看| 亚洲欧洲日韩国产| 国产精品欧美激情在线播放| 亚洲精品xxx| 亚洲摸下面视频| 国产999精品久久久| 68精品国产免费久久久久久婷婷| 欧美极品少妇xxxxⅹ免费视频| 黑人精品xxx一区一二区| 91久久久久久国产精品| 欧美综合在线第二页| 韩国三级电影久久久久久| 在线视频精品一| 一区二区在线视频播放| 中文字幕亚洲欧美在线| 国产一区二区日韩| 久久久亚洲精选| 亚洲欧美日韩第一区| 69影院欧美专区视频| 欧美俄罗斯性视频| 欧美黑人视频一区| 91精品国产综合久久久久久久久| 久久99久国产精品黄毛片入口| 国产精品成人v| 日韩一区二区三区国产| 国产精品爽黄69天堂a| 国产高清在线不卡| 国产精品免费久久久| 亚洲午夜未满十八勿入免费观看全集| 91牛牛免费视频| 久久久久久久国产精品视频| 黄网动漫久久久| 亚洲国产天堂久久综合| 国产日韩一区在线| 亚洲肉体裸体xxxx137| 亚洲免费视频观看| 欧美性猛交xxxx乱大交3| 亚洲成人激情视频| 国产日韩精品一区二区| 欧美精品激情在线| 欧美黄色小视频| 亚洲精品99久久久久中文字幕| 亚洲最大的网站| 精品露脸国产偷人在视频| 日韩高清电影免费观看完整版| 国产精品视频网址| 欧美影院久久久| 色综合老司机第九色激情| 欧美激情乱人伦一区| 97人洗澡人人免费公开视频碰碰碰| 中日韩午夜理伦电影免费| 欧美成aaa人片免费看| 日韩av中文字幕在线免费观看| 一区二区三区视频观看| 亚洲午夜激情免费视频| 欧美人交a欧美精品| 欧美精品在线播放| 日韩精品极品在线观看| 国产成人精品在线观看| 日韩激情视频在线播放| 成人福利网站在线观看11| 成人黄色av免费在线观看| 国产精品久久久久久久av电影| 91精品久久久久久久久久入口| 日韩免费中文字幕| 国产91ⅴ在线精品免费观看| 欧美成人午夜免费视在线看片| 亚洲欧美中文字幕| 亚洲free性xxxx护士白浆| 亚洲美女在线观看| 在线观看久久av| 精品日本美女福利在线观看| 成人免费视频网| 欧美影院在线播放| 国产精品久久久久99| 91免费在线视频| 欧美一性一乱一交一视频| 2020久久国产精品| 亚洲欧洲一区二区三区在线观看| 国产精品专区第二| 日韩高清免费在线| 亚洲精品视频免费| 欧美日韩免费网站|