![4a96fc9113e74d90f7437c6670079118.png](https://img-blog.csdnimg.cn/img_convert/4a96fc9113e74d90f7437c6670079118.png)
一、构建JDBC工具集
由于JDBC中包含大量的重复代码,所以可以将重复代码封装成一个工具集,随用随调。
下面是一个自己构建的简单工具集用于说明JDBC工具集的原理:
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
public class JdbcUtils {
private static String driverClass; // 数据库驱动类名
private static String url; // 连接数据库的url
private static String user; // 数据库用户名
private static String password; // 数据库密码
static {
// 加载jdbcConf.properties中的数据库相关参数
InputStream is = JdbcUtils.class.getResourceAsStream("/jdbcConf.properties");
Properties properties = new Properties();
try {
properties.load(is);
} catch (IOException e) {
e.printStackTrace();
}
driverClass = properties.getProperty("driverClass");
url = properties.getProperty("url");
user = properties.getProperty("user");
password = properties.getProperty("password");
// 加载Driver类,Driver类对象将自动被注册到DriverManager类中
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 连接数据库,返回连接对象
public static Connection getConnection() {
Connection conn = null;
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
// 用于执行DML语句(insert, update, delete)
public static int update(Connection conn, String sql, Object...args) {
// 获取预编译SQL语句中参数的个数
int count = 0;
try {
// 预编译SQL
PreparedStatement pstmt = conn.prepareStatement(sql);
// 为预编译SQL语句设置参数值
count = pstmt.getParameterMetaData().getParameterCount();
for(int i = 0; i < args.length; i++) {
pstmt.setObject(i + 1, args[i]);
}
// 执行SQL语句, 返回影响行数
count = pstmt.executeUpdate();
// 释放资源
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
return count;
}
// 用于执行DQL语句,返回一行结果
public static Object[] query(Connection conn, String sql, Object...args) {
List<Object> list = new ArrayList<Object>();
try {
// 预编译SQL
PreparedStatement pstmt = conn.prepareStatement(sql);
// 为预编译SQL语句设置参数值
int count = pstmt.getParameterMetaData().getParameterCount();
for(int i = 0; i < args.length; i++) {
pstmt.setObject(i + 1, args[i]);
}
ResultSet rs = pstmt.executeQuery();
// 将结果封装到集合中
int columnCount = rs.getMetaData().getColumnCount();
while (rs.next()) {
for (int i = 1; i <= columnCount; i++) {
Object value = rs.getObject(i);
list.add(value);
}
}
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
// 返回数组结果
return list.toArray();
}
}
二、测试JDBC工具集
下面对上面哪个JdbcUtils进行测试,首先在项目根目录下新建一个jdbcConfig.properties用于存放参数信息:
![bfbf6c8639996d46a087eadd49e1d153.png](https://img-blog.csdnimg.cn/img_convert/bfbf6c8639996d46a087eadd49e1d153.png)
jdbConfig.properties:
driverClass=org.postgresql.Driver
url=jdbc:postgresql://localhost:5432/test2
user=postgres
password=123456
测试类:
public class UtilsTest {
// @Test
public void JdbcUtilsTest1() {
String sql = "INSERT INTO Student(sno, sname, ssex, sage, sdept) VALUES(?, ?, ?, ?, ?);";
Object[] args = {"201215131", "张三", "男", 20, "CS"};
JdbcUtils.update(JdbcUtils.getConnection(), sql, args);
}
@Test
public void JdbcUtilsTest2() {
String sql = "SELECT * FROM Student WHERE sname = ?";
String arg = "张三";
Object[] result = JdbcUtils.query(JdbcUtils.getConnection(), sql, arg);
for(int i = 0; i < result.length; i++) {
System.out.println(result[i]);
}
}
}
自行测试成功!这样一个JDBC工具集能够大大减少重复工作。
另外,第三方工具集DbUtils实现了更强大、更丰富的类似功能!