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