zoukankan      html  css  js  c++  java
  • 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

      1 package db;
      2 
      3 
      4 
      5 import java.io.File;
      6 import java.sql.CallableStatement;
      7 import java.sql.Connection;
      8 import java.sql.PreparedStatement;
      9 import java.sql.ResultSet;
     10 import java.sql.SQLException;
     11 import java.sql.Statement;
     12 
     13 import org.dom4j.Document;
     14 import org.dom4j.DocumentException;
     15 import org.dom4j.Element;
     16 import org.dom4j.io.SAXReader;
     17 
     18 public class DBase {
     19     
     20     private static String db_driver = "";//数据库驱动
     21     private static String db_url = "";//连接字符串
     22     private static String db_userName = "";//用户名
     23     private static String db_userPass = "";//用户密码
     24     private static String db_state = "";//状态
     25     private static String db_dataBaseName = "";//数据库名
     26     
     27     private static Connection conn = null;
     28     private static PreparedStatement pst = null;
     29     private static CallableStatement cs= null;
     30     private static ResultSet res = null;
     31     private static Statement st = null;
     32     /**
     33      * 加载必要的数据库连接信息
     34      */
     35     private static void init(){
     36         try {
     37             String url = Class.class.getClass().getResource("/").getPath();    //获取当前项目在本地的物理路径
     38 //            System.out.println(url);
     39             //利用dom4j获取xml文件的信息
     40             SAXReader reader = new SAXReader();
     41             Document document = reader.read(new File(url + "db.xml"));
     42             Element root = document.getRootElement();//xml文件的根目录
     43             db_state = root.element("sqlserver").element("state").getText();
     44             db_driver = root.element("sqlserver").element("driver").getText();
     45             db_userName = root.element("sqlserver").element("userName").getText();
     46             db_userPass = root.element("sqlserver").element("userPass").getText();
     47             db_dataBaseName = root.element("sqlserver").element("dataBaseName").getText();
     48             db_url = "jdbc:sqlserver://" + root.element("sqlserver").element("baseURL").getText() + ":1433;databasename="
     49                     + db_dataBaseName;
     50             if(db_state == "0" || "0".equals(db_state)){
     51                 db_state = root.element("mysql").element("state").getText();
     52                 db_driver = root.element("mysql").element("driver").getText();
     53                 db_userName = root.element("mysql").element("userName").getText();
     54                 db_userPass = root.element("mysql").element("userPass").getText();
     55                 db_dataBaseName = root.element("mysql").element("dataBaseName").getText();
     56                 db_url = "jdbc:mysql://" + root.element("mysql").element("baseURL").getText() + "/"
     57                         + db_dataBaseName;
     58 //                System.out.println(db_url);
     59             }
     60             if(db_state == "0" || "0".equals(db_state)){
     61                 db_state = root.element("oracle").element("state").getText();
     62                 db_driver = root.element("oracle").element("driver").getText();
     63                 db_userName = root.element("oracle").element("userName").getText();
     64                 db_userPass = root.element("oracle").element("userPass").getText();
     65                 db_dataBaseName = root.element("oracle").element("dataBaseName").getText();
     66                 db_url = "http://" + root.element("oracle").element("baseURL").getText() + ":1433;databasename="
     67                         + db_dataBaseName;
     68             }
     69         } catch (DocumentException e) {
     70             e.printStackTrace();
     71         }
     72         
     73     }
     74     
     75     /**
     76      * 创建数据库连接
     77      * @return
     78      */
     79     public static Connection getConn(){
     80         init();
     81         try {
     82             Class.forName(db_driver);
     83             conn = java.sql.DriverManager.getConnection(db_url, db_userName, db_userPass);
     84             conn.setAutoCommit(false);        //关闭自动提交功能,改为人工提交事务
     85             System.out.println("connection success~");
     86         } catch (ClassNotFoundException e) {
     87             e.printStackTrace();
     88         } catch (SQLException e) {
     89             e.printStackTrace();
     90         }
     91         return conn;
     92     }
     93     
     94     /**
     95      * 关闭数据库参数
     96      */
     97     public static void close(){
     98         try {
     99             if(res != null){
    100                 res.close();
    101             }
    102             if(pst != null){
    103                 pst.close();
    104             }
    105             if(st != null){
    106                 st.close();
    107             }
    108             if(cs != null){
    109                 cs.close();
    110             }
    111             if(conn != null){
    112                 conn.close();
    113             }
    114         } catch (SQLException e) {
    115             e.printStackTrace();
    116         }
    117     }
    118     
    119     /**
    120      * 执行sql语句的增删改
    121      * @param sql
    122      * @param param
    123      * @return
    124      */
    125     public static Integer executeSQL(String sql,String[] param) throws SQLException{
    126         Integer result = 0;
    127         conn = null;
    128         pst = null;
    129         try {
    130             conn = getConn();
    131             pst = conn.prepareStatement(sql);
    132             if(param != null){
    133                 for(int i = 0; i < param.length; i++){
    134                     pst.setString(i + 1, param[i]);
    135                 }
    136             }
    137             result = pst.executeUpdate();
    138             conn.commit();//提交事务
    139         } catch (SQLException e) {
    140             conn.rollback();//回滚事务
    141             e.printStackTrace();
    142         }finally{
    143             close();
    144         }
    145         return result;
    146     }
    147     
    148     /**
    149      * 批处理的增删改
    150      * @param sql
    151      * @return
    152      */
    153     public static Integer executeSQLBatch(String sql) throws SQLException{
    154         Integer result = 1;
    155         try {
    156             conn = null;
    157             st = null;
    158             conn = getConn();
    159             st = conn.createStatement();
    160             st.addBatch(sql);
    161             int[] resultArray = st.executeBatch();
    162             for(int i = 0; resultArray.length > 0 && i < resultArray.length;i++){
    163                 if(resultArray[i] <= 0){
    164                     result = 0;
    165                 }
    166             }
    167             if(result > 0){
    168                 conn.commit();
    169             }
    170         } catch (SQLException e) {
    171             conn.rollback();
    172             e.printStackTrace();
    173         }finally{
    174             close();
    175         }
    176         return result;
    177         
    178     }
    179     
    180     /**
    181      * 执行存储过程的增删改
    182      * @param sql
    183      * @param param
    184      * @return
    185      */
    186     public static Integer executeSQLProc(String sql,String[] param) throws SQLException{
    187         Integer result = 0;
    188         conn = null;
    189         cs = null;
    190         try {
    191             conn = getConn();
    192             cs = conn.prepareCall(sql);
    193             if(param != null){
    194                 for(int i = 0; i < param.length; i++){
    195                     cs.setString(i + 1, param[i]);
    196                 }
    197             }
    198             result = cs.executeUpdate();
    199             conn.commit();//提交事务
    200         } catch (SQLException e) {
    201             conn.rollback();//回滚事务
    202             e.printStackTrace();
    203         }finally{
    204             close();
    205         }
    206         return result;
    207     }
    208     
    209     
    210     
    211     /**
    212      * 普通sql查询
    213      * @param sql
    214      * @param param
    215      * @return
    216      */
    217     public static ResultSet execute(String sql,String[] param){
    218         try {
    219             conn = getConn();
    220             pst = conn.prepareStatement(sql);
    221             if(param != null){
    222                 for(int i = 0; i < param.length; i++){
    223                     pst.setString(i + 1, param[i]);
    224                 }
    225             }
    226             res = pst.executeQuery();
    227         } catch (SQLException e) {
    228             e.printStackTrace();
    229         } 
    230 //        finally{
    231 //            close();
    232 //        }
    233         return res;
    234     }
    235     
    236     /**
    237      * 执行存储过程的查询
    238      * @param sql
    239      * @param param
    240      * @return
    241      */
    242     public static ResultSet executeProc(String sql,String[] param){
    243         conn = null;
    244         cs = null;
    245         res = null;
    246         try {
    247             conn = getConn();
    248             cs = conn.prepareCall(sql);
    249             if(param != null){
    250                 for(int i = 0; i < param.length; i++){
    251                     cs.setString(i + 1, param[i]);
    252                 }
    253             }
    254             res = cs.executeQuery();
    255         } catch (SQLException e) {
    256             e.printStackTrace();
    257         }
    258         return res;
    259     }
    260 }
    View Code

    配置文件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>
    View Code
    作者:苍枫露雨
             
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    下载flash我的三种方法
    随机变换背景图象(一个可以刷新心情的特效)
    禁止缓存
    [模板]字符串算法
    [学习笔记]有上下界的网络流
    [bzoj2809][Apio2012]dispatching
    [四校联考]Easy Problems
    [学习笔记]tarjan
    [vijos1780][NOIP2012]开车旅行
    记第一次打女队
  • 原文地址:https://www.cnblogs.com/chrischennx/p/3832305.html
Copyright © 2011-2022 走看看