数据库中的字段名经常和我们Java中的Bean对象的属性名不一致,这样会导致使用反射为对象赋值出现如下问题:
对于该问题,Mybatis中可以使用注解来解决,但是最基本的JDBC操作是无法使用注解进行解决,这时可以使用起别名的方式进行解决,也就是在执行SQL语句时,可以将返回的字段名起别名将其和Bean对象中的属性名一致。
然后使用 rsmd.getColumnLabel()
获取结果集对应的别名,而不是使用 rsmd.getColumnName()
获取结果集的列名。
@Test public void test() { String sql = "select order_id orderId, order_name orderName, order_date orderDate from `order` where order_id = ?"; Order order = orderForQuery(sql, "1"); System.out.println(order); } public Order orderForQuery(String sql, Object... args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; Order order = null; try { // 1.获取连接 conn = JDBCUtils.getConnection(); // 2.预编译SQL语句 ps = conn.prepareStatement(sql); // 3.填充占位符 for (int i = 0; i < args.length; i++) { ps.setObject(i + 1, args[i]); } // 4.获取结果集 rs = ps.executeQuery(); // 5.获取结果集元数据对象 ResultSetMetaData rsmd = rs.getMetaData(); // 6.获取结果集列数 int columnCount = rsmd.getColumnCount(); // 7.处理结果集 if (rs.next()) { order = new Order(); for (int i = 0; i < columnCount; i++) { // 8.获取结果集的值 Object columnValue = rs.getObject(i + 1); // 9.获取结果集的别名 String columnLabel = rsmd.getColumnLabel(i + 1); // 10.通过反射为对象赋值 Field field = Order.class.getDeclaredField(columnLabel); field.setAccessible(true); field.set(order, columnValue); } } } catch (Exception e) { e.printStackTrace(); } finally { // 11.关闭资源 JDBCUtils.closeResource(conn, ps, rs); } return order; }
Bean对象