xml解析数据信息并实现DBManager操作mysql

 

先前一直都是用的直接用加载驱动 然后创建连接进行操作数据 如果我的数据库换了 那么要修改的地方也比较多 不利于维护 所以就想到了将所有配置连接信息都用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

 

posted @ 2019-03-31 12:38  hengly94  阅读(355)  评论(0编辑  收藏  举报