1.BaseDao :抽象基类,其中定义了用于打开连接,得到Statement,执行SQL,关闭资源的基础数据库操作方法。

2.I***Dao :操作指定数据表的接口:定义了操作数据表的抽象方法。

3***DaoImpl:具体工具类。实现I***Dao接口,继承BaseDao抽象类。用BaseDao中的方法实现I***Dao接口中定义的抽象接口。

基类用来提供访问数据库的基础方法,接口中定义了操作一个数据表所用到的方法。而具体类继承了基类就可以访问数据库,实现了接口就可以使用接口来操作数据库。

这样使得对类的依赖停留在接口层次。

下面用Oracle数据库中的 CUSINFO 表为目标数据表实现:

1.BaseDao 抽象基类

package org.oracal.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/*
 *@author:上官云清
 *@time:2014年8月5日
 *@todo:基础的DAO 工具类
 *@version: v1.0
 */

/**
 * @author:上官云清
 *
 */
public abstract class BaseDao {

private final static String DRIVER="oracle.jdbc.driver.OracleDriver";
    private final String URL="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
    private final String NAME="gsuser";
    private final String PASSW="gsuser";
    private Connection con = null;
    private PreparedStatement pstmt = null;
    private ResultSet set = null;
    
    /**
     * 加载数据库驱动
     *
     */
    static {
    try {
        Class.forName(DRIVER);
        } catch (ClassNotFoundException e) {
        e.printStackTrace();
        }
    }
    
    private  Connection getConnection(){
    Connection con =null;
    try {
        con = DriverManager.getConnection(URL, NAME , PASSW);
        } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
    return con;
    }
    /**
     * @param sql : select 语句
     *@param params 参数
     *@return:
     */
    public int  executeUpdate( String sql , List<Object> params){
    int i = 0;
    this.con = this.getConnection();
    try {
        this.pstmt = con.prepareStatement(sql);
        //add params
        if(params!=null){
        for( int j =0;j<params.size();j++){
            this.pstmt.setObject(j+1, params.get(j));
        }
        }
        this.pstmt.executeQuery();
        } catch (SQLException e) {
        e.printStackTrace();
        }finally{
           this.closeAll();
        }
    
    return i;
    }
    
    public ResultSet executeQuery( String sql , List<Object> params){
    this.con = this.getConnection();
    try {
        this.pstmt = con.prepareStatement(sql);
        //add params
        if(params!=null){
        for( int j =0;j<params.size();j++){
            this.pstmt.setObject(j+1, params.get(j));
        }
        }
        set = pstmt.executeQuery();
        } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }finally{
        }
    return set;
    }

private void closeResultSet(){
    try{
    if(set!=null){
        set.close();
        set=null;
    }
    }
    catch(SQLException e){
        e.printStackTrace();
    }
    }

private void closePreparedStatement(){
    if( this.pstmt!=null){
        try {
            this.pstmt.close();
            } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            }
        this.pstmt =null;
    }
    }

private void closeConncetion(){
    if(this.con!=null){
        try {
            this.con.close();
            } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            }
        this.con = null;
    }
    }
    
    public void closeAll(){
    this.closeResultSet();
    this.closePreparedStatement();
    this.closeResultSet();
    }
}

2.ICusinfoDao接口:

package org.oracal.dao;

import java.util.List;

import org.oracal.vo.Cusinfo;

/*
 *@author:上官云清
 *@time:2014年8月5日
 *@todo:TODO
 *@version:
 */
public interface ICusinfoDao {

public int save(Cusinfo cusinfo);
    public int delete(String cusno);
    public List<Cusinfo> selectAllInfo();
    public Cusinfo selectOneInfo(String cusno);
    
}

3.CusinfoDaoImpl 具体类,具体工具类

package org.oracal.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.oracal.dao.BaseDao;
import org.oracal.dao.ICusinfoDao;
import org.oracal.vo.Cusinfo;

/*
 *@author:上官云清
 *@time:2014年8月5日
 *@todo:TODO
 *@version:
 */
public class CusinfoDaoImpl extends BaseDao implements ICusinfoDao {

@Override
    public int save(Cusinfo cusinfo) {
    // TODO Auto-generated method stub
    String sql = "insert into cusinfo(cusno , cusname) values(?,?)";
    List<Object> params = new ArrayList<Object>();
    params.add(cusinfo.getCusNo());
    params.add(cusinfo.getCusName());
    return this.executeUpdate(sql, params);
    }

@Override
    public int delete(String cusno) {
    // TODO Auto-generated method stub
    return 0;
    }

@Override
    public List<Cusinfo> selectAllInfo() {
    // TODO Auto-generated method stub
    List<Cusinfo> list = new ArrayList<Cusinfo>();
    String sql = "select * from cusinfo";
    ResultSet rs = this.executeQuery(sql, null);
    try {
        while(rs.next()){
            Cusinfo cus = new Cusinfo();
            cus.setCusNo(rs.getString("cusno"));
            cus.setCusName(rs.getString("cusname"));
            list.add(cus);
        }
        } catch (SQLException e) {
        e.printStackTrace();
        }
    this.closeAll();
    return list;
    }

@Override
    public Cusinfo selectOneInfo(String cusno) {
    // TODO Auto-generated method stub
    Cusinfo cus = new Cusinfo();
    String sql = "select * from cusinfo where cusno = ?";
    List<Object> params = new ArrayList<Object>();
    params.add(cusno);
    ResultSet rs= this.executeQuery(sql, params);
    if(rs!=null){
        try {
            rs.next();
            cus.setCusNo(rs.getString("cusno"));
            cus.setCusName(rs.getString("cusname"));
            } catch (SQLException e) {
            e.printStackTrace();
            }
    }
    this.closeAll();
    return cus;
    }

}

JDBC 对数据库连接的封装的更多相关文章

  1. Java数据库连接池封装与用法

    Java数据库连接池封装与用法 修改于抄袭版本,那货写的有点BUG,两个类,一个用法 ConnectionPool类: package com.vl.sql; import java.sql.Conn ...

  2. 数据库连接JDBC和数据库连接池C3P0自定义的java封装类

    数据库连接JDBC和数据库连接池C3P0自定义的java封装类 使用以下的包装类都需要自己有JDBC的驱动jar包: 如 mysql-connector-java-5.1.26-bin.jar(5.1 ...

  3. Java Web(九) JDBC及数据库连接池及DBCP,c3p0,dbutils的使用

    DBCP.C3P0.DBUtils的jar包和配置文件(百度云盘):点我下载 JDBC JDBC(Java 数据库连接,Java Database Connectify)是标准的Java访问数据库的A ...

  4. JAVA jdbc获取数据库连接

    JDBC获取数据库连接的帮助类 import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManage ...

  5. JDBC 关闭数据库连接与自动提交【转】

    // Jdbc关闭数据库连接时,会隐含一个提交事务的操作 private final static String DB_DRIVER = "oracle.jdbc.driver.Oracle ...

  6. Java -- JDBC 学习--数据库连接池

    JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库连接. 这种模式开 ...

  7. 基于JDBC的数据库连接池技术研究与应用

    引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的3层开 ...

  8. 在IDEA中使用JDBC获取数据库连接时的报错及解决办法

    在IDEA中使用JDBC获取数据库连接时,有时会报错Sat Dec 19 19:32:18 CST 2020 WARN: Establishing SSL connection without ser ...

  9. 关于jdbc和数据库连接池的关系(不是封装的关系)

    你都说是数据库连接池了.那就是连接数据库用的.JDBC是java封装的对数据库的操作.当然你可以自己进一步封装.数据库连接池是JDBC使用的前提,如果连数据库连接池都没连上,JDBC的操作就谈不上了. ...

随机推荐

  1. jQuery和JS原生方法对比

  2. samba 报错

    [root@GitLab data_nfs]# smbclient //localhost/public WARNING: The security=share option is deprecate ...

  3. C#学习笔记----.net操作进程

    进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源.进程之间是相对独立的,一个进程无法直接访问另一个进程的数据(除非分布式),一个进程运行的失败也不会影响其他 ...

  4. Window Server 2003(IIS6) 安装.net4.0遇到的问题总结

    1.Window server 2003系统原本就装了.net1.0..net2.0 ,安装.net 4.0之前,系统已经发不了一些网站,这个时候,我安装.net 4.0返现程序不能访问了,提示ser ...

  5. oracle 11g r1 RAC增加新节点

    在一套两节点的rac上增加一个新的节点,详细的操作记录如下:   已有节点RAC1,RAC2 一,环境及版本: 公司环境:Vmware Esxi 5.5  操作系统:Redhat 5.8 x86_64 ...

  6. C# IP地址与整数之间的转换

    IP地址与整数之间的转换 1.IP地址转换为整数 原理:IP地址每段可以看成是8位无符号整数即0-255,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个无符号的32位整数. 举例:一 ...

  7. 浅学JSON——Json.NET之首次试手

    首次遭遇Json格式,缘由项目中用到Json数据,需要进行解析,为此,将Json数据转为了自己较为熟悉的DataTable格式,以此展示至DataGridView中,验证是否成功. 直接上代码: // ...

  8. leetcode1237

    date: 2015-09-09 20:20:58 Two Sum Given an array of integers, find two numbers such that they add up ...

  9. Vue入门笔记#过渡

    Vue过渡,可以在元素从DOM中移除,插入时自动调用过渡效果.根据设定,会适时的触发过渡效果. 在使用的目标标签里添加 transition: <div transition="my_ ...

  10. pythonchallenge之C++学习篇-00

    前言 最近学习下C++,之前是python的用户,python解释器有诸多实现,其中最出名的要数C实现了,而且很多python的扩展模块可能要用C或者C++来写的,所以很有必要学习下C++了 为了避免 ...