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转载请注明) 多重继承是指一个派生类有两个或多个基类.例如,有 ...
随机推荐
- frxReport 设计 (mtm)
► 设计 frxReport frxReport 窗体上放一个 [frxReport] 的控件 双击 [frxReport]控件 进入设置模式 frxReport1.ShowReport() 方 ...
- java web 学习 --第五天(Java三级考试)
第四天的学习内容:http://www.cnblogs.com/tobecrazy/p/3454860.html Response对象 response对象主要是向客户端浏览器发送二进制数据,如输出C ...
- 手记-数学分析(高等数学)中有关算法效率的公式列举(O,Θ,Ω)
权当数据结构与算法分析的学习手记 系数为一的幂级数部分和公式 ∑ n2 = 12 + 22 + 32 + ... + n2 = n(n+1)(2n+1)/6 = O(n3) ∑ n3 = ...
- 关于新中新二代身份证读卡器DKQ-A16D的一些问题
今天拿到了新中新DKQ-A16D,随机光盘里有以下文件: 我遇到的问题是,如果直接打开\二代征SDK开发包\DLL\测试程序\C#_2008\WindowsFormsApplication1\目录下的 ...
- 《Java多线程核心技术》读书摘要
Chapter1: 进程是操作系统管理的基本单元,线程是CPU调到的基本单元. 调用myThread.run()方法,JVM不会生成新的线程,myThread.start()方法调用两次JVM会报错. ...
- log4net使用
平时项目里一直都有在使用log4net作为日志记录模块,当时一直都没有去理解log4net的配置文件信息.今天抽出了一点时间来看了看配置文件信息. log4net配置文件信息: <log4net ...
- 51nod 1065 最小正子段和 (贪心)
题目:传送门. 题意:中文题. 题解:求前缀和,并且标记每个数的下标,按照前缀和大小进行从小到大排序.随后进行遍历,如果满足下标data[i-1].id<data[i].id&& ...
- struts配置文件中如何从一个package的action跳到另一个package中的某个action
<package name="pack1" namespace="/test1" extends="struts-default"&g ...
- iOS-运行时机制
这里的两篇运行时的文章感觉还不错. 收藏: 初识iOS运行时RunTime | // TODO: http://www.saitjr.com/ios/objc-runtime.html Objecti ...
- [Android Pro] Toolbar的完全自定义
reference to : http://blog.csdn.net/elder_sword/article/details/46634751 Toolbar是什么,不知道的可以去大神的博客瞻仰下 ...