首页 > 代码库 > JDBC之——一个单线程JDBC基类和一些注意事项
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 sql122 * @param param123 * @return124 */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 sql151 * @return152 */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 sql183 * @param param184 * @return185 */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 sql214 * @param param215 * @return216 */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 sql239 * @param param240 * @return241 */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>
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。