先前一直都是用的直接用加载驱动 而后建立链接进行操做数据 若是个人数据库换了 那么要修改的地方也比较多 不利于维护 因此就想到了将全部配置链接信息都用xml封装起来 以致于我每次都只要修改一下个人xml配置文件 不须要修改个人代码 这也就有了下面的操做 将驱动 url 用户名和密码都写到xml文件里面 java
1 <?xml version="1.0" encoding="UTF-8"?>
2 <database>
3 <driver>com.mysql.jdbc.Driver</driver>
4 <url>jdbc:mysql://localhost:3306/employee</url>
5 <user>root</user>
6 <password>root</password>
7 </database>
有了xml 文件以后就须要来进行解析mysql
1 // 使用dom4j解析xml
2 private static void parseXmlInfo() { 3 // 建立saxreader对象
4 SAXReader saxReader = new SAXReader(); 5 try { 6 // 加载xml文件
7 Document doc = saxReader.read(DBUtil.class.getResourceAsStream("/jdbc.xml")); 8 // 得到根元素
9 Element root = doc.getRootElement(); 10 // 得到对应的元素的文本值
11 driver = root.elementText("driver"); 12 url = root.elementText("url"); 13 user = root.elementText("user"); 14 password = root.elementText("password"); 15
16 } catch (DocumentException e) { 17 // TODO Auto-generated catch block
18 e.printStackTrace(); 19 } 20 }
解析完了以后就能够获取链接操做数据库 sql
将增删改封装到一个方法里面 之后每次只须要写sql语句就能够 数据库
1 /**
2 * 修改数据的方法 3 * 4 * @param sql 5 * @param values sql中全部?的值 6 * 7 * @return 0表示修改失败,其余表示修改为功 8 */
9 public static int update(String sql, Object[] values) { 10 PreparedStatement ps = null; 11 ResultSet rs = null; 12 // 获取链接
13 getConnection(); 14 try { 15 // 建立prepareStatement
16 ps = conn.prepareStatement(sql); 17 System.out.println(ps); 18 for (int i = 0; i < values.length; i++) { 19 ps.setObject(i + 1, values[i]); 20 } 21 System.out.println(ps); 22 // 执行修改语句返回受影响的行数
23 int num = ps.executeUpdate(); 24 System.out.println(num); 25 } catch (SQLException e) { 26 e.printStackTrace(); 27 } finally { 28 // 关闭资源
29 if (ps != null) { 30 try { 31 ps.close(); 32 } catch (SQLException e) { 33 // TODO Auto-generated catch block
34 e.printStackTrace(); 35 } 36 } 37 } 38 return 0; 39 }
将查询封装在一个方法里面 dom
1 /**
2 * 查询的方法 3 * 4 * @param sql 5 * @param values sql中?的值 6 * @return 查询到的数据 7 */
8 public static List<Map<String, String>> query(String sql, Object[] values) { 9 PreparedStatement ps = null; 10 ResultSet res = null; 11 List<Map<String, String>> list = new ArrayList<>(); 12 getConnection(); 13 try { 14 //建立语句对象
15 ps = conn.prepareStatement(sql); 16 //为ps中的?设置值
17 if (values != null && values.length > 0) { 18 for (int i = 0; i < values.length; i++) { 19 ps.setObject(i + 1, values[i]); 20 } 21 } 22 // 执行查询操做
23 res = ps.executeQuery(); 24 //得到结果集中全部的列的信息
25 ResultSetMetaData metaData = res.getMetaData(); 26 // 获取到列的总数
27 int columnCount = metaData.getColumnCount(); 28 while (res.next()) { 29 // 建立Map集合对象,用于存储一行数据
30 Map<String, String> map = new HashMap<>(); 31 for (int i = 0; i < columnCount; i++) { 32 // 得到列名
33 String columnNames = metaData.getColumnName(i + 1); 34 // 得到列名指定的数据
35 String columnValues = res.getString(columnNames); 36 // 把数据放到map集合中
37 map.put(columnNames, columnValues); 38 } 39 list.add(map); 40 } 41 } catch (SQLException e) { 42 // TODO Auto-generated catch block
43 e.printStackTrace(); 44 } finally { 45 if (res != null) { 46 try { 47 res.close(); 48 } catch (SQLException e) { 49 // TODO Auto-generated catch block
50 e.printStackTrace(); 51 } 52 } 53 if (ps != null) { 54 try { 55 ps.close(); 56 } catch (SQLException e) { 57 // TODO Auto-generated catch block
58 e.printStackTrace(); 59 } 60 } 61 } 62 return list; 63
64 }
完整代码ide
1 1 package com.newroad.xmlparsedbuitl; 2 2 import java.sql.Connection; 3 3 import java.sql.DriverManager; 4 4 import java.sql.PreparedStatement; 5 5 import java.sql.ResultSet; 6 6 import java.sql.ResultSetMetaData; 7 7 import java.sql.SQLException; 8 8 import java.util.ArrayList; 9 9 import java.util.HashMap; 10 10 import java.util.List; 11 11 import java.util.Map; 12 12 import org.dom4j.Document; 13 13 import org.dom4j.DocumentException; 14 14 import org.dom4j.Element; 15 15 import org.dom4j.io.SAXReader; 16 16 17 17 public class DBUtil { 18 18 private static String driver; 19 19 private static String url; 20 20 private static String user; 21 21 private static String password; 22 22 private static Connection conn = null; 23 23 24 24 // 解析xml文件 获取驱动 用户名 密码 因为不须要每次加载能够写在静态方法中 25 25 static { 26 26 parseXmlInfo(); 27 27 } 28 28 29 29 // 建立链接 30 30 public static void getConnection() { 31 31 // 判断一下若是conn为空或者被关闭就开链接 节省资源 32 32 try { 33 33 if (conn == null || conn.isClosed()) { 34 34 // 加载驱动获取链接 35 35 Class.forName(driver); 36 36 conn = DriverManager.getConnection(url + "?characterEncoding=utf-8", user, password); 37 37 } 38 38 } catch (SQLException e) { 39 39 e.printStackTrace(); 40 40 } catch (ClassNotFoundException e) { 41 41 // TODO Auto-generated catch block 42 42 e.printStackTrace(); 43 43 } 44 44 } 45 45 /** 46 46 * 修改数据的方法 47 47 * 48 48 * @param sql 49 49 * @param values 50 sql语句中全部?的值 51 51 * @return 0表示修改失败,其余表示修改为功 52 52 */ 53 53 public static int update(String sql, Object[] values) { 54 54 PreparedStatement ps = null; 55 55 ResultSet rs = null; 56 56 // 获取链接 57 57 getConnection(); 58 58 try { 59 59 // 建立prepareStatement 60 60 ps = conn.prepareStatement(sql); 61 61 System.out.println(ps); 62 62 for (int i = 0; i < values.length; i++) { 63 63 ps.setObject(i + 1, values[i]); 64 64 } 65 65 System.out.println(ps); 66 66 // 执行修改语句返回受影响的行数 67 67 int num = ps.executeUpdate(); 68 68 System.out.println(num); 69 69 } catch (SQLException e) { 70 70 e.printStackTrace(); 71 71 } finally { 72 72 // 关闭资源 73 73 if (ps != null) { 74 74 try { 75 75 ps.close(); 76 76 } catch (SQLException e) { 77 77 // TODO Auto-generated catch block 78 78 e.printStackTrace(); 79 79 } 80 80 } 81 81 } 82 82 return 0; 83 83 } 84 84 85 85 /** 86 86 * 查询的方法 87 87 * 88 88 * @param sql 89 89 * @param values 90 90 * @return 查询到的数据 91 91 */ 92 92 public static List<Map<String, String>> query(String sql, Object[] values) { 93 93 PreparedStatement ps = null; 94 94 ResultSet res = null; 95 95 List<Map<String, String>> list = new ArrayList<>(); 96 96 getConnection(); 97 97 try { 98 98 //建立语句对象 99 99 ps = conn.prepareStatement(sql); 100 100 //为ps中的?设置值 101 101 if (values != null && values.length > 0) { 102 102 for (int i = 0; i < values.length; i++) { 103 103 ps.setObject(i + 1, values[i]); 104 104 } 105 105 } 106 106 // 执行查询操做 107 107 res = ps.executeQuery(); 108 108 //得到结果集中全部的列的信息 109 109 ResultSetMetaData metaData = res.getMetaData(); 110 110 // 获取到列的总数 111 111 int columnCount = metaData.getColumnCount(); 112 112 while (res.next()) { 113 113 // 建立Map集合对象,用于存储一行数据 114 114 Map<String, String> map = new HashMap<>(); 115 115 for (int i = 0; i < columnCount; i++) { 116 116 // 得到列名 117 117 String columnNames = metaData.getColumnName(i + 1); 118 118 // 得到列名指定的数据 119 119 String columnValues = res.getString(columnNames); 120 120 // 把数据放到map集合中 121 121 map.put(columnNames, columnValues); 122 122 } 123 123 list.add(map); 124 124 } 125 125 } catch (SQLException e) { 126 126 // TODO Auto-generated catch block 127 127 e.printStackTrace(); 128 128 } finally { 129 129 if (res != null) { 130 130 try { 131 131 res.close(); 132 132 } catch (SQLException e) { 133 133 // TODO Auto-generated catch block 134 134 e.printStackTrace(); 135 135 } 136 136 } 137 137 if (ps != null) { 138 138 try { 139 139 ps.close(); 140 140 } catch (SQLException e) { 141 141 // TODO Auto-generated catch block 142 142 e.printStackTrace(); 143 143 } 144 144 } 145 145 } 146 146 return list; 147 147 148 148 } 149 149 150 150 // 使用dom4j解析xml 151 151 private static void parseXmlInfo() { 152 152 // 建立saxreader对象 153 153 SAXReader saxReader = new SAXReader(); 154 154 try { 155 155 // 加载xml文件 156 156 Document doc = saxReader.read(DBUtil.class.getResourceAsStream("/jdbc.xml")); 157 157 // 得到根元素 158 158 Element root = doc.getRootElement(); 159 159 // 得到对应的元素的文本值 160 160 driver = root.elementText("driver"); 161 161 url = root.elementText("url"); 162 162 user = root.elementText("user"); 163 163 password = root.elementText("password"); 164 164 165 165 } catch (DocumentException e) { 166 166 // TODO Auto-generated catch block 167 167 e.printStackTrace(); 168 168 } 169 169 } 170 170 /** 171 171 * 关闭资源的方法 172 172 */ 173 173 public static void closeConnection() { 174 174 try { 175 175 if(conn != null && !conn.isClosed()) { 176 176 conn.close(); 177 177 } 178 178 } catch (SQLException e) { 179 179 // TODO Auto-generated catch block 180 180 e.printStackTrace(); 181 181 } 182 182 } 183 183 184 184 }