最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2013年12月25日 11:16:39   作者:  
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 ;
    }
}

下面我們定義一個數據庫連接類,負責向數據庫發(fā)起連接。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方法獲取代理類,代理類調用特定方法,然后由代理類內的具體操作對象去調用具體的操作方法。

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

相關文章

  • 如何使用Spring Boot ApplicationRunner解析命令行中的參數

    如何使用Spring Boot ApplicationRunner解析命令行中的參數

    這篇文章主要介紹了使用Spring Boot ApplicationRunner解析命令行中的參數,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-12-12
  • java實現pgsql自動更新創(chuàng)建時間與更新時間的兩種方式小結

    java實現pgsql自動更新創(chuàng)建時間與更新時間的兩種方式小結

    本文主要介紹了java實現pgsql自動更新創(chuàng)建時間與更新時間的兩種方式小結,主要包括通過數據庫自身實現以及通過mybatisplus的TableField注解添加,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • SpringBoot動態(tài)Feign服務調用詳解

    SpringBoot動態(tài)Feign服務調用詳解

    Feign是Netflix公司開發(fā)的一個聲明式的REST調用客戶端; Ribbon負載均衡、 Hystrⅸ服務熔斷是我們Spring Cloud中進行微服務開發(fā)非?;A的組件,在使用的過程中我們也發(fā)現它們一般都是同時出現的,而且配置也都非常相似
    2022-12-12
  • MyBatis批量插入幾千條數據為何慎用foreach

    MyBatis批量插入幾千條數據為何慎用foreach

    這篇文章主要介紹了MyBatis批量插入幾千條數據為何慎用foreach問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • springboot 通過代碼自動生成pid的方法

    springboot 通過代碼自動生成pid的方法

    這篇文章主要介紹了springboot 通過代碼自動生成pid的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Spring中@PropertySource的使用方法和運行原理詳解

    Spring中@PropertySource的使用方法和運行原理詳解

    這篇文章主要介紹了Spring中@PropertySource的使用方法和運行原理詳解,PropertySource注解可以方便和靈活的向Spring的環(huán)境容器(org.springframework.core.env.Environment?Environment)中注入一些屬性,這些屬性可以在Bean中使用,需要的朋友可以參考下
    2023-11-11
  • Java如何實現數據壓縮所有方式性能測試

    Java如何實現數據壓縮所有方式性能測試

    本文介紹了多種壓縮算法及其在Java中的實現,包括LZ4、BZip2、Deflate、Gzip和7z等,LZ4以其高效的壓縮和解壓縮速度而受到青睞,特別是在大數據處理場景中,通過對比不同壓縮算法的性能和壓縮率,我們選擇了最適合當前項目需求的壓縮工具
    2025-02-02
  • 一篇文章帶你入門Java變量

    一篇文章帶你入門Java變量

    這篇文章主要介紹了Java變量,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • Java HashMap源碼及并發(fā)環(huán)境常見問題解決

    Java HashMap源碼及并發(fā)環(huán)境常見問題解決

    這篇文章主要介紹了Java HashMap源碼及并發(fā)環(huán)境常見問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • 解決java后臺登錄前后cookie不一致問題

    解決java后臺登錄前后cookie不一致問題

    本文主要介紹了java后臺登錄前后cookie不一致的解決方案,具有很好的參考價值,需要的朋友一起來看下吧
    2016-12-12

最新評論

河源市| 满城县| 禹城市| 喀什市| 公主岭市| 织金县| 南川市| 来宾市| 永寿县| 察雅县| 淄博市| 阳城县| 中牟县| 彝良县| 高清| 焦作市| 开封县| 江永县| 若羌县| 台北市| 呼玛县| 内江市| 青龙| 南宫市| 隆德县| 九龙城区| 莎车县| 南平市| 汤阴县| 磐石市| 岗巴县| 桂东县| 赤水市| 四子王旗| 华池县| 高密市| 神木县| 晋州市| 苏尼特左旗| 大庆市| 绥滨县|