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所有,禁止任何形式的转载与引用。