码迷,mamicode.com
首页 > 编程语言 > 详细

Java学习不走弯路教程(7 ORM框架(数据到对象映射))

时间:2018-10-15 20:42:26      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:one   扩展   close   实现   反射   har   tco   mysql   概念   

ORM框架(数据到对象映射)

一. 前言

在前上一章教程中,介绍了数据库查询的方法。
本章将在上一章的基础上,进一步扩展程序。

注:
1.本文针对初学Java的同学训练学习思路,请不要太纠结于细节问题。
2.本文旨在达到抛砖引玉的效果,希望大家扩展本例子,以学到更多知识的精髓。

学习本章需要准备的知识:
1.读完本系列教程的前面章节。
2.ORM概念,Java反射基础。

二. 步入正题
话不多说,大家自己理解,下面步入正题:

我们已经实现了通过JDBC操作数据库。
那么,查询的结果用什么来在程序中传递呢?
本章我们将介绍简单的ORM技术,把数据转化成对象,如下图所示:
技术分享图片

既然是做映射,那么我们需要得到要映射的属性和要映射的值。
如下图所示:
技术分享图片

接下来我们分别介绍数据库端和Java端得到映射的属性和要映射的值的方法。

数据库端:
Java通过JDBC与数据库进行交互,所以我们应该从JDBC去寻找读取结果集的属性和值得方法。
首先,从数据库取得的结果分为元信息和数据两部分,其中列名等表结构信息我们称为元信息,查询的数据称为数据。
所以数据库端映射的属性应该从元信息中获得,值从数据中获得。
在JDBC中可以用resultSet.getMetaData()来获取元信息,通过resultSet.getString()等方法可以获得数据信息。
这样我们只需要对这两种信息做映射就可以了。

Java端:
Java端和数据库端一样,也可以把数据的存储分为元信息和数据。
其中类信息为元信息,表示类的结构,可以通过Java反射的方式得到类的结构信息。
对象为数据,也可以通过Java反射的方式,获取指定对象指定属性的值。
这样我们只需要对这两种信息做映射就可以了。

做一个Person类

 1 /**
 2  * 
 3  * @author http://www.java123.vip
 4  *
 5  */
 6 public class Person {
 7     
 8     public String id;
 9     public String username;
10     public String passwd;
11     
12 }

 

处理映射的代码如下:
在这里我们只处理String字段。

 1 /**
 2  * 
 3  * @author http://www.java123.vip
 4  *
 5  */
 6 public class ObjectCreator {
 7 
 8     /**
 9      * @author http://www.java123.vip
10      * 
11      * @param rs 查询结果集
12      * @param cls 类的信息
13      * @return
14      * @throws SQLException
15      */
16     public static Object createObject(ResultSet rs, Class cls) throws SQLException {
17         
18         // 获得结果集的元信息(列名)
19         int columnCount = rs.getMetaData().getColumnCount();
20         String[] headers = new String[columnCount];
21         for(int i = 0; i < headers.length; i ++) {
22             headers[i] = rs.getMetaData().getColumnName(i+1);
23         }
24         
25         try {
26             // 生成一个对象实例
27             Object obj = cls.newInstance();
28             
29             // 针对每个元信息,查找对应class的元信息,并完成赋值。
30             for(int i = 0; i < headers.length; i++) {
31                 String header = headers[i];
32                 
33                 // 获得结果数据的值
34                 String data = rs.getString(header);
35                 
36                 try {
37                     // 获得class的元信息(属性值)
38                     Field field = cls.getField(header);
39                     if(field != null) {
40                         // 赋值
41                         field.set(obj, data);
42                     }
43                 } catch (SecurityException e) {
44                     e.printStackTrace();
45                 } catch (NoSuchFieldException e) {
46                     e.printStackTrace();
47                 }
48                 
49             }
50             
51             // 返回映射后的对象实例
52             return obj;
53         } catch (InstantiationException e) {
54             e.printStackTrace();
55         } catch (IllegalAccessException e) {
56             e.printStackTrace();
57         }
58         
59         return null;
60     }
61 }

 

我们做一个PersonDao来封装对数据库的操作。
于是程序变成这样的写法:

 1 /**
 2  * 
 3  * @author http://www.java123.vip
 4  *
 5  */
 6 public class PersonDao {
 7 
 8     public Person getPersonById(String id, Class cls) {
 9         Person person = null;
10         
11         try {
12             Class.forName("com.mysql.jdbc.Driver");
13             Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8", "root", "rootpassword");
14             Statement st = conn.createStatement();
15             ResultSet rs = st.executeQuery("select * from person where id="+id);
16             
17             if(rs.next()) {
18                 // ORM映射
19                 person = (Person) ObjectCreator.createObject(rs, cls);
20             }
21             
22             rs.close();
23             st.close();
24             conn.close();
25             
26         } catch (ClassNotFoundException e) {
27             e.printStackTrace();
28         } catch (SQLException e) {
29             e.printStackTrace();
30         }
31         
32         return person;
33     }
34 
35 }

 

三. 测试
测试代码如下:

 1 public class PersonDaoTest {
 2 
 3     public static void main(String[] args) {
 4         
 5         PersonDao personDao = new PersonDao();
 6         
 7         Person param = new Person();
 8         param.id = "1";
 9         
10         Person personResult = personDao.getPersonById("1", Person.class);
11         
12         System.out.println("id:"+personResult.id);
13         System.out.println("username:"+personResult.username);
14         System.out.println("password:"+personResult.passwd);
15         
16     }
17 }

程序输出如下:

id:1
username:abc
password:aaa

 

完整程序请大家从[这里]下载

如有问题,大家来我的网站进行提问。
https://www.java123.vip/qa

版权声明:本教程版权归java123.vip所有,禁止任何形式的转载与引用。

Java学习不走弯路教程(7 ORM框架(数据到对象映射))

标签:one   扩展   close   实现   反射   har   tco   mysql   概念   

原文地址:https://www.cnblogs.com/java123-vip/p/9768061.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!