Java反射机制的简单应用

当使用Java操作MySQL数据库时,想把取出来的数据存进对象里,如果只是简单的Bean类,还可以逐一get set,但是当对象的属性比较多时就显得比较麻烦,如果不借助工具很难轻松完成。最近学习了Java的反射机制,就尝试着将其抽象出来了,下面使用反射机制对查询出的数据赋值给对象。

  • 数据库连接类:
public class DBHelper {
    public static final String driver = "com.mysql.jdbc.Driver";// 数据库连接驱动名称
    public static final String url = "jdbc:mysql://127.0.0.1/app";// 数据库连接地址
    public static final String name = "root";// 数据库用户名
    public static final String password = "password";// 数据库用户密码
    public Connection conn;
    public PreparedStatement pst;// 准备编译好的sql

    public DBHelper(String sql) {
        try {
            Class.forName(driver);// 加载数据库驱动
            conn = (Connection) DriverManager.getConnection(url, name, password);// 获得Connection对象
            pst = (PreparedStatement) conn.prepareStatement(sql);// 创建向数据库发送预编译sql的PrepareSatement对象
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void close() {// 释放连接资源
        try {
            this.conn.close();
            this.pst.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
  • 反射实现类:
public class Mian {

    static String sql = null;
    static DBHelper db = null;
    static ResultSet ret = null;

    public static void main(String[] args) {
        sql = "select * from cx_user";
        db = new DBHelper(sql);
        Class uClass = null;
        try {
            uClass = Class.forName("tree.User");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        HashMap oHashMap = new HashMap();// 储存用户对象
        Field[] declaredFields = uClass.getDeclaredFields();
        try {
            ret = db.pst.executeQuery();// 执行查询
            while (ret.next()) {
                User User = new User();
                for (int i = 0; i < declaredFields.length; i++) {
                    String name = declaredFields[i].getName();// 获取属性的名称
                    String type = declaredFields[i].getGenericType().toString();// 获取属性的类型
                    char[] cs = name.toCharArray();// 属性名称首字母大写
                    cs[0] -= 32;
                    // 对User对象赋值
                    if (type.equals("int")) {// 匹配整型
                        Method method = uClass.getMethod("set" + String.valueOf(cs), int.class);
                        method.invoke(User, ret.getInt(name));
                    }
                    if (type.equals("class java.lang.String")) {// 匹配字符串类型
                        Method method = uClass.getMethod("set" + String.valueOf(cs), String.class);
                        method.invoke(User, ret.getString(name));
                    }
                    if (type.equals("class java.lang.Double")) {// 匹配布尔类型
                        Method method = uClass.getMethod("set" + String.valueOf(cs), Double.class);
                        method.invoke(User, ret.getDouble(name));
                    }
                    // 如果有更多类型,接着往下匹配就行了
                }
                oHashMap.put(User.getId(), User);// HashMap容器存放对象
            }
            ret.close();// 关闭结果集
            db.close();// 关闭连接
            for (Entry org : oHashMap.entrySet()) {// 遍历HashMap容器
                User User = org.getValue();
                System.out.println(User.toString());// 调用toString方法输出用户
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

你可能感兴趣的:(Java笔记)