5种方法通过反射对JDBC的进行查询(简单的自己封装了一下)

先看资源包,这里我们用到的是我红色框起来的资源包

driverClass=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/train?sueSSL=false&serverTimezone=UTC
username=root
password=123456

      封装的代码如下

package ReflectJdbcSellectAll;

import org.apache.commons.beanutils.BeanUtils;
import reflectionJdbc.jdbcUtils;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.sql.*;
import java.util.*;
@SuppressWarnings("all")
public class JdbcUtils {
    private static String driverClass;
    private static String url;
    private static String username;
    private static String password;

    static {
        Properties properties = new Properties();
        //通过反射Class实例获取类加载器,然后通过类加载器获取数据流对象
        //方法①/*InputStream resourceAsStream = JdbcUtils.class.getClassLoader().getResourceAsStream("selectJdbc.properties");*/
        /*properties.load(resourceAsStream);*/
        try {
            //方法②
            properties.load(new FileInputStream("src/selectJdbc.properties"));
            //将properties中的有效值提取出来
            driverClass = properties.getProperty("driverClass");
            url = properties.getProperty("url");
            username = properties.getProperty("username");
            password = properties.getProperty("password");
            try {
                //获取类加载驱动
                Class.forName(driverClass);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     *
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, username, password);
    }

    /**
     * 进行预处理
     *
     * @param sql    传入的sql语句
     * @param conn   获取连接
     * @param values 传入的参数
     * @return 返回预处理结果
     * @throws SQLException
     */
    public static PreparedStatement getPreparedStatement(String sql, Connection conn, Object... values) throws SQLException {
        PreparedStatement preparedstatement = conn.prepareStatement(sql);
        //获取元数据
        ParameterMetaData parameterMetaData = preparedstatement.getParameterMetaData();
        //通过元数据获取需要传入参数的数量
        int parameterCount = parameterMetaData.getParameterCount();
        //判断什么情况才需要给预编译对象赋值
        if (parameterCount > 0 && values != null && values.length > 0) {
            for (int i = 0; i < parameterCount; i++) {
                preparedstatement.setObject(i + 1, values[i]);
            }
        }
        //返回预处理结果
        return preparedstatement;
    }

    /**
     *           第1种
     * 通过反射将你的JavaBean对象装入集合当中
     *
     * @param sql    传入的sql语句
     * @param c      Class<T> c 相当于 Class<T> c = T.class()
     * @param values 传入的参数
     * @param <T>    你所要查询的JavaBean
     * @return list集合,里面全是T对象
     * @throws SQLException
     * @throws NoSuchMethodException
     * @throws InvocationTargetException
     * @throws InstantiationException
     * @throws IllegalAccessException
     */
    public static <T> List<T> ListSelect(String sql, Class<T> c, Object... values) throws SQLException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //获取连接
        Connection connection = JdbcUtils.getConnection();
        //进行预处理
        PreparedStatement preparedStatement = JdbcUtils.getPreparedStatement(sql, connection, values);
        //获取结果集
        ResultSet resultSet = preparedStatement.executeQuery();
        //通过结果集获取元数据
        ResultSetMetaData metaData = resultSet.getMetaData();
        //获取结果集当中的所有列数
        int columnCount = metaData.getColumnCount();
        List<T> list = new ArrayList<>();
        //遍历结果集
        while (resultSet.next()) {
            T bean = c.getConstructor().newInstance();
            for (int i = 0; i < columnCount; i++) {
                /**
                 * BeanUtils.setProperty() 函数是 Apache Commons BeanUtils库中提供的一个函数,
                 * 它可以帮助我们通过 Java 反射机制动态设置 JavaBean 对象的属性值,
                 * 无需手动编写 JavaBean 的 set方法。该函数的作用是通过反射机制找到目标对象的相应属性,
                 * 并且将属性值设置为给定值。
                 *
                 * 其中bean就是上述所说的JavaBean
                 * metaData.getColumnName()就是获取bean当中set方法
                 * resultSet.getObject()就是获取结果集当中的值,()当中可以通过列数获取,也可以通过列名获取
                 */
                BeanUtils.setProperty(bean, metaData.getColumnName(i + 1), resultSet.getObject(i + 1));
            }
            list.add(bean);
        }
        close(connection,preparedStatement,resultSet);
        return list;
    }

    /**  第2种
     *  封装查询 思想,传入一个泛型类,然后将查询结果以指定类的形式返回
     *  sql    泛型类   可变参数
     *  BeanUtils可以帮助我们把属性封装当JavaBean对象的对应属性中,
     *  比如可以把提交的表单数据封装到一个实体对象中。
     *  封装时要求参数名称和JavaBean的属性明相同
     *  @param sql 根据给定的条件参数从表中查询数据
     *  @param c 反射对象类
     *  @param values 查询条件的参数列表
     *  @param <T>  传进去的任意类型
     *  @return 将查询结果以指定类的形式返回
     * @throws SQLException
     * @throws NoSuchMethodException
     * @throws InvocationTargetException
     * @throws InstantiationException
     * @throws IllegalAccessException
     */
    public static <T> T BeanQuery(String sql, Class<T> c, Object... values) throws
            SQLException, NoSuchMethodException, InvocationTargetException,
            InstantiationException, IllegalAccessException {
        Connection connection = JdbcUtils.getConnection();
        //预处理
        PreparedStatement preparedStatement = JdbcUtils.getPreparedStatement(sql, connection, values);
        //获取结果集
        ResultSet resultSet = preparedStatement.executeQuery();
        //获取元数据
        ResultSetMetaData metaData = resultSet.getMetaData();
        //获取列数
        int columnCount = metaData.getColumnCount();
        T t = null;
        while (resultSet.next()) {
            t = c.getConstructor().newInstance();
            for (int i = 0; i < columnCount; i++) {
                /**
                 * BeanUtils.setProperty() 函数是 Apache Commons BeanUtils库中提供的一个函数,
                 * 它可以帮助我们通过 Java 反射机制动态设置 JavaBean 对象的属性值,
                 * 无需手动编写 JavaBean 的 set方法。该函数的作用是通过反射机制找到目标对象的相应属性,
                 * 并且将属性值设置为给定值。
                 *
                 * 其中bean就是上述所说的JavaBean
                 * metaData.getColumnName()就是获取bean当中set方法
                 * resultSet.getObject()就是获取结果集当中的值,()当中可以通过列数获取,也可以通过列名获取
                 */
                BeanUtils.setProperty(t, metaData.getColumnName(i + 1), resultSet.getObject(i + 1));
            }
        }
        //释放资源
        close(connection, preparedStatement, resultSet);
        return t;
    }
    /** 第3种
     * 返回数据以Map<String,Object>形式返回 String表示sql表项(不可重复),
     * Object表示每个表项对应的值
     * @param sql
     * @param values
     * @return
     */
    public static Map<String, Object> queryMap(String sql, Object... values) {
        HashMap<String, Object> map = null;
        try {
            //获取连接
            Connection connection = JdbcUtils.getConnection();
            //进行预处理
            PreparedStatement prepareStatement = JdbcUtils.getPreparedStatement(sql, connection, values);
            //获取结果集
            ResultSet resultSet = prepareStatement.executeQuery();
            //获取元数据
            ResultSetMetaData metaData = resultSet.getMetaData();
            //获取列数
            int columnCount = metaData.getColumnCount();
            //定义一个Map集合
            map = new HashMap<>();
            while (resultSet.next()) {
                for (int i = 0; i < columnCount; i++) {
                    String columnName = metaData.getColumnName(i + 1);
                    Object object = resultSet.getObject(i + 1);
                    map.put(columnName, object);
                }
            }
            JdbcUtils.close(connection, prepareStatement, resultSet);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return map;
    }


    /** 第4种
     * 结果以list<Object[]>形式返回  list集合中元素都是数组
     * @param sql
     * @param parameters 可变参数列表
     * @return
     */
    public static List<Object[]> queryArrayList(String sql,Object...values){
        ArrayList<Object[]> ArrayListobjects = null;
        try {
            Connection connection = JdbcUtils.getConnection();
            PreparedStatement prepareStatement = JdbcUtils.getPreparedStatement(sql, connection, values);
            ResultSet resultSet = prepareStatement.executeQuery();
            ResultSetMetaData metaData = resultSet.getMetaData();
            //通过元数据获取列数
            int columnCount = metaData.getColumnCount();
            ArrayListobjects = new ArrayList<>();
            while (resultSet.next()){
                //这个数组的长度刚好是查询的列数
                Object[] objs = new Object[columnCount];
                for (int i = 0; i < columnCount; i++) {
                    objs[i] = resultSet.getObject(i + 1);
                }
                ArrayListobjects.add(objs);
            }
            JdbcUtils.close(connection,prepareStatement,resultSet);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return ArrayListobjects;
    }

    /** 第5种
     * 功能:结果以数组形式保存并且返回
     * @param sql 查询的sql
     * @param parameters 参数列表
     * @return 返回 Object[]
     */
    public static Object[] queryArray(String sql,Object...values){
        Object[] objs = new Object[0];
        try {
            Connection connection = JdbcUtils.getConnection();
            PreparedStatement prepareStatement = JdbcUtils.getPreparedStatement(sql, connection, values);
            ResultSet resultSet = prepareStatement.executeQuery();
            ResultSetMetaData metaData = resultSet.getMetaData();
            //通过元数据获取列数
            int columnCount = metaData.getColumnCount();
            //这个数组的长度刚好是查询的列数
            objs = new Object[columnCount];
            while (resultSet.next()){
                for (int i = 0; i < columnCount; i++) {
                    //列数是从第一列开始的
                    objs[i] = resultSet.getObject(i + 1);
                }
            }
            JdbcUtils.close(connection,prepareStatement,resultSet);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return objs;
    }
    public static void close(Connection connection) {
        try {
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void close(Connection connection, PreparedStatement preparedStatement) {
        try {
            preparedStatement.close();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void close(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet) {
        try {
            resultSet.close();
            preparedStatement.close();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

 这里我们就以JavaBean当中的students为例进行结果演示,以封装的第1种方法为例进行查询

package ReflectJdbcSellectAll;

import ReflectJdbcSellectAll.JavaBean.students;

import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.List;

public class TextRun {
    public static void main(String[] args) throws SQLException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {

        String sql = "select * from students where ssex = ?";
        List<students> list = JdbcUtils.ListSelect(sql, students.class,"男");
        System.out.println("sno"+'\t'+'\t'+"sname"+'\t'+'\t'+"ssex"+'\t'+'\t'+"sbirthday"+'\t'+'\t'+"calssz");
        for (students students : list) {
            System.out.println(students.getSno()+'\t'+'\t'+
                    students.getSname()+'\t'+'\t'+
                    students.getSsex()+'\t'+'\t'+
                    students.getSbirthday()+'\t'+'\t'+'\t'+'\t'+
                    students.getClassz());
        }
    }
}

 格式尽力在对齐了...

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值