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

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

一. 前言

在前上一章教程中,介绍了ORM框架数据到对象的映射的方法。
本章将在上一章的基础上,进一步扩展程序。

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

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

二. 步入正题

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

我们已经实现了将数据库数据转化为Java对象的方法。
那么,怎么把Java对象转化为数据呢?
本章我们将介绍把Java对象转化为数据的方法,如下图所示。

 

我们知道,数据库的数据是通过SQL语句来生成的,所以对象到数据的映射实际上就是把对象的属性和值转化为SQL语句的过程。

在Java中可以通过Java反射的方式得到类的属性等信息。
所以直接将这些信息拼成SQL即可。

接下来我们来做一个将Person对象保存到数据库的例子,
即将Person对象转化为insert语句,然后执行。
在这里我们只处理String字段,并且忽略主键冲突问题。
代码如下:

 1 /**
 2  * 
 3  * @author http://www.java123.vip
 4  *
 5  */
 6 public class SqlCreator {
 7 
 8     /**
 9      * @author http://www.java123.vip
10      * 
11      * 根据传入的对象拼写insert语句
12      * 
13      * @param obj
14      * @return
15      */
16     public static String createInsertSql(Object obj) {
17         
18         Class cls = obj.getClass();
19         
20         StringBuffer sql = new StringBuffer("insert into ");
21         
22         try {
23             // 表名的处理
24             String className = cls.getSimpleName();
25             sql.append(className);
26             
27             sql.append(" ( ");
28 
29             // 列名和值的处理
30             boolean first = true;
31             StringBuffer valuesStr = new StringBuffer();
32             Field[] fields = cls.getFields();
33             for(int i = 0; i < fields.length; i ++) {
34                 Field field = fields[i];
35                 String fieldName = field.getName();
36                 String fieldValue = (String)field.get(obj);
37                 if(fieldValue != null) {
38                     
39                     // 第一个字段前不插入逗号
40                     if(first) {
41                         first = false;
42                     }else {
43                         sql.append(",");
44                         valuesStr.append(",");
45                     }
46                     
47                     sql.append(fieldName);
48                     valuesStr.append("'"+fieldValue+"'");
49                 }
50             }
51             
52             sql.append(" ) values ("+valuesStr.toString()+")");
53             
54         } catch (SecurityException e) {
55             e.printStackTrace();
56         } catch (IllegalArgumentException e) {
57             e.printStackTrace();
58         } catch (IllegalAccessException e) {
59             e.printStackTrace();
60         }
61         
62         return sql.toString();
63     }
64     
65 }

 

于是程序变成这样的写法:

 1     public void savePerson(Person person) {
 2 
 3         // ORM映射
 4         String insertSql = SqlCreator.createInsertSql(person);
 5         
 6         try {
 7             Class.forName("com.mysql.jdbc.Driver");
 8             Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8", "root", "rootpassword");
 9             Statement st = conn.createStatement();
10             int saveCount = st.executeUpdate(insertSql);
11             
12             System.out.println(insertSql);
13             System.out.println(saveCount+" row saved.");
14             
15             st.close();
16             conn.close();
17             
18         } catch (ClassNotFoundException e) {
19             e.printStackTrace();
20         } catch (SQLException e) {
21             e.printStackTrace();
22         }
23         
24     }

 

三. 测试
测试代码如下:

 1     public static void main(String[] args) {
 2         
 3         PersonDao personDao = new PersonDao();
 4         
 5         Person person = new Person();
 6         person.id = "4";
 7         person.username= "qqq";
 8         person.passwd = "uuu";
 9         personDao.savePerson(person);
10     }

程序输出如下:

insert into Person ( id,username,passwd ) values ('4','qqq','uuu')
1 row saved.

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

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

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

转载于:https://www.cnblogs.com/java123-vip/p/9768065.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值