JDBC 对数据库连接的封装
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 对数据库连接的封装的更多相关文章
- Java数据库连接池封装与用法
Java数据库连接池封装与用法 修改于抄袭版本,那货写的有点BUG,两个类,一个用法 ConnectionPool类: package com.vl.sql; import java.sql.Conn ...
- 数据库连接JDBC和数据库连接池C3P0自定义的java封装类
数据库连接JDBC和数据库连接池C3P0自定义的java封装类 使用以下的包装类都需要自己有JDBC的驱动jar包: 如 mysql-connector-java-5.1.26-bin.jar(5.1 ...
- Java Web(九) JDBC及数据库连接池及DBCP,c3p0,dbutils的使用
DBCP.C3P0.DBUtils的jar包和配置文件(百度云盘):点我下载 JDBC JDBC(Java 数据库连接,Java Database Connectify)是标准的Java访问数据库的A ...
- JAVA jdbc获取数据库连接
JDBC获取数据库连接的帮助类 import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManage ...
- JDBC 关闭数据库连接与自动提交【转】
// Jdbc关闭数据库连接时,会隐含一个提交事务的操作 private final static String DB_DRIVER = "oracle.jdbc.driver.Oracle ...
- Java -- JDBC 学习--数据库连接池
JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库连接. 这种模式开 ...
- 基于JDBC的数据库连接池技术研究与应用
引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的3层开 ...
- 在IDEA中使用JDBC获取数据库连接时的报错及解决办法
在IDEA中使用JDBC获取数据库连接时,有时会报错Sat Dec 19 19:32:18 CST 2020 WARN: Establishing SSL connection without ser ...
- 关于jdbc和数据库连接池的关系(不是封装的关系)
你都说是数据库连接池了.那就是连接数据库用的.JDBC是java封装的对数据库的操作.当然你可以自己进一步封装.数据库连接池是JDBC使用的前提,如果连数据库连接池都没连上,JDBC的操作就谈不上了. ...
随机推荐
- WebService – 3.后台调用WebService,根级别上的数据无效
1.因为我的webservice返回的是json, 2.ajax传递跨域不安全, 3.contentType: "application/json; charset=utf-8", ...
- Linux Shell 高级编程技巧4----几个常用的shell脚本例子
4.几个常用的shell脚本例子 4.0.在写脚本(同样适用在编程的时候),最好写好完善的注释 4.1.kill_processes.sh(一个杀死进程的脚本) #!/bin/bash c ...
- python列表分组的技巧
今天项目上需要到的. 如,将并行部署的机器分批次. 一次十台机器,如果分3次并行部署,则第一次123,第二次456,第三次789,第四次10. #coding=utf-8 a=[1,2,3,4,5,6 ...
- ytu 1058: 三角形面积(带参的宏 练习)
1058: 三角形面积 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 190 Solved: 128[Submit][Status][Web Boar ...
- 详细的JavaScript事件使用指南
事件流 事件流描述的是从页面中接收事件的顺序,IE和Netscape提出来差不多完全相反的事件流的概念,IE事件流是事件冒泡流,Netscape事件流是事件捕获流. 事件冒泡 IE的事件流叫做事 ...
- SSIS 包单元测试检查列表
1. 使用脚本任务(Script tasks) 组建的时候,在日志里增加一些调试信息,例如变量更新信息,可以帮助我们从日志中查看到变量是在何时何地更新的. 2. 使用ForceExecutionRes ...
- Python多版本共存之pyenv
经常遇到这样的情况: 系统自带的Python是2.6,自己需要Python 2.7中的某些特性: 系统自带的Python是2.x,自己需要Python 3.x: 此时需要在系统中安装多个Python, ...
- Active Record 数据库模式-增删改查操作
选择数据 下面的函数帮助你构建 SQL SELECT语句. 备注:如果你正在使用 PHP5,你可以在复杂情况下使用链式语法.本页面底部有具体描述. $this->db->get(); 运行 ...
- phpcms v9 黄页实现手机访问手机版,电脑访问电脑版(双模板)
第一步.模板文件夹下,yp复制一份,改名字 ypwap 第二步.修改phpcms/modules/yp/index.php和phpcms/modules/ypwap/index.php //判断客户端 ...
- NS2中trace文件分析
ns中模拟出来的时间最终会以trace文件的形式告诉我们,虽然说一般都是用awk等工具分析trace文件,但是了解trace文件的格式也是必不可少的.下面就介绍一下无线网络模拟中trace文件的格式. ...