Java学习不走弯路教程(7 ORM框架(数据到对象映射))
Posted java123-vip
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习不走弯路教程(7 ORM框架(数据到对象映射))相关的知识,希望对你有一定的参考价值。
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框架(数据到对象映射))的主要内容,如果未能解决你的问题,请参考以下文章