zoukankan      html  css  js  c++  java
  • JDBC 利用反射技术将查询结果封装为对象(简单ORM实现)

    ORM(Object Relational Mapping)对象关系映射

     

    public class ORMTest {

        public static void main(String[] args) throws SQLException,

                IllegalAccessException, InvocationTargetException, Exception {

            User user = (User) getObject(

                    "select id as Id, name as Name, birthday as Birthday, money as Money  from user where id=1",

                    User.class);

            System.out.println(user);

     

            Bean b = (Bean) getObject(

                    "select id as Id, name as Name, birthday as Birthday, money as Money from user where id=1",

                    Bean.class);

            System.out.println(b);

        }

     

        static List<Object> getObjects(String sql, Class clazz)

                throws SQLException, Exception, IllegalAccessException,

                InvocationTargetException {

            Connection conn = null;

            PreparedStatement ps = null;

            ResultSet rs = null;

            try {

                conn = JdbcUtils.getConnection();

                ps = conn.prepareStatement(sql);

                rs = ps.executeQuery();

                String[] colNames = getColNames(rs);

     

                List<Object> objects = new ArrayList<Object>();

                Method[] ms = clazz.getMethods();

                while (rs.next()) {

                    Object object = clazz.newInstance();

                    for (int i = 0; i < colNames.length; i++) {

                        String colName = colNames[i];

                        String methodName = "set" + colName;

                        // Object value = rs.getObject(colName);

                        // try {

                        // Method m = clazz

                        // .getMethod(methodName, value.getClass());

                        // if (m != null)

                        // m.invoke(object, value);

                        // } catch (NoSuchMethodException e) {

                        // e.printStackTrace();

                        // //

                        // }

                        for (Method m : ms) {

                            if (methodName.equals(m.getName())) {

                                m.invoke(object, rs.getObject(colName));

                                break;

                            }

                        }

                        objects.add(object);

                    }

                }

                return objects;

            } finally {

                JdbcUtils.free(rs, ps, conn);

            }

        }

     

        private static String[] getColNames(ResultSet rs) throws SQLException {

            ResultSetMetaData rsmd = rs.getMetaData();

            int count = rsmd.getColumnCount();

            String[] colNames = new String[count];

            for (int i = 1; i <= count; i++) {

                colNames[i - 1] = rsmd.getColumnLabel(i);

            }

            return colNames;

        }

     

        static Object getObject(String sql, Class clazz) throws SQLException,

                Exception, IllegalAccessException, InvocationTargetException {

            Connection conn = null;

            PreparedStatement ps = null;

            ResultSet rs = null;

            try {

                conn = JdbcUtils.getConnection();

                ps = conn.prepareStatement(sql);

                rs = ps.executeQuery();

                String[] colNames = getColNames(rs);

     

                Object object = null;

                Method[] ms = clazz.getMethods();

                if (rs.next()) {

                    object = clazz.newInstance();

                    for (int i = 0; i < colNames.length; i++) {

                        String colName = colNames[i];

                        String methodName = "set" + colName;

                        // Object value = rs.getObject(colName);

                        // try {

                        // Method m = clazz

                        // .getMethod(methodName, value.getClass());

                        // if (m != null)

                        // m.invoke(object, value);

                        // } catch (NoSuchMethodException e) {

                        // e.printStackTrace();

                        // //

                        // }

                        for (Method m : ms) {

                            if (methodName.equals(m.getName())) {

                                m.invoke(object, rs.getObject(colName));

                                break;

                            }

                        }

                    }

                }

                return object;

            } finally {

                JdbcUtils.free(rs, ps, conn);

            }

        }

    }

  • 相关阅读:
    322. Coin Change
    368.[LeetCode] Largest Divisible Subset
    c++
    python 循环
    2018今日头条
    c++中set的用法
    [LeetCode]48. Rotate Image 旋转图片
    [LeetCode]47. Permutations II
    [LeetCode]46. Permutations
    sys与os模块(转载)
  • 原文地址:https://www.cnblogs.com/flying607/p/3462760.html
Copyright © 2011-2022 走看看