读书时的梦想的实现(封装JDBC)

396 阅读2分钟

起因

JDBC是每个Java人的必经之路,当然小杜也有过这么一个时期。在读书时,学到连接数据库时,不知道在座的各位看官有没有被cao蛋的resultSet.getString,getInteger....给惹烦呢?当时就在想找工具类把这个绕过,奈何当初有心无力,只能望其空流泪,一遍遍的流泪,一遍遍的写。如今会想起这个梦想。我再次想起了我的初心,于是 淦!

原理

利用类的反射拿到所有属性,然后遍历属性,把属性名填入getObject()其中,OK

可能对您产生的帮助

重温JDBC[捂脸], 反射的基本api

前置配置(可跳过)

回顾下JDBC的基本步骤

  1. 准备配置参数
  /**
     * 驱动类路径
     */
    private static String driver = "com.mysql.cj.jdbc.Driver";
 
    /**
     *  链接字符串
     */
    private static String url = "jdbc:mysql://localhost:3306/dee";
    /**
     * 用户名
     */
    private static String user = "root";
    /**
     * 密码
     */
    private static String pass = "123123123";
  1. 获取连接对象
 /**
     * 初始化Connection 对象
     * @author youao.du@gmail.com
     * @time 22:26
     * @params
     */
    static {
        if (conn == null) {
            try {
                Class.forName(driver);
                conn = DriverManager.getConnection(url, user, pass);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
  1. sql语句转换PreparedStatement
    /**
     * 执行参数
     * @author youao.du@gmail.com
     * @time 23:08
     * @params
     */
    private static PreparedStatement prepared(String sql, Object... params) {
        // 最后返回值
        PreparedStatement pstmt = null;
        try {
            pstmt = conn.prepareStatement(sql);
            if (params != null) {
                for (int i = 0; i < params.length; i++) {
                    pstmt.setObject(i + 1, params[i]);
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return pstmt;
    }

正式开始

我们要实现的目的是只需传入Sql、参数、和最后返回的结果类型几可拿到List,
可以使用以下API:
Class.getDeclaredFields() 获取该类下的所有属性 注:获取不到父类的
Field.set() 设置此属性的值
Field.setAccessible() 设置此属性状态

    /**
     * 查询列表
     * @author youao.du@gmail.com
     * @time 23:04
     * @params [sql, className, params]
     */
    public static <T> List<T> selectList(String sql, Class<T> className, Object... params) {
        // 非空判断
        if (StringUtils.isBlank(sql) || className == null) {
            return null;
        }
        printBasicLogger(sql, params);
        // sql转换操作
        PreparedStatement prepared = prepared(sql, params);
        List<T> result = null;
        try {
            // 执行sql拿到结果
            ResultSet resultSet = prepared.executeQuery();
            result = new ArrayList<>();
            while (resultSet.next()) {
                // 判断是不是基本数据类型
                if (!isValType(className)) {
                    T t = className.newInstance();
                    // 获取所有属性
                    Field[] fields = className.getDeclaredFields();
                    // 遍历当前列所有属性
                    for (Field field : fields) {
                        // 设置属性值
                        field.setAccessible(true);
                        field.set(t, resultSet.getObject(humpToUnderline(field.getName())));
                    }
                    result.add(t);
                }else {
                    T t = (T) resultSet.getObject(0);
                    result.add(t);
                }
            }
        } catch(SQLException e){
            e.printStackTrace();
        } catch(IllegalAccessException e){
            e.printStackTrace();
        } catch(InstantiationException e){
            e.printStackTrace();
        }
        return result;
}

至此,文章写到这里。此JDBC我还封装了单表增删改查的基本操作,如果需要可以到我的GitHub自取 github