当前位置:  编程技术>java/j2ee

通过代理类实现java连接数据库(使用dao层操作数据)实例分享

    来源: 互联网  发布时间:2014-10-30

    本文导语:  首先,我们在一个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 ;    p...

首先,我们在一个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 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 findAll(String keyWord) throws Exception{
        List all = new ArrayList();
        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 findAll(String keyWord) throws Exception{
        List 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

    
 
 

您可能感兴趣的文章:

  • php通过pack和unpack函数实现对二进制数据封装及解析
  • 现在java开发中流行通过什么方式实现对数据库操作?就好像Visual Stadio通过ADO访问数据库。
  • 通过套接字捕获数据包,如何捕获大多数(全部)的通过网卡的包,并要求显示MAC地址和IP地址
  • java中的数据库结果集可以被赋值吗,可以通过结果集的方法来更新数据库字段吗?
  • 通过JDBC连接数据库,执行抄作后,关闭了连接,数据服务器端的进程还在,怎麽处理?
  • 博客 iis7站长之家
  • vc通过socket发送数据给java的问题
  • linux下几个设备通过串口串行连接,如何协调各串口发送数据
  • 通过/dev/sda文件取硬盘末尾数据的问题
  • 通过JdbcOdbcDriver连接Access出现“未发现数据源名称并且未指定默认驱动程序”
  • 数据包进入网卡后如何通过TCPIP协议进行发送
  • 通过位图头文件计算BMP的数据大小
  • LINUX下如何通过电话线传输数据
  • 数据包通过dev_queue_xmit发送出去,dev_queue_xmit返回值为0,但是对方收不到数据包 ,本机也抓不到发送出去的包
  • 怎样通过表单将输入的日期取出,并保存到数据库中
  • 通过socket连接一次性发送大数据量的问题
  • 各位老兄好,通过ObjectoutputStream ,ObjectINputStream 如何读写数据
  • 不想通过jdbc-odbc桥,连接数据库,该怎么做?
  • 想法:内存中的数据通过DMA存储到USB-disk中
  • 如何通过servlet提取表单中提交的数据〉如姓名,〉〉.....载线等待,一定给分!!!
  • 大家有多少web application是直接连接数据库的?又有多少是通过weblogic或websphere之类连接的?
  • .NET下 c#通过COM组件操作并导出Excel实例代码
  • 万般火急!关于java打印,已经得到printerJob实例,那么怎么通过它得到Pageable实例?
  • C++通过TerminateProess结束进程实例
  • 怎样判断一个对象是通过什么类实例化出来的?
  • Java通过接口实现匿名类的实例代码
  • C语言创建链表错误之通过指针参数申请动态内存实例分析
  • php实例分享之通过递归实现删除目录下的所有文件详解
  • 通过LinQ查询字符出现次数的实例方法
  • Android下通过httpClient发送GET和POST请求的实例代码
  • Android通过手势实现的缩放处理实例代码
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 紧急求救!能通过jdbc怎样连接sqlsever 然后通过 for xml 关键字得到xml流吗?
  • 那位哥们能举个通过jndi连接连接池的例子??多谢!!!
  • 请问通过纯jdbc能否联 sqlserver7.0,注意不是通过jdbc-odbc桥,如果能的话,driver在哪里下载?连接的语句怎么写?
  • 怎么直接通过JDBC连接oracle?
  • kjava能不能通过socket连接服务器
  • mysql主从连接失败,怎样通过binlog日志恢复呢?
  • 紧急求救 我用freebsd通过smbfs连接win2000的一些问题 (分不够可加)
  • 紧急求救 我用freebsd通过smbfs连接win2000的一些问题
  • 怎么通过主机名连接server机
  • 请教高手,通过ssh连接suse linux的三种方式是否可以修改?
  • 通过JDBC能够连接access吗,不使用ODBC
  • 怎样在linux下建立一个PPP服务器,并在另一台机子上通过pppd来建立连接呀?
  • linux重启后无法通过ssh连接
  • linux下通过工具putty连接服务器,用批处理启动jboss后,如何使得关闭窗口而服务不停?
  • 怎样通过Ip地址连接Sql server 数据库?
  • vs2008可以通过sftp协议连接远端linux服务器吗
  • 请教Linu下通过局域网连接Internet(急需要帮助,谢谢)
  • Window客户端通过ADO是否能够连接和操作Unix平台下的Oracle数据库?
  • 通过JDBC如何与SYBASE数据库的连接?
  • jsp怎么通过jdbc连接db2数据库?
  • 通过javascript实现DIV居中,兼容各浏览器版本
  • applet可以不通过数字签名,通过设置IE直接在本地访问本地文件吗
  • php通过socket_bind()设置IP地址代码示例
  • 我使用.net编译通过,但是使用g++编译不能通过。总是提示我undefined reference to ~myclass()
  • 通过javascript库JQuery实现页面跳转功能代码
  • 我想我的网站屏蔽掉通过某些网站过来的访问,我想通过htaccess 文件来做,请大家帮帮我。
  • c#通过委托delegate与Dictionary实现action选择器代码举例
  • 如何通过INTERNET访问通过共项一条线路上网的局域网中的机器???
  • linux下通过crond实现自动执行程序
  • 为什么g++编译通过了,而gcc却编译通过不了???
  • 通过docker commit命令保存对docker容器的修改




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3