使用JDBC进行数据库操作
在Java开发中,JDBC(Java Database Connectivity)是用于连接和操作数据库的API。为了简化数据库操作,通常会创建一个工具类来管理数据库连接、执行查询和更新操作。
工具类的设计
工具类DBUtils
主要包含以下几个部分:
- 私有化构造器以防止实例化。
- 使用静态代码块加载数据库连接配置并注册驱动。
- 提供获取数据库连接、执行更新操作、执行查询操作以及关闭资源的方法。
私有化构造器
private DBUtils() {
}
工具类的构造器被私有化,以防止外部实例化该类。这种设计模式通常用于工具类或常量类。
静态代码块加载配置和注册驱动
private static String driverClass;
private static String url;
private static String user;
private static String password;
static {
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();
try {
properties.load(is);
} catch (IOException e) {
throw new RuntimeException(e);
}
driverClass = properties.getProperty("driverClass");
url = properties.getProperty("url");
user = properties.getProperty("user");
password = properties.getProperty("password");
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
在静态代码块中,我们加载数据库配置文件db.properties
,并将配置信息赋值给相应的变量。然后,我们注册数据库驱动,这些操作在类加载时只需要执行一次。
获取数据库连接
public static Connection getconnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
}
getconnection
方法用于获取数据库连接,通过DriverManager.getConnection
方法获取连接实例。
执行更新操作
public static void update(String sql, Object... args) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = getconnection();
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
ps.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
closeResources(conn, ps);
}
}
update
方法用于执行更新操作(如INSERT、UPDATE、DELETE)。方法使用可变参数Object... args
来传递SQL语句中的参数,利用PreparedStatement
进行预编译和执行更新操作。
执行查询操作
public static <T> List<T> query(Class<T> clazz, String sql, Object... args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<T> list = null;
try {
conn = getconnection();
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
list = new ArrayList<T>();
int columnCount = rsmd.getColumnCount();
Constructor<T> constructor = clazz.getDeclaredConstructor();
constructor.setAccessible(true);
while (rs.next()) {
T t = constructor.newInstance();
for (int i = 0; i < columnCount; i++) {
String columnLabel = rsmd.getColumnLabel(i + 1);
Object columnValue = rs.getObject(i + 1);
Field field = clazz.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t, columnValue);
}
list.add(t);
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
closeResources(conn, ps, rs);
}
return list;
}
query
方法用于执行查询操作,返回指定类型的对象列表。通过反射机制,将查询结果集中的数据赋值给对应的对象属性。
关闭资源
public static void closeResources(AutoCloseable... resources) {
for (AutoCloseable resource : resources) {
if (resource != null) {
try {
resource.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
closeResources
方法用于关闭数据库资源。使用可变参数AutoCloseable... resources
,可以传递任意数量的可关闭资源(如Connection
、PreparedStatement
、ResultSet
),避免资源泄漏。
总结
通过上述工具类DBUtils
,我们可以简化数据库操作,避免重复编写获取连接、关闭资源等代码,提高开发效率和代码可维护性。希望本文对您了解和使用JDBC进行数据库操作有所帮助。