Java反射示例:数据库数据反射为Java对象

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34461514/article/details/78856265

首先,准备必要的对象:

下面是需要用到的对象。数据库连接在最后讲解

...
private static Connection con;
private static Statement stm;
private static PreparedStatement pps;
private static ResultSet rss;
//列名-列类型 map
private static HashMap<String,String> column_type=new HashMap<>();

通过DatabaseMetaData对象获取列名和列类型

后面需要通过列名来给对应名字的变量赋值,通过列类型赋予给变量正确的数据类型

private static void setMetaData(Class clazz) {
    // 获取类的名字
    String name=clazz.getSimpleName();
    try {
        // 获取类对应的表的元数据
        DatabaseMetaData meta=con.getMetaData();
        rss=meta.getColumns(con.getCatalog(), "root", name, "%");
        // 从元数据获取每一列的 COLUMN_NAME(列名)和 TYPE_NAME(类型)
        while(rss.next()) {
            column_type.put(rss.getString("COLUMN_NAME"), rss.getString("TYPE_NAME"));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

通过反射获取类对象

下面是读取数据反射为类对象的操作,类对象反射写入数据库可以借此类推

/**
* 通过id查询对象
* @param id 对象id
* @param clazz  类
*/
private static Object getObjectById(int id,Class clazz) {
        Object o=null;
        //获取类的名字
        String name=clazz.getSimpleName();

        //如果 列名-列类型 map为空,获取一下
        if(column_type.size()==0)
            setMetaData();
        try {
            //查询数据(通过类名查对应的表)
            pps=con.prepareStatement("SELECT * FROM "+name+" WHERE id=?");
            pps.setInt(1, id);
            rss=pps.executeQuery();

            //获取类实例
            o=clazz.newInstance();

            //查询结果
            if(rss.next()) {
                //遍历列名
                for(String name:column_type.keySet()) {
                    //查找类中对应的变量
                    Field f=c.getDeclaredField(name);

                    //获取数据库中的类型 & 类中的类型(末尾类型)
                    String type=column_type.get(name),
                    field_type=f.getType().getSimpleName();

                    //获取类中变量的set方法
                    Method m=c.getMethod("set"+upwordFirstCase(name), f.getType());

                    switch(type) {
                    //字符串类型
                    case "VARCHAR":
                        if(field_type.equals("String"));{       //判断两种类型是否相容
                            m.invoke(o, rss.getString(name));   //执行set方法,写入类对象
                        }
                        break;
                    //整形
                    case "INT":
                        if(field_type.equals("int")||field_type.equals("Integer"));{
                            m.invoke(o, rss.getInt(name));
                        }
                        break;                                                                                                                  
                    //日期类型
                    case "DATE":
                        if(field_type.equals("Date"));{
                            m.invoke(o, rss.getDate(name));
                        }
                    break;
                    }
                }
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
        return o;
    }

/**
 * 使字符串首字母大写
 * 示例:name-->Name
 * 通过此方法获取的字符串前面加上set、get后,用于获取实体类中自动生成的getter,setter方法
 * @param s  需要首字母大写的字符串
 */
private static String upwordFirstCase(String s) {
    char first=s.charAt(0);
    if(first>='a'&&first<='z')
        first-=32;
    return first+s.substring(1);
}

附:数据库连接

需要的jar
这个包需要导入构建路径

//连接准备
private static final String DRIVER="org.gjt.mm.mysql.Driver",
            URL="jdbc:mysql://localhost:3306/test?useSSL=true",
            USER="root",
            PASS="root";
//连接
private static void init() {
        try {
            Class.forName(DRIVER);
            con=DriverManager.getConnection(URL, USER, PASS);
            stm=con.createStatement();
        } catch (SQLException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

小生水平有限,欢迎大家指点

猜你喜欢

转载自blog.csdn.net/qq_34461514/article/details/78856265