JDBC之——一个单线程JDBC基类和一些注意事项
下面的一个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基类和一些注意事项的更多相关文章
- C# Winform下一个热插拔的MIS/MRP/ERP框架12(数据处理基类)
作为ERP等数据应用程序,数据库的处理是重中之重. 在框架中,我封装了一个数据库的基类,在每个模组启动或窗体启动过程中,实例化一个基类即可调用CRUD操作(create 添加read读取 update ...
- 构建自己的PHP框架--抽象Controller的基类
上一篇博客中,我们将简单的路由解析和执行,从入口文件public/index.php中移入到框架中.入口文件顿时变得清爽无比-- 但是,去我们的controller里看一下,会看到如下的code: p ...
- Android 自定义Activity基类与TitleBar
我们在开发App的时候有时候碰到多个界面有一个共同点的时候,比如,都有相同的TitleBar,并且TitleBar可以设置显示的文字.TitleBar上的点击事件,如果给每一个Activity都写一遍 ...
- C++:虚基类
4.4.3 虚基类1.没什么要引入虚基类 如果一个类有多个直接基类,而这些直接基类又有一个共同的基类,则在最底层的派生类中会保留这个间接的共同基类数据成员的多分同名成员.在访问这些同名的成员时,必须在 ...
- 【c++内存分布系列】虚基类表
虚基类表相对于虚函数表要稍微难理解些,故单独提出来. 虚函数表是在对象生成时插入一个虚函数指针,指向虚函数表,这个表中所列就是虚函数. 虚基类表原理与虚函数表类似,不过虚基类表的内容有所不同.表的第一 ...
- 可以继承的C++ Singleton基类
单例模式(Singleton Pattern)是设计模式中的一种,它用来保证系统中最多只能存在一个它的实例,其做法是由类自身来创建和持有它的对象实例,把对实例的创建权和管理权都控制在自己手中,以便控制 ...
- [Effective C++ --007]为多态基类声明virtual析构函数
引言: 我们都知道类的一个很明显的特性是多态,比如我们声明一个水果的基类: class Fruit { public: Fruit() {}; ~Fruit(){}; } 那么我们根据这个Fruit基 ...
- C++虚基类详解(转)
我们知道,如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员.在引用这些同名的成员时,必须在派生类对象名后增加直接基类名,以避 ...
- C++学习之路—继承与派生(三):多重继承与虚基类
(根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 多重继承是指一个派生类有两个或多个基类.例如,有 ...
随机推荐
- 学习Selenium2Library的好例子
最近好几个人问我有没有好的例子可以帮助学习Selenium2Library怎么用.对于公司同事,可以把脚本直接给过去,其他人则不行了.所以一直想做一个好的学习样例,这个样例应该有如下特性: 能够非常好 ...
- catalan number
http://blog.csdn.net/yutianzuijin/article/details/13161721
- Android 程序中得到root activity的引用
今天写anroid时,想获得一个root activity的引用. ios中这个很简单, [UIApplication sharedApplication].keyWindow 得到window对象, ...
- 1.JS设计模式-this,call&apply
1. this,call&apply 1.1 this this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用. 1.1.1 普通函数调 ...
- event.srcElement 用法笔记e.target
event.srcElement 可以捕获当前事件作用的对象,如event.srcElement.tagName可以捕获活动标记名称. 注意获取的标记都以大写表示,如"TD",&q ...
- C#中XmlTextWriter读写xml文件详细介绍(转)
转自http://www.jb51.net/article/35230.htm .NET中包含了很多支持XML的类,这些类使得程序员使用XML编程就如同理解XML文件一样简单.在这篇文章中,我将给 ...
- mybatis跨XML引用
resultMap中association标签的select属性使用嵌套查询的时候需要引用其它xml文件的配置 此时可以用要引用xml的namespace.引用select的ID 如 <resu ...
- 【leetcode】 Longest Valid Parentheses (hard)★
Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...
- 【leetcode】Permutations (middle)
Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the follow ...
- 【leetcode】Populating Next Right Pointers in Each Node I & II(middle)
Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...