Java回顾之ORM框架

    添加时间:2013-5-14 点击量:

      第一篇:Java回顾之I/O


      第二篇:Java回顾之收集通信


      第三篇:Java回顾之多线程


      第四篇:Java回顾之多线程同步


      第五篇:Java回顾之凑集


      第六篇:Java回顾之序列化


      第七篇:Java回顾之反射


      第八篇:Java回顾之一些根蒂根基概念


      第九篇:Java回顾之JDBC



      这篇文章里,我们首要评论辩论ORM框架,以及在应用上和JDBC的差别。


      概述


      ORM框架不是一个新话题,它已经撒播了很多年。它的长处在于供给了概念性的、易于懂得的数据模型,将数据库中的表和内存中的对象建树了很好的映射关系。


      我们在这里首要存眷Java中常用的两个ORM框架:Hibernate和iBatis。下面来介绍这两个框架简单的应用办法,若是将来有时候,我会深切的写一些更有意思的相干文章。


      Hibernate


      Hibernate是一个持久化框架和ORM框架,持久化和ORM是两个有区此外概念,持久化重视对象的存储办法是否跟着法度的退出而灭亡,ORM存眷的是如安在数据库表和内存对象之间建树接洽关系。


      Hibernate应用POJO来默示Model,应用XML设备文件来设备对象和表之间的关系,它供给了一系列API来经由过程对对象的操纵而改变数据库中的过程。


      Hibernate更夸大如何对单笔记录进行操纵,对于更错杂的操纵,它供给了一种新的面向对象的查询说话:HQL。


      我们先来定义一个关于Hibernate中Session经管的类,这里的Session类似于JDBC中的Connection。


    Hibernate的Session经管类

     1 public class HibernateSessionManager {
    
    2
    3 private static SessionFactory sessionFactory;
    4
    5 static
    6 {
    7 try
    8 {
    9 sessionFactory = new Configuration().configure(sample/orm/hibernate/hibernate.cfg.xml).buildSessionFactory();
    10 }
    11 catch(Exception ex)
    12 {
    13 ex.printStackTrace();
    14 }
    15 }
    16
    17 public static final ThreadLocal tl = new ThreadLocal();
    18
    19 public static Session currentSession()
    20 {
    21 Session s = (Session)tl.get();
    22 if (s == null
    23 {
    24 s = sessionFactory.openSession();
    25 tl.set(s);
    26 }
    27
    28 return s;
    29 }
    30
    31 public static void closeSession()
    32 {
    33 Session s = (Session)tl.get();
    34 tl.set(null);
    35 if (s != null
    36 {
    37 s.close();
    38 }
    39 }
    40 }



      基于单张表进行操纵


      下面我们来看一个简单的示例,它沿用了Java回顾之JDBC中的数据库,应用MySQL的test数据库中的user表。


      起首,我们来定义VO对象:


    定义User对象

     1 public class User implements Serializable
    
    2 {
    3 private static final long serialVersionUID = 1L;
    4 private int userID;
    5 private String userName;
    6 public void setUserID(int userID) {
    7 this.userID = userID;
    8 }
    9 public int getUserID() {
    10 return userID;
    11 }
    12 public void setUserName(String userName) {
    13 this.userName = userName;
    14 }
    15 public String getUserName() {
    16 return userName;
    17 }
    18 }



      然后,我们定义User对象和数据库中user表之间的接洽关系,user表中只有两列:id和name。



     1 <?xml version=1.0?>
    
    2 <!DOCTYPE hibernate-mapping PUBLIC -//Hibernate/Hibernate Mapping DTD 3.0//EN
    3 http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd>
    4
    5 <hibernate-mapping>
    6 <class name=sample.orm.hibernate.User table=user catalog=test>
    7 <id name=userID type=java.lang.Integer>
    8 <column name=id />
    9 <generator class=assigned />
    10 </id>
    11 <property name=userName type=java.lang.String>
    12 <column name=name />
    13 </property>
    14 </class>
    15 </hibernate-mapping>


      将上述内容存储为User.hbm.xml。


      接下来,我们须要定义一个关于Hibernate的全局设备文件,这里文件名是hibernate.cfg.xml。



     1 <?xml version=1.0 encoding=UTF-8?>
    
    2 <!DOCTYPE hibernate-configuration PUBLIC
    3 -//Hibernate/Hibernate Configuration DTD 3.0//EN
    4 http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd>
    5
    6 <hibernate-configuration>
    7 <session-factory>
    8 <property name=connection.driver_class>com.mysql.jdbc.Driver</property>
    9 <property name=connection.url>jdbc:mysql://localhost/test</property>
    10 <property name=connection.username>root</property>
    11 <property name=connection.password>123</property>
    12 <property name=dialect>org.hibernate.dialect.MySQLDialect</property>
    13 <property name=show_sql>true</property>
    14 <property name=jdbc.fetch_size>50</property>
    15 <property name=jdbc.batch_size>25</property>
    16
    17 <mapping resource=sample/orm/hibernate/User.hbm.xml />
    18 </session-factory>
    19 </hibernate-configuration>


      可以看到,上述设备文件中包含了数据库连接的信息,诸如driver信息、数据库url、用户名、暗码等等,还包含了我们上方定义的User.hbm.xml。


      最后,我们编写测试代码,来对user表进行增、删、查、改的操纵:


    应用Hibernate对user表进行操纵

     1 private static void getUser(int id)
    
    2 {
    3 Session session = HibernateSessionManager.currentSession();
    4 System.out.println(=====Query test=====);
    5 User user = (User)session.get(User.classnew Integer(id));
    6 if (user != null
    7 {
    8 System.out.println(ID: + user.getUserID() + ; Name: + user.getUserName());
    9 }
    10 HibernateSessionManager.closeSession();
    11 }
    12
    13 private static void User()
    14 {
    15 Session session = HibernateSessionManager.currentSession();
    16 System.out.println(=====Insert test=====);
    17 Transaction transaction = session.beginTransaction();
    18 User user = new User();
    19 user.setUserID(6);
    20 user.setUserName(Zhang Fei);
    21 session.save(user);
    22 session.flush();
    23 transaction.commit();
    24 HibernateSessionManager.closeSession();
    25 getUser(6);
    26 }
    27
    28 private static void User(int id)
    29 {
    30 Session session = HibernateSessionManager.currentSession();
    31 System.out.println(=====Update test=====);
    32 Transaction transaction = session.beginTransaction();
    33 User user = (User)session.get(User.classnew Integer(id));
    34 System.out.println(=====Before Update=====);
    35 if (user != null
    36 {
    37 System.out.println(ID: + user.getUserID() + ; Name: + user.getUserName());
    38 }
    39 user.setUserName(Devil);
    40 session.save(user);
    41 session.flush();
    42 transaction.commit();
    43 user = (User)session.get(User.classnew Integer(id));
    44 System.out.println(=====After Update=====);
    45 if (user != null
    46 {
    47 System.out.println(ID: + user.getUserID() + ; Name: + user.getUserName());
    48 }
    49 HibernateSessionManager.closeSession();
    50 }
    51
    52 private static void User(int id)
    53 {
    54 Session session = HibernateSessionManager.currentSession();
    55 System.out.println(=====Delete test=====);
    56 Transaction transaction = session.beginTransaction();
    57 User user = (User)session.get(User.classnew Integer(id));
    58 System.out.println(=====Before Delte=====);
    59 if (user != null
    60 {
    61 System.out.println(ID: + user.getUserID() + ; Name: + user.getUserName());
    62 }
    63 session.(user);
    64 transaction.commit();
    65 user = (User)session.get(User.classnew Integer(id));
    66 System.out.println(=====After Update=====);
    67 if (user != null
    68 {
    69 System.out.println(ID: + user.getUserID() + ; Name: + user.getUserName());
    70 }
    71 else
    72 {
    73 System.out.println(Delete successfully.);
    74 }
    75 HibernateSessionManager.closeSession();
    76 }



      我们遵守如下次序调用测试代码:



    1 User();
    
    2 User(6);
    3 User(6);


      可以看到如下成果:



    =====Insert test=====
    
    Hibernate: into test.user (name, id) values (
    ?, ?
    =====Query test=====
    Hibernate: user0_.id as id0_, user0_.name as name0_0_ test.user user0_ where user0_.id
    =?
    ID:
    6; Name:Zhang Fei
    =====Update test=====
    Hibernate: user0_.id as id0_, user0_.name as name0_0_ test.user user0_ where user0_.id
    =?
    =====Before Update=====
    ID:
    6; Name:Zhang Fei
    Hibernate: test.user set name
    =? where id=?
    =====After Update=====
    ID:
    6; Name:Devil
    =====Delete test=====
    Hibernate: user0_.id as id0_, user0_.name as name0_0_ test.user user0_ where user0_.id
    =?
    =====Before Delte=====
    ID:
    6; Name:Devil
    Hibernate: test.user where id
    =?
    Hibernate: user0_.id as id0_, user0_.name as name0_0_ test.user user0_ where user0_.id
    =?
    =====After Delete=====
    Delete successfully.


      请重视,上方的成果中,输出了每次数据库操纵时的SQL语句,这是因为在设备文件中有如下设备:



    <property name=show_sql>true</property>


      我们可以在开辟调试阶段将其打开,在安排到客户方时,将其封闭。


      基于多表接洽关系的操纵


      Hibernate在建树多表接洽关系时,按照主外键的设置,表之间的接洽关系可以分为三种:一对一、一对多和多对多。这些接洽关系会表如今表的设备文件以及VO中。


      下面我们来看一个经典的多表接洽关系示例:排课表。数据库中建树如下四张表:Grade/Class/ClassRoom/Schedule。刚发明,应用MySQL自带的经管器导出表定义根蒂根基是一件不成能的任务。。。。


      上述各表除ID以及须要外键外,只有Name一列。


      然后看各个VO的定义:


    定义Grade对象

     1 package sample.orm.hibernate;
    
    2
    3 import java.io.Serializable;
    4 import java.util.Set;
    5
    6 public class Grade implements Serializable
    7 {
    8 private static final long serialVersionUID = 1L;
    9 private int gradeID;
    10 private String gradeName;
    11 private Set classes;
    12 public void setGradeID(int gradeID) {
    13 this.gradeID = gradeID;
    14 }
    15 public int getGradeID() {
    16 return gradeID;
    17 }
    18 public void setGradeName(String gradeName) {
    19 this.gradeName = gradeName;
    20 }
    21 public String getGradeName() {
    22 return gradeName;
    23 }
    24 public void setClasses(Set classes) {
    25 this.classes = classes;
    26 }
    27 public Set getClasses() {
    28 return classes;
    29 }
    30 }



    定义Class对象

     1 package sample.orm.hibernate;
    
    2
    3 import java.io.Serializable;
    4 import java.util.Set;
    5
    6 public class Class implements Serializable
    7 {
    8 private static final long serialVersionUID = 1L;
    9 private int classID;
    10 private Grade grade;
    11 private Set classrooms;
    12 private String className;
    13 public void setClassID(int classID) {
    14 this.classID = classID;
    15 }
    16 public int getClassID() {
    17 return classID;
    18 }
    19 public void setClassName(String className) {
    20 this.className = className;
    21 }
    22 public String getClassName() {
    23 return className;
    24 }
    25 public void setGrade(Grade grade) {
    26 this.grade = grade;
    27 }
    28 public Grade getGrade() {
    29 return grade;
    30 }
    31 public void setClassrooms(Set classrooms) {
    32 this.classrooms = classrooms;
    33 }
    34 public Set getClassrooms() {
    35 return classrooms;
    36 }
    37 }



    定义ClassRoom对象

     1 package sample.orm.hibernate;
    
    2
    3 import java.io.Serializable;
    4 import java.util.Set;
    5
    6 public class ClassRoom implements Serializable
    7 {
    8 private static final long serialVersionUID = 1L;
    9 private int classRoomID;
    10 private String classRoomName;
    11 private Set classes;
    12 public void setClassRoomID(int classRoomID) {
    13 this.classRoomID = classRoomID;
    14 }
    15 public int getClassRoomID() {
    16 return classRoomID;
    17 }
    18 public void setClassRoomName(String classRoomName) {
    19 this.classRoomName = classRoomName;
    20 }
    21 public String getClassRoomName() {
    22 return classRoomName;
    23 }
    24 public void setClasses(Set classes) {
    25 this.classes = classes;
    26 }
    27 public Set getClasses() {
    28 return classes;
    29 }
    30 }



    定义Schedule对象

     1 package sample.orm.hibernate;
    
    2
    3 import java.io.Serializable;
    4 import java.util.Set;
    5
    6 public class Schedule implements Serializable
    7 {
    8 private static final long serialVersionUID = 1L;
    9 private int scheduleID;
    10 private int classRoomID;
    11 private int classID;
    12 private Set classes;
    13 public void setClassRoomID(int classRoomID) {
    14 this.classRoomID = classRoomID;
    15 }
    16 public int getClassRoomID() {
    17 return classRoomID;
    18 }
    19 public void setClassID(int classID) {
    20 this.classID = classID;
    21 }
    22 public int getClassID() {
    23 return classID;
    24 }
    25 public void setClasses(Set classes) {
    26 this.classes = classes;
    27 }
    28 public Set getClasses() {
    29 return classes;
    30 }
    31 public void setScheduleID(int scheduleID) {
    32 this.scheduleID = scheduleID;
    33 }
    34 public int getScheduleID() {
    35 return scheduleID;
    36 }
    37 }



      接着是各个表的接洽关系设备文件:


      1)Grade.hbm.xml



     1 <?xml version=1.0?>
    
    2 <!DOCTYPE hibernate-mapping PUBLIC -//Hibernate/Hibernate Mapping DTD 3.0//EN
    3 http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd>
    4
    5 <hibernate-mapping>
    6 <class name=sample.orm.hibernate.Grade table=grade catalog=test>
    7 <id name=gradeID type=java.lang.Integer>
    8 <column name=gradeid />
    9 <generator class=assigned />
    10 </id>
    11 <property name=gradeName type=java.lang.String>
    12 <column name=gradename />
    13 </property>
    14
    15 <set name=classes lazy=true inverse=true cascade=all--orphan>
    16 <key>
    17 <column name=gradeid/>
    18 </key>
    19 <one-to-many class=sample.orm.hibernate.Class/>
    20 </set>
    21 </class>
    22 </hibernate-mapping>


      重视上方的<set>设备,里面的<one-to-many>节点说了然Grade和Class之间一对多的关系。


      2)Class.hbm.xml



     1 <?xml version=1.0?>
    
    2 <!DOCTYPE hibernate-mapping PUBLIC -//Hibernate/Hibernate Mapping DTD 3.0//EN
    3 http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd>
    4
    5 <hibernate-mapping>
    6 <class name=sample.orm.hibernate.Class table=class catalog=test>
    7 <id name=classID type=java.lang.Integer>
    8 <column name=classid />
    9 <generator class=assigned />
    10 </id>
    11 <property name=className type=java.lang.String>
    12 <column name=classname />
    13 </property>
    14
    15 <many-to-one name=grade class=sample.orm.hibernate.Grade lazy=proxy not-null=true>
    16 <column name=gradeid/>
    17 </many-to-one>
    18
    19 <set name=classrooms lazy=true inverse=true cascade=all--orphan table=schedule>
    20 <key column =classid/>
    21 <many-to-many class=sample.orm.hibernate.ClassRoom column=classroomid/>
    22 </set>
    23 </class>
    24 </hibernate-mapping>


      重视它定义两个接洽关系:一个是和Grade之间多对一的关系,一个合适ClassRoom之间多对多的关系。


      3)ClassRoom.hbm.xml



     1 <?xml version=1.0?>
    
    2 <!DOCTYPE hibernate-mapping PUBLIC -//Hibernate/Hibernate Mapping DTD 3.0//EN
    3 http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd>
    4
    5 <hibernate-mapping>
    6 <class name=sample.orm.hibernate.ClassRoom table=classroom catalog=test>
    7 <id name=classRoomID type=java.lang.Integer>
    8 <column name=classroomid />
    9 <generator class=assigned />
    10 </id>
    11 <property name=classRoomName type=java.lang.String>
    12 <column name=classroomname />
    13 </property>
    14
    15 <set name=classes lazy=true inverse=true cascade=all--orphan table=schedule>
    16 <key column=classroomid/>
    17 <many-to-many class=sample.orm.hibernate.Class column=classid/>
    18 </set>
    19 </class>
    20 </hibernate-mapping>


      它只定义了一个接洽关系:和Class之间的多对多接洽关系。


      4)Schedule.hbm.xml



     1 <?xml version=1.0?>
    
    2 <!DOCTYPE hibernate-mapping PUBLIC -//Hibernate/Hibernate Mapping DTD 3.0//EN
    3 http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd>
    4
    5 <hibernate-mapping>
    6 <class name=sample.orm.hibernate.Schedule table=schedule catalog=test>
    7 <id name=scheduleID type=java.lang.Integer>
    8 <column name=scheduleid />
    9 <generator class=assigned />
    10 </id>
    11 <property name=classID type=java.lang.Integer>
    12 <column name=classid />
    13 </property>
    14 <property name=classRoomID type=java.lang.Integer>
    15 <column name=classroomid />
    16 </property>
    17 </class>
    18 </hibernate-mapping>


      这里就不须要再定义接洽关系了。


      我们须要在Hibernate全局设备文件中添加如下内容:



    1 <mapping resource=sample/orm/hibernate/Grade.hbm.xml />
    
    2 <mapping resource=sample/orm/hibernate/Class.hbm.xml />
    3 <mapping resource=sample/orm/hibernate/ClassRoom.hbm.xml />
    4 <mapping resource=sample/orm/hibernate/Schedule.hbm.xml />


      下面是各类测试办法,在有接洽关系的景象下,Hibernate供给了下面几个特点:



    • 延迟加载

    • 级联添加

    • 级联批改

    • 级联删除


    多表接洽关系景象下的一些测试办法

      1 private static void getClass(int gradeid)
    
    2 {
    3 Session session = HibernateSessionManager.currentSession();
    4 System.out.println(=====Get Class info=====);
    5 Transaction transaction = session.beginTransaction();
    6 Grade grade = (Grade)session.get(Grade.class, new Integer(gradeid));
    7
    8 Hibernate.initialize(grade);
    9 Iterator iterator = grade.getClasses().iterator();
    10 System.out.println(年级: + grade.getGradeName() + 包含以放工级:);
    11 while(iterator.hasNext())
    12 {
    13 System.out.println(grade.getGradeName() + ((Class)iterator.next()).getClassName());
    14 }
    15 HibernateSessionManager.closeSession();
    16 }
    17
    18 private static void getSchedule(int gradeid)
    19 {
    20 Session session = HibernateSessionManager.currentSession();
    21 Transaction transaction = session.beginTransaction();
    22 Grade grade = (Grade)session.get(Grade.class, new Integer(gradeid));
    23 if (grade != null)
    24 {
    25 System.out.println(ID: + grade.getGradeID() + ; Name: + grade.getGradeName());
    26 }
    27
    28 Hibernate.initialize(grade.getClasses());
    29
    30 Iterator iterator = grade.getClasses().iterator();
    31 while(iterator.hasNext())
    32 {
    33 Class c = (Class)iterator.next();
    34 System.out.println(grade.getGradeName() + c.getClassName() + 应用以下教室:);
    35 Hibernate.initialize(c.getClassrooms());
    36 Iterator iterator1 = c.getClassrooms().iterator();
    37 while(iterator1.hasNext())
    38 {
    39 System.out.println(((ClassRoom)iterator1.next()).getClassRoomName());
    40 }
    41 }
    42 HibernateSessionManager.closeSession();
    43 }
    44
    45 private static void Grade()
    46 {
    47 Session session = HibernateSessionManager.currentSession();
    48 Transaction transaction = session.beginTransaction();
    49 Grade grade = new Grade();
    50 grade.setGradeID(4);
    51 grade.setGradeName(四年级);
    52
    53 Class c1 = new Class();
    54 c1.setClassID(7);
    55 c1.setGrade(grade);
    56 c1.setClassName(一班);
    57 Class c2 = new Class();
    58 c2.setClassID(8);
    59 c2.setGrade(grade);
    60 c2.setClassName(二班);
    61
    62 Set set = new HashSet();
    63 set.add(c1);
    64 set.add(c2);
    65
    66 grade.setClasses(set);
    67
    68 session.save(grade);
    69 session.flush();
    70 transaction.commit();
    71 HibernateSessionManager.closeSession();
    72 getClass(4);
    73 }
    74
    75 private static void Grade(int gradeid)
    76 {
    77 Session session = HibernateSessionManager.currentSession();
    78 Transaction transaction = session.beginTransaction();
    79 Grade grade = (Grade)session.get(Grade.class, new Integer(gradeid));
    80 if (grade != null)
    81 {
    82 session.(grade);
    83 session.flush();
    84 }
    85
    86 transaction.commit();
    87
    88 grade = (Grade)session.get(Grade.class, new Integer(gradeid));
    89 if (grade == null)
    90 {
    91 System.out.println(删除成功);
    92 }
    93 HibernateSessionManager.closeSession();
    94 }
    95
    96 private static void Grade1(int gradeid)
    97 {
    98 Session session = HibernateSessionManager.currentSession();
    99 Transaction transaction = session.beginTransaction();
    100 Grade grade = (Grade)session.get(Grade.class, new Integer(gradeid));
    101 if (grade != null)
    102 {
    103 System.out.println(ID: + grade.getGradeID() + ; Name: + grade.getGradeName());
    104 }
    105 grade.setGradeName(Grade + gradeid);
    106 session.save(grade);
    107 session.flush();
    108 transaction.commit();
    109 HibernateSessionManager.closeSession();
    110 getClass(gradeid);
    111 }
    112
    113 private static void Grade2(int gradeid)
    114 {
    115 Session session = HibernateSessionManager.currentSession();
    116 Transaction transaction = session.beginTransaction();
    117 Grade grade = (Grade)session.get(Grade.class, new Integer(gradeid));
    118 if (grade != null)
    119 {
    120 System.out.println(ID: + grade.getGradeID() + ; Name: + grade.getGradeName());
    121 }
    122
    123 Grade newGrade = new Grade();
    124 newGrade.setGradeID(10);
    125 newGrade.setGradeName(grade.getGradeName());
    126 Set set = grade.getClasses();
    127 Set newSet = new HashSet();
    128 Iterator iterator = set.iterator();
    129 while(iterator.hasNext())
    130 {
    131 Class c = (Class)iterator.next();
    132 Class temp = new Class();
    133 temp.setClassID(c.getClassID());
    134 temp.setClassName(c.getClassName());
    135 temp.setGrade(newGrade);
    136 newSet.add(temp);
    137 }
    138 newGrade.setClasses(newSet);
    139 session.(grade);
    140 session.flush();
    141 session.save(newGrade);
    142 session.flush();
    143 transaction.commit();
    144 grade = (Grade)session.get(Grade.class, new Integer(gradeid));
    145 if (grade == null)
    146 {
    147 System.out.println(删除成功);
    148 }
    149 HibernateSessionManager.closeSession();
    150 getClass(10);
    151 }



      按次序调用上方的办法:



    1 getClass(1);
    
    2 getSchedule(1);
    3 Grade();
    4 Grade1(4);
    5 Grade2(4);
    6 Grade(10);


      履行成果如下:



    =====Get Class info=====
    
    Hibernate: grade0_.gradeid as gradeid0_, grade0_.gradename as gradename1_0_ test.grade grade0_ where grade0_.gradeid=?
    Hibernate: classes0_.gradeid as gradeid1_, classes0_.classid as classid1_, classes0_.classid as classid0_, classes0_.classname as classname2_0_, classes0_.gradeid as gradeid2_0_ test.class classes0_ where classes0_.gradeid=?
    年级:一年级包含以放工级:
    一年级二班
    一年级一班
    Hibernate: grade0_.gradeid as gradeid0_, grade0_.gradename as gradename1_0_ test.grade grade0_ where grade0_.gradeid=?
    ID:1; Name:一年级
    Hibernate: classes0_.gradeid as gradeid1_, classes0_.classid as classid1_, classes0_.classid as classid0_, classes0_.classname as classname2_0_, classes0_.gradeid as gradeid2_0_ test.class classes0_ where classes0_.gradeid=?
    一年级一班应用以下教室:
    Hibernate: classrooms0_.classid as classid1_, classrooms0_.classroomid as classroo2_1_, classroom1_.classroomid as classroo1_0_, classroom1_.classroomname as classroo2_4_0_ schedule classrooms0_ inner join test.classroom classroom1_ on classrooms0_.classroomid=classroom1_.classroomid where classrooms0_.classid=?
    教室二
    教室五
    教室一
    一年级二班应用以下教室:
    Hibernate: classrooms0_.classid as classid1_, classrooms0_.classroomid as classroo2_1_, classroom1_.classroomid as classroo1_0_, classroom1_.classroomname as classroo2_4_0_ schedule classrooms0_ inner join test.classroom classroom1_ on classrooms0_.classroomid=classroom1_.classroomid where classrooms0_.classid=?
    教室四
    教室二
    教室六
    Hibernate: class_.classid, class_.classname as classname2_, class_.gradeid as gradeid2_ test.class class_ where class_.classid=?
    Hibernate: class_.classid, class_.classname as classname2_, class_.gradeid as gradeid2_ test.class class_ where class_.classid=?
    Hibernate: into test.grade (gradename, gradeid) values (?, ?)
    Hibernate: into test.class (classname, gradeid, classid) values (?, ?, ?)
    Hibernate: into test.class (classname, gradeid, classid) values (?, ?, ?)
    =====Get Class info=====
    Hibernate: grade0_.gradeid as gradeid0_, grade0_.gradename as gradename1_0_ test.grade grade0_ where grade0_.gradeid=?
    Hibernate: classes0_.gradeid as gradeid1_, classes0_.classid as classid1_, classes0_.classid as classid0_, classes0_.classname as classname2_0_, classes0_.gradeid as gradeid2_0_ test.class classes0_ where classes0_.gradeid=?
    年级:四年级包含以放工级:
    四年级二班
    四年级一班
    Hibernate: grade0_.gradeid as gradeid0_, grade0_.gradename as gradename1_0_ test.grade grade0_ where grade0_.gradeid=?
    ID:4; Name:四年级
    Hibernate: test.grade set gradename=? where gradeid=?
    =====Get Class info=====
    Hibernate: grade0_.gradeid as gradeid0_, grade0_.gradename as gradename1_0_ test.grade grade0_ where grade0_.gradeid=?
    Hibernate: classes0_.gradeid as gradeid1_, classes0_.classid as classid1_, classes0_.classid as classid0_, classes0_.classname as classname2_0_, classes0_.gradeid as gradeid2_0_ test.class classes0_ where classes0_.gradeid=?
    年级:Grade 4包含以放工级:
    Grade 4二班
    Grade 4一班
    Hibernate: grade0_.gradeid as gradeid0_, grade0_.gradename as gradename1_0_ test.grade grade0_ where grade0_.gradeid=?
    ID:4; Name:Grade 4
    Hibernate: classes0_.gradeid as gradeid1_, classes0_.classid as classid1_, classes0_.classid as classid0_, classes0_.classname as classname2_0_, classes0_.gradeid as gradeid2_0_ test.class classes0_ where classes0_.gradeid=?
    Hibernate: classrooms0_.classid as classid1_, classrooms0_.classroomid as classroo2_1_, classroom1_.classroomid as classroo1_0_, classroom1_.classroomname as classroo2_4_0_ schedule classrooms0_ inner join test.classroom classroom1_ on classrooms0_.classroomid=classroom1_.classroomid where classrooms0_.classid=?
    Hibernate: classrooms0_.classid as classid1_, classrooms0_.classroomid as classroo2_1_, classroom1_.classroomid as classroo1_0_, classroom1_.classroomname as classroo2_4_0_ schedule classrooms0_ inner join test.classroom classroom1_ on classrooms0_.classroomid=classroom1_.classroomid where classrooms0_.classid=?
    Hibernate: test.class where classid=?
    Hibernate: test.class where classid=?
    Hibernate: test.grade where gradeid=?
    Hibernate: class_.classid, class_.classname as classname2_, class_.gradeid as gradeid2_ test.class class_ where class_.classid=?
    Hibernate: class_.classid, class_.classname as classname2_, class_.gradeid as gradeid2_ test.class class_ where class_.classid=?
    Hibernate: into test.grade (gradename, gradeid) values (?, ?)
    Hibernate: into test.class (classname, gradeid, classid) values (?, ?, ?)
    Hibernate: into test.class (classname, gradeid, classid) values (?, ?, ?)
    Hibernate: grade0_.gradeid as gradeid0_, grade0_.gradename as gradename1_0_ test.grade grade0_ where grade0_.gradeid=?
    删除成功
    =====Get Class info=====
    Hibernate: grade0_.gradeid as gradeid0_, grade0_.gradename as gradename1_0_ test.grade grade0_ where grade0_.gradeid=?
    Hibernate: classes0_.gradeid as gradeid1_, classes0_.classid as classid1_, classes0_.classid as classid0_, classes0_.classname as classname2_0_, classes0_.gradeid as gradeid2_0_ test.class classes0_ where classes0_.gradeid=?
    年级:Grade 4包含以放工级:
    Grade 4一班
    Grade 4二班
    Hibernate: grade0_.gradeid as gradeid0_, grade0_.gradename as gradename1_0_ test.grade grade0_ where grade0_.gradeid=?
    Hibernate: classes0_.gradeid as gradeid1_, classes0_.classid as classid1_, classes0_.classid as classid0_, classes0_.classname as classname2_0_, classes0_.gradeid as gradeid2_0_ test.class classes0_ where classes0_.gradeid=?
    Hibernate: classrooms0_.classid as classid1_, classrooms0_.classroomid as classroo2_1_, classroom1_.classroomid as classroo1_0_, classroom1_.classroomname as classroo2_4_0_ schedule classrooms0_ inner join test.classroom classroom1_ on classrooms0_.classroomid=classroom1_.classroomid where classrooms0_.classid=?
    Hibernate: classrooms0_.classid as classid1_, classrooms0_.classroomid as classroo2_1_, classroom1_.classroomid as classroo1_0_, classroom1_.classroomname as classroo2_4_0_ schedule classrooms0_ inner join test.classroom classroom1_ on classrooms0_.classroomid=classroom1_.classroomid where classrooms0_.classid=?
    Hibernate: test.class where classid=?
    Hibernate: test.class where classid=?
    Hibernate: test.grade where gradeid=?
    Hibernate: grade0_.gradeid as gradeid0_, grade0_.gradename as gradename1_0_ test.grade grade0_ where grade0_.gradeid=?
    删除成功


      同样,履行成果中包含了各个SQL语句。


      iBatis


      iBatis是别的一种ORM框架,和Hibernate善于操纵单笔记录不合,iBatis是基于SQL模板的,可以说,iBatis每次和数据库进行操纵时,都有明白的SQL语句,而这些SQL语句,就是我们定义在设备文件中的。


      我们还是以test数据库中的user表为例,简单申明iBatis的操纵流程:


      起首,我们还是须要定义VO对象,这里还是应用和Hibernate讲解时雷同的User:


    定义User对象

     1 package sample.orm.ibatis;
    
    2
    3 import java.io.Serializable;
    4
    5 public class User implements Serializable
    6 {
    7 private static final long serialVersionUID = 1L;
    8 private int userID;
    9 private String userName;
    10 public void setUserID(int userID) {
    11 this.userID = userID;
    12 }
    13 public int getUserID() {
    14 return userID;
    15 }
    16 public void setUserName(String userName) {
    17 this.userName = userName;
    18 }
    19 public String getUserName() {
    20 return userName;
    21 }
    22
    23 }



      然后须要针对这个VO,定义一个自力的设备文件:User.xml



     1 <?xml version=1.0 encoding=UTF-8?>
    
    2 <!DOCTYPE sqlMap
    3 PUBLIC -//iBATIS.com//DTD SQL Map 2.0//EN
    4 http://www.ibatis.com/dtd/sql-map-2.dtd>
    5
    6 <sqlMap namespace=User>
    7
    8 <typeAlias alias=user type=sample.orm.ibatis.User />
    9
    10
    11 <cacheModel id=user-cache type=OSCache readOnly=true serialize=true>
    12 <flushInterval milliseconds=1 />
    13 <flushOnute statement=User />
    14 <flushOnute statement=User />
    15 <flushOnute statement=getUser />
    16 <flushOnute statement=getAllUser />
    17 <property value=1 name=size />
    18 </cacheModel>
    19
    20 <!--
    21 <resultMap >
    22 <result property=userID column=id />
    23 <result property=userName column=name />
    24 </resultMap>
    25 -->
    26
    27
    28 < id=getUser parameterClass=java.lang.Integer resultClass=user cacheModel=user-cache >
    29 id as userID,name as userName user where id = #userID#
    30 </>
    31 < id=getAllUser resultClass=user cacheModel=user-cache>
    32 id as userID,name as userName user
    33 </>
    34 < id=User parameterClass=user>
    35 user SET name=#userName# WHERE id = #userID#
    36 </>
    37 < id=User parameterClass=user>
    38 into user ( id, name ) VALUES ( #userID#,#userName#)
    39 </>
    40 < id=User parameterClass=java.lang.Integer>
    41 user where id=#userID#
    42 </>
    43
    44 </sqlMap>


      这个设备文件首要包含三项目组:


      1)缓存的设备


      2)对象属性和表字段之间的接洽关系


      3)针对表的各类CRUD操纵


      然后是关于iBatis的全局设备文件SqlMapConfig.xml:



     1 <?xml version=1.0 encoding=UTF-8?>
    
    2 <!DOCTYPE sqlMapConfig
    3 PUBLIC -//iBATIS.com//DTD SQL Map Config 2.0//EN
    4 http://www.ibatis.com/dtd/sql-map-config-2.dtd>
    5
    6 <sqlMapConfig>
    7
    8 <settings cacheModelsEnabled=true enhancementEnabled=true
    9 lazyLoadingEnabled=true errorTracingEnabled=true maxRequests=32
    10 maxSessions=10 maxTransactions=5 useStatementNamespaces=false />
    11
    12 <transactionManager type=JDBC>
    13 <dataSource type=SIMPLE>
    14 <property name=JDBC.Driver value=com.mysql.jdbc.Driver />
    15 <property name=JDBC.ConnectionURL value=jdbc:mysql://localhost/test />
    16 <property name=JDBC.Username value=root />
    17 <property name=JDBC.Password value=123 />
    18 <property name=Pool.MaximumActiveConnections value=10 />
    19 <property name=Pool.MaximumIdleConnections value=5 />
    20 <property name=Pool.MaximumCheckoutTime value=120000 />
    21 <property name=Pool.TimeToWait value=500 />
    22 <property name=Pool.PingQuery value= 1 user />
    23 <property name=Pool.PingEnabled value=false />
    24 </dataSource>
    25 </transactionManager>
    26
    27 <sqlMap resource=sample/orm/ibatis/User.xml />
    28
    29 </sqlMapConfig>


      和Hibernate全局设备文件类似,它也包含了数据库连接的信息、数据库连接池的信息以及我们定义的User.xml。


      下面是测试办法:


    iBatis测试办法

      1 public class Sample {
    
    2
    3 private SqlMapClient sqlMap = null;
    4
    5 private void buildMap() throws IOException
    6 {
    7 String resource = sample/orm/ibatis/SqlMapConfig.xml;
    8 Reader reader = Resources.getResourceAsReader(resource);
    9 this.sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
    10 }
    11
    12 private void User() throws IOException, SQLException
    13 {
    14 System.out.println(=====Insert test=====);
    15 ifthis.sqlMap == null
    16 {
    17 this.buildMap();
    18 }
    19 this.sqlMap.startTransaction();
    20 User user = new User();
    21 user.setUserID(10);
    22 user.setUserName(Angel);
    23
    24 this.sqlMap.(User, user);
    25 this.sqlMap.commitTransaction();
    26
    27 user = getUser(10);
    28 printUserInfo(user);
    29 }
    30
    31 private void User() throws IOException, SQLException, InterruptedException
    32 {
    33 System.out.println(=====Update test=====);
    34 ifthis.sqlMap == null
    35 {
    36 this.buildMap();
    37 }
    38 this.sqlMap.startTransaction();
    39 User user = new User();
    40 user.setUserID(10);
    41 user.setUserName(Devil);
    42 this.sqlMap.(User, user);
    43 this.sqlMap.commitTransaction();
    44 this.sqlMap.flushDataCache();
    45 // Thread.sleep(3000);
    46 user = getUser(10);
    47 printUserInfo(user);
    48 }
    49
    50 private void User() throws IOException, SQLException
    51 {
    52 System.out.println(=====Delete test=====);
    53 ifthis.sqlMap == null
    54 {
    55 this.buildMap();
    56 }
    57 sqlMap.flushDataCache();
    58 this.sqlMap.startTransaction();
    59 this.sqlMap.(User, 10);
    60 this.sqlMap.commitTransaction();
    61 getAllUser();
    62 }
    63
    64 private User getUser(int id) throws IOException, SQLException
    65 {
    66 ifthis.sqlMap == null
    67 {
    68 this.buildMap();
    69 }
    70 User user = (User)this.sqlMap.openSession().queryForObject(getUser, id);
    71
    72 return user;
    73 }
    74
    75 private List<User> getAllUser() throws IOException, SQLException
    76 {
    77 ifthis.sqlMap==null
    78 this.buildMap();
    79
    80 List userList=null;
    81 userList=this.sqlMap.openSession().queryForList(getAllUser);
    82 printUserInfo(userList);
    83 return userList;
    84 }
    85
    86 private void printUserInfo(User user)
    87 {
    88 System.out.println(=====user info=====);
    89 System.out.println(ID: + user.getUserID() + ;Name: + user.getUserName());
    90 }
    91
    92 private void printUserInfo(List<User> users)
    93 {
    94 System.out.println(=====user info=====);
    95 for(User user:users)
    96 {
    97 System.out.println(ID: + user.getUserID() + ;Name: + user.getUserName());
    98 }
    99 }
    100
    101 public static void main(String[] args) throws IOException, SQLException, InterruptedException
    102 {
    103 Sample sample = new Sample();
    104 sample.getAllUser();
    105 sample.User();
    106 sample.User();
    107 sample.User();
    108 }
    109 }



      它的履行成果如下:



    =====user info=====
    
    ID:
    1;Name:Zhang San
    ID:
    2;Name:TEST
    =====Insert test=====
    =====user info=====
    ID:
    10;Name:Angel
    =====Update test=====
    =====user info=====
    ID:
    10;Name:Devil
    =====Delete test=====
    =====user info=====
    ID:
    1;Name:Zhang San
    ID:
    2;Name:TEST


      这篇文章只是简单介绍了Hibernate和iBatis的用法,并没有涉及全部,例如Hibernate的事务、阻碍、HQL、iBatis的缓存等等。这里主如果为了描述ORM框架的根蒂根基轮廓,以及在应用体式格式上它和JDBC的差别。

    我俩之间有着强烈的吸引力。短短几个小时后,我俩已经明白:我们的心是一个整体的两半,我俩的心灵是孪生兄妹,是知己。她让我感到更有活力,更完美,更幸福。即使她不在我身边,我依然还是感到幸福,因为她总是以这样或者那样的方式出现在我心头。——恩里克·巴里奥斯《爱的文明》
    分享到: