先前一直都是用的直接用加载驱动 然后创建连接进行操作数据 如果我的数据库换了 那么要修改的地方也比较多 不利于维护 所以就想到了将所有配置连接信息都用xml封装起来 以至于我每次都只要修改一下我的xml配置文件 不需要修改我的代码 这也就有了下面的操作 将驱动 url 用户名和密码都写到xml文件里面
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 文件之后就需要来进行解析
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语句就可以
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 }
将查询封装在一个方法里面
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 }
完整代码
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 }DBUtil