JDBC之——一个单线程JDBC基类和一些注意事项

时间:2023-03-08 16:38:26

下面的一个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>