网站制作公司 深圳域名交易中心
1、用法(导入项目即可)
注意:项目中必须存在数据库驱动包。
2、方法列表
(1)获取数据库连接对象
(2)获取查询结果集
(3)将查询结果集转化为指定对象(使用者自行提供类参数,通过反射和转化)
(4)执行更新、删除、插入操作
(5)关闭数据库连接
3、源码展示(注释齐全)
package utils;import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 数据库常用操作工具类* * @author snow1k* @date 2021/11/10*/
public final class JdbcUtils {// mysql8驱动public static final String MYSQL8_DRIVER = "com.mysql.cj.jdbc.Driver";/*** 结果集处理器* * @author snow1k* @date 2021/11/10*/public static interface ResultSetHandler<T> {/*** 将一个结果集转换成T类型* * @param rs* @return*/T handle(ResultSet rs);}/*** 列处理器* * @author snow1k* @date 2021/11/16*/public static interface ColumnHandler<T> {/*** * @param method 根据列名自动匹配的方法名* @param columnName 列名* @param t 对象* @param value 值* @return 返回true,表示用户已处理完成,无需再处理,返回false,则代表用户不处理*/boolean handleColumn(Method method, String columnName, T t, Object value);}/*** 内部类的目的,就是为了将结果集中的数据自动封装成对象* * @author snow1k* @date 2021/11/10*/public static class BeanListHandler<T> implements ResultSetHandler<List<T>> {private final Class<T> clazz;private ColumnHandler<T> columnHandler;public BeanListHandler(Class<T> clazz) {this.clazz = clazz;}public BeanListHandler(Class<T> clazz, ColumnHandler<T> columnHandler) {this.clazz = clazz;this.columnHandler = columnHandler;}@Overridepublic List<T> handle(ResultSet rs) {// 返回值List<T> list = new ArrayList<>();// 存储所有列名(别名)List<String> columnNames = new ArrayList<>();// 存储所有方法,键名是列名(别名),值即其对应的setter方法Map<String, Method> methodMap = new HashMap<>();// 获取所有列名try {// 结果集元数据ResultSetMetaData rsmd = rs.getMetaData();// 返回查询结果集的列数int count = rsmd.getColumnCount();// 返回此类型的所有方法Method[] methods = clazz.getDeclaredMethods();for (int i = 0; i < count; i++) {// 获取列名,如果起别名,则获取别名String columnName = rsmd.getColumnLabel(i + 1);columnNames.add(columnName);// 返回查询结果集的列名// 组装出对象的方法名String methodName = columnName.substring(0, 1).toUpperCase() + columnName.substring(1);methodName = "set" + methodName;for (Method me : methods) {if (me.getName().equals(methodName)) {methodMap.put(columnName, me);// 设置到map中break;}}}// 准备工作已完成,将结果集中的数据转换成T类型的实例if (rs != null) {// 获取无参的构造方法Constructor<T> con = clazz.getDeclaredConstructor();while (rs.next()) {T t = con.newInstance();// T类型的实例for (int i = 0; i < count; i++) {String columnName = columnNames.get(i);// 从结果集中取出对应列的数据Object value = rs.getObject(columnName);// 取出方法Method method = methodMap.get(columnName);if (method != null) {if (columnHandler != null) {boolean done = columnHandler.handleColumn(method, columnName, t, value);if (!done) {// 通过反射给T类型的实例赋值method.invoke(t, value);}}}}list.add(t);}}return list;} catch (Exception e) {e.printStackTrace();}return null;}}/*** 获取数据库连接* * @param url* @param user* @param password* @return*/public static final Connection getConnection(String driver, String url, String user, String password) {try {Class.forName(driver);return DriverManager.getConnection(url, user, password);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}throw new RuntimeException("无法创建数据库连接");}/*** 获取数据库连接* * @param url* @param user* @param password* @return*/public static final Connection getConnection(String url, String user, String password) {return getConnection(MYSQL8_DRIVER, url, user, password);}/*** 执行查询操作,返回结果集* * @param conn* @param sql* @param args* @return*/private static final ResultSet query(Connection conn, String sql, Object[] args) {try {PreparedStatement ps = conn.prepareStatement(sql);if (args != null) {// 给PreparedStatement实例设置参数for (int i = 0; i < args.length; i++) {ps.setObject(i + 1, args[i]);}}return ps.executeQuery();} catch (SQLException e) {e.printStackTrace();}throw new RuntimeException("查询出现异常");}/*** 返回对象的集合* * @param <T>* @param conn* @param sql* @param args* @return*/public static final <T> T query(Connection conn, ResultSetHandler<T> handler, String sql, Object[] args) {ResultSet rs = query(conn, sql, args);return handler.handle(rs);}/*** 写操作* * @return 返回受影响的行数*/public static final int update(Connection conn, String sql, Object[] args) {try {PreparedStatement ps = conn.prepareStatement(sql);if (args != null) {// 给PreparedStatement实例设置参数for (int i = 0; i < args.length; i++) {ps.setObject(i + 1, args[i]);}}return ps.executeUpdate();} catch (SQLException e) {// e.printStackTrace();}return -1;}/*** 关闭数据库连接* * @param conn*/public static final void closeConnection(Connection conn) {if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}
声明:
此工具类适用于初学者刚开始学习数据库操作,便于加强掌握和加深理解,熟悉之后直接调用即可。