JDBC访问数据库的工具类

使用JDBC访问数据库的工具类

包括:

  • 得到数据库连接对象
  • 关闭连接资源
  • 通用的增删改的方法
  • 通用的查询方法
package com.cf.utils;

import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 访问数据库的工具类
 */
public class JdbcUtils {
    
    
    //可以把几个字符串定义成常量:用户名,密码,URL,驱动类
    private static final String USER = "root";
    private static final String PWD = "root";
    private static final String URL = "jdbc:mysql://localhost:3306/test?generateSimpleParameterMetadata=true";
    private static final String DRIVER = "com.mysql.jdbc.Driver";

    /**
     * 注册驱动,为了兼容1.5以前的版本
     */
    static {
    
    
        try {
    
    
            Class.forName(DRIVER);
        } catch (ClassNotFoundException e) {
    
    
            e.printStackTrace();
        }
    }

    /**
     * 得到数据库的连接
     */
    public static Connection getConnection() throws SQLException {
    
    
        return DriverManager.getConnection(URL, USER, PWD);
    }

    /**
     * 关闭连接
     * 查询调用这个方法
     */
    public static void close(Connection connection, Statement statement, ResultSet resultSet) {
    
    
        try {
    
    
            if (resultSet != null) {
    
    
                resultSet.close();
            }
        } catch (SQLException e) {
    
    
            e.printStackTrace();
        }
        try {
    
    
            if (statement != null) {
    
    
                statement.close();
            }
        } catch (SQLException e) {
    
    
            e.printStackTrace();
        }
        try {
    
    
            if (connection != null) {
    
    
                connection.close();
            }
        } catch (SQLException e) {
    
    
            e.printStackTrace();
        }
    }


    /**
     * 关闭连接
     * 增删改没有结果集
     */
    public static void close(Connection connection, Statement statement) {
    
    
        //直接调用上面的方法
        close(connection, statement, null);
    }


    /**
     * 通用的增删改的方法
     * @param sql 要执行的SQL语句
     * @param params 替换占位符的真实地址,在方法内部是一个数组(从0开始)
     * @return 影响的行数
     */
    public static int update(String sql, Object... params) {
    
    
        Connection connection = null;
        PreparedStatement ps = null;

        int row = 0;  //影响的行数
        try {
    
    
            //1.创建连接对象
            connection = getConnection();
            //2.创建预编译的语句对象
            ps = connection.prepareStatement(sql);
            //2.5 得到参数元数据
            ParameterMetaData metaData = ps.getParameterMetaData();
            int count = metaData.getParameterCount();  //获取有几个参数
            //3.替换占位符为真实的值
            for (int i = 0; i < count; i++) {
    
    
                ps.setObject(i + 1, params[i]);  //一定是个对象类型
            }
            //4.执行SQL语句
            row = ps.executeUpdate();
        } catch (SQLException e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            close(connection, ps);  //调用自己的方法
        }
        return row;
    }

    /**
     * 通用的查询方法
     * @param sql 要执行的SQL语句
     * @param clazz 要实例化的类型,如:Student.class, Employee.class
     * @param params 替换占位符的真实值
     * @return 封装好的集合对象
     */
    public static <T> List<T> query (String sql, Class<T> clazz, Object...params) {
    
    
        Connection connection = null;
        PreparedStatement ps = null;
        ResultSet resultSet = null;

        List<T> list = new ArrayList<>();
        try {
    
    
            //1.创建连接对象
            connection = getConnection();
            //2. 创建预编译的语句对象
            ps = connection.prepareStatement(sql);
            //2.5 得到参数元数据
            ParameterMetaData metaData = ps.getParameterMetaData();
            int count = metaData.getParameterCount();  //获取有几个参数
            //3.替换占位符为真实的值
            for (int i = 0; i < count; i++) {
    
    
                ps.setObject(i + 1, params[i]);  //一定是个对象类型
            }
            //4.执行查询操作
            resultSet = ps.executeQuery();
            //5.遍历整个结果集,封装到集合中,每个元素是一个对象
            while(resultSet.next()) {
    
    
                //每条记录封装成一个对象,创建一个对象
                T obj = clazz.getConstructor().newInstance();
                //先得到实体类中有哪些属性
                Field[] fields = clazz.getDeclaredFields();  //得到所有成员变量,包含私有的
                //遍历每个成员变量,进行赋值
                for (Field field : fields) {
    
    
                    //私有的要暴力
                    field.setAccessible(true);
                    //列名=属性名
                    String name = field.getName();
                    //要赋值的对象,值
                    field.set(obj, resultSet.getObject(name));   //从结果集中获取数据
                }
                //6.添加到集合中
                list.add(obj);
            }
        }
        catch (Exception ex) {
    
    
            ex.printStackTrace();
        }
        finally {
    
    
        	//关闭资源
            close(connection, ps, resultSet);
        }
        return list;
    }
}

参数说明:
说明1: 关于URL 中的generateSimpleParameterMetadata=true

解释: MySQL驱动对参数元数据的数据类型支持不理想,需要如此配置才能得到参数的MySQL数据类型,而且只能得到VARCHAR类型,如果不配置这个参数则会出现异常.

说明2: 关于参数列表中Object... params

解释: 可变形参,jdk1.5引入,在方法内部是一个数组(从0开始)

猜你喜欢

转载自blog.csdn.net/ABestRookie/article/details/109440478