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 }
配置文件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>
作者:苍枫露雨
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。