下面的一个DBase基类提供了一些jdbc的基本操作,配置文件的配置部分并不准确,只是在自己机器上的mysql中测试过。。

数据库的增删改方法中都在开始调用了getConnection方法,末尾调用了Close方法;
数据库的查询中没有调用close方法,因为一旦调用了close方法,就无法用RecodeSet操作查询结果了,
所以在调用了查询方法后,要调用close方法,防止出现 too many connections 错误。

此外,DBase中的所有对象都是static的,所以在使用时不要调用多余的DBase的getConnection方法,
因为,调用了getConnection方法后,初始化了静态的Connection变量conn,然后调用DBase的增删改查方法,又会初始化conn变量,

这个时候前一个初始化的conn虽然已经没有引用了,但是会等待GC回收。这个时段不会关闭建立的Connection,可能会导致too many connections 错误,

jdbc和数据库建立的连接要立刻断开的话必须要使用close方法。

DBase

 package db;

 import java.io.File;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; public class DBase { private static String db_driver = "";//数据库驱动
private static String db_url = "";//连接字符串
private static String db_userName = "";//用户名
private static String db_userPass = "";//用户密码
private static String db_state = "";//状态
private static String db_dataBaseName = "";//数据库名 private static Connection conn = null;
private static PreparedStatement pst = null;
private static CallableStatement cs= null;
private static ResultSet res = null;
private static Statement st = null;
/**
* 加载必要的数据库连接信息
*/
private static void init(){
try {
String url = Class.class.getClass().getResource("/").getPath(); //获取当前项目在本地的物理路径
// System.out.println(url);
//利用dom4j获取xml文件的信息
SAXReader reader = new SAXReader();
Document document = reader.read(new File(url + "db.xml"));
Element root = document.getRootElement();//xml文件的根目录
db_state = root.element("sqlserver").element("state").getText();
db_driver = root.element("sqlserver").element("driver").getText();
db_userName = root.element("sqlserver").element("userName").getText();
db_userPass = root.element("sqlserver").element("userPass").getText();
db_dataBaseName = root.element("sqlserver").element("dataBaseName").getText();
db_url = "jdbc:sqlserver://" + root.element("sqlserver").element("baseURL").getText() + ":1433;databasename="
+ db_dataBaseName;
if(db_state == "0" || "0".equals(db_state)){
db_state = root.element("mysql").element("state").getText();
db_driver = root.element("mysql").element("driver").getText();
db_userName = root.element("mysql").element("userName").getText();
db_userPass = root.element("mysql").element("userPass").getText();
db_dataBaseName = root.element("mysql").element("dataBaseName").getText();
db_url = "jdbc:mysql://" + root.element("mysql").element("baseURL").getText() + "/"
+ db_dataBaseName;
// System.out.println(db_url);
}
if(db_state == "0" || "0".equals(db_state)){
db_state = root.element("oracle").element("state").getText();
db_driver = root.element("oracle").element("driver").getText();
db_userName = root.element("oracle").element("userName").getText();
db_userPass = root.element("oracle").element("userPass").getText();
db_dataBaseName = root.element("oracle").element("dataBaseName").getText();
db_url = "http://" + root.element("oracle").element("baseURL").getText() + ":1433;databasename="
+ db_dataBaseName;
}
} catch (DocumentException e) {
e.printStackTrace();
} } /**
* 创建数据库连接
* @return
*/
public static Connection getConn(){
init();
try {
Class.forName(db_driver);
conn = java.sql.DriverManager.getConnection(db_url, db_userName, db_userPass);
conn.setAutoCommit(false); //关闭自动提交功能,改为人工提交事务
System.out.println("connection success~");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
} /**
* 关闭数据库参数
*/
public static void close(){
try {
if(res != null){
res.close();
}
if(pst != null){
pst.close();
}
if(st != null){
st.close();
}
if(cs != null){
cs.close();
}
if(conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
} /**
* 执行sql语句的增删改
* @param sql
* @param param
* @return
*/
public static Integer executeSQL(String sql,String[] param) throws SQLException{
Integer result = 0;
conn = null;
pst = null;
try {
conn = getConn();
pst = conn.prepareStatement(sql);
if(param != null){
for(int i = 0; i < param.length; i++){
pst.setString(i + 1, param[i]);
}
}
result = pst.executeUpdate();
conn.commit();//提交事务
} catch (SQLException e) {
conn.rollback();//回滚事务
e.printStackTrace();
}finally{
close();
}
return result;
} /**
* 批处理的增删改
* @param sql
* @return
*/
public static Integer executeSQLBatch(String sql) throws SQLException{
Integer result = 1;
try {
conn = null;
st = null;
conn = getConn();
st = conn.createStatement();
st.addBatch(sql);
int[] resultArray = st.executeBatch();
for(int i = 0; resultArray.length > 0 && i < resultArray.length;i++){
if(resultArray[i] <= 0){
result = 0;
}
}
if(result > 0){
conn.commit();
}
} catch (SQLException e) {
conn.rollback();
e.printStackTrace();
}finally{
close();
}
return result; } /**
* 执行存储过程的增删改
* @param sql
* @param param
* @return
*/
public static Integer executeSQLProc(String sql,String[] param) throws SQLException{
Integer result = 0;
conn = null;
cs = null;
try {
conn = getConn();
cs = conn.prepareCall(sql);
if(param != null){
for(int i = 0; i < param.length; i++){
cs.setString(i + 1, param[i]);
}
}
result = cs.executeUpdate();
conn.commit();//提交事务
} catch (SQLException e) {
conn.rollback();//回滚事务
e.printStackTrace();
}finally{
close();
}
return result;
} /**
* 普通sql查询
* @param sql
* @param param
* @return
*/
public static ResultSet execute(String sql,String[] param){
try {
conn = getConn();
pst = conn.prepareStatement(sql);
if(param != null){
for(int i = 0; i < param.length; i++){
pst.setString(i + 1, param[i]);
}
}
res = pst.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
// finally{
// close();
// }
return res;
} /**
* 执行存储过程的查询
* @param sql
* @param param
* @return
*/
public static ResultSet executeProc(String sql,String[] param){
conn = null;
cs = null;
res = null;
try {
conn = getConn();
cs = conn.prepareCall(sql);
if(param != null){
for(int i = 0; i < param.length; i++){
cs.setString(i + 1, param[i]);
}
}
res = cs.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return res;
}
}

配置文件db.xml

<?xml version="1.0" encoding="UTF-8"?>
<database>
<sqlserver>
<driver>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver>数据库驱动
<userName>sa</userName>用户名
<userPass>sapassword</userPass>密码
<state>0</state> 状态,是否开启
<dataBaseName>test</dataBaseName>数据库名
<baseURL>localhost</baseURL>服务器地址
</sqlserver>
<mysql>
<driver>com.mysql.jdbc.Driver</driver><!-- 数据库驱动 -->
<userName>root</userName><!-- 用户名 -->
<userPass>123</userPass><!-- 密码 -->
<state>1</state> <!-- 状态,是否开启 -->
<dataBaseName>baiduixia</dataBaseName><!-- 数据库名 -->
<baseURL>127.0.0.1:6606</baseURL><!-- 服务器地址 -->
</mysql>
<oracle>
<driver>oracle.jdbc.driver.OracleDriver</driver>数据库驱动
<userName>root</userName>用户名
<userPass>root</userPass>密码
<state>0</state> 状态,是否开启
<dataBaseName>test</dataBaseName>数据库名
<baseURL>localhost</baseURL>服务器地址
</oracle>
</database>

JDBC之——一个单线程JDBC基类和一些注意事项的更多相关文章

  1. C# Winform下一个热插拔的MIS/MRP/ERP框架12(数据处理基类)

    作为ERP等数据应用程序,数据库的处理是重中之重. 在框架中,我封装了一个数据库的基类,在每个模组启动或窗体启动过程中,实例化一个基类即可调用CRUD操作(create 添加read读取 update ...

  2. 构建自己的PHP框架--抽象Controller的基类

    上一篇博客中,我们将简单的路由解析和执行,从入口文件public/index.php中移入到框架中.入口文件顿时变得清爽无比-- 但是,去我们的controller里看一下,会看到如下的code: p ...

  3. Android 自定义Activity基类与TitleBar

    我们在开发App的时候有时候碰到多个界面有一个共同点的时候,比如,都有相同的TitleBar,并且TitleBar可以设置显示的文字.TitleBar上的点击事件,如果给每一个Activity都写一遍 ...

  4. C++:虚基类

    4.4.3 虚基类1.没什么要引入虚基类 如果一个类有多个直接基类,而这些直接基类又有一个共同的基类,则在最底层的派生类中会保留这个间接的共同基类数据成员的多分同名成员.在访问这些同名的成员时,必须在 ...

  5. 【c++内存分布系列】虚基类表

    虚基类表相对于虚函数表要稍微难理解些,故单独提出来. 虚函数表是在对象生成时插入一个虚函数指针,指向虚函数表,这个表中所列就是虚函数. 虚基类表原理与虚函数表类似,不过虚基类表的内容有所不同.表的第一 ...

  6. 可以继承的C++ Singleton基类

    单例模式(Singleton Pattern)是设计模式中的一种,它用来保证系统中最多只能存在一个它的实例,其做法是由类自身来创建和持有它的对象实例,把对实例的创建权和管理权都控制在自己手中,以便控制 ...

  7. [Effective C++ --007]为多态基类声明virtual析构函数

    引言: 我们都知道类的一个很明显的特性是多态,比如我们声明一个水果的基类: class Fruit { public: Fruit() {}; ~Fruit(){}; } 那么我们根据这个Fruit基 ...

  8. C++虚基类详解(转)

    我们知道,如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员.在引用这些同名的成员时,必须在派生类对象名后增加直接基类名,以避 ...

  9. C++学习之路—继承与派生(三):多重继承与虚基类

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 多重继承是指一个派生类有两个或多个基类.例如,有 ...

随机推荐

  1. C# 数据库查询总结

    首先创建了一个SQL Server数据库作为测试的数据库,建立表并填入测试数据 数据库:SQL Server 数据库名:Blog 表名:Test 注:数据库的连接可以使用“dbl”文件测试,具体使用百 ...

  2. struts2 action 3中书写方式

    1.pojo类   简单的javabean 类 需要有 public String execute(){return null;} 2.实现 Action 借口  重写 execute 3.继承 Ac ...

  3. volley post非json格式数据并获取json数据

    在使用JsonObjectRequest时无法post非json格式的数据,因而采用StringRequest获取到相应的数据后再转为json格式的数据. //这里的上下文需要讨论 private s ...

  4. Delphi 多步操作产生错误,请检查每一步的状态值

    需检查是否是以下这些情况: 1.  字段是不是精度不够. 2.  无主键 3.  字段允许为空 4.  字段类型不匹配 5.  ADO控件 CursorLocation的属性,默认值为"cl ...

  5. 【Android】如何将eclipse工程导入studio

    1.eclipse工程右键->export->Generate Gradle build files 2.studio->New->import project->选择工 ...

  6. 魅族MX3\MX2 在MTP模式下恢复手机误删数据教程

    昨天帮室友的魅族mx3升级系统,结果不小心把他手机里的照片删了.但是自从flyme升级到3后,以前的U盘模式就改成了MTP模式,这样再连接电脑后就没办法用电脑上的数据恢复软件恢复数据了,因为压根就检测 ...

  7. JavaScript高级程序设计学习笔记--基本概念

    1.语句 ECMAScript中的语句以一个分号结尾:如果省略分号,则由解析器确定语句的结尾,如下例所示: var sum=a+b //即使没有分号也是有效的语句--推荐 var diff=a-b; ...

  8. HDU 5833 Zhu and 772002 (数论+高斯消元)

    题目链接 题意:给定n个数,这n个数的素因子值不超过2000,从中取任意个数使其乘积为完全平方数,问有多少种取法. 题解:开始用素筛枚举写了半天TLE了,后来队友说高斯消元才想起来,果断用模板.赛后又 ...

  9. 类中实现 Dispose And Finalize

    1.Dispose方法中,应该使用GC.SuppressFinalize防止GC调用Finalize方法,因为显示调用Dispose比较好. 2.Disposed字段保证了两次调用Dispose方法不 ...

  10. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(六) 之 Layim源码改造右键菜单--好友、组管理功能的实现。

    前言 上一篇中讲解了加好友的流程,本篇将介绍好友管理,群组管理的右键菜单功能.当然由于菜单项目太多,都实现也得花费时间.只讲解一下我是如何从不知道怎么实现右键菜单到会自定义菜单的一个过程.另外呢,针对 ...