struts-2.3.1+spring-framework-3.2.2+hibernate-4.1.1整合历程<第二部分>(详解)

第一部分讲解了Struts2的建立过程,这部分将在其基础上完成Hibernate的整合。

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。

 步骤一:解压hibernate-release-4.1.1.Final.zip,然后到hibernate-release-4.1.1.Final\lib\required文件夹下将所有的jar包拷贝到项目所在的lib文件夹下,效果图如图1所示:


                  图1

  其中相应的jar包以及作用如下所示:

jar包(.jar)

作用

antlr-2.7.7
语言转换工具,hibernate利用它实现HQL到SQL的转换
dom4j-1.6.1
对dom4j的封装,解析xml文件
hibernate-commons-annotations-4.0.1.Final
常见的反射代码用于支持注解处理
hibernate-core-4.1.1.Final
Hibernate的核心代码
hibernate-jpa-2.0-api-1.0.1.Final
用来定义Hibernate持久性
javassist-3.15.0-GA
一个开源的分析、编辑和创建Java字节码的类库
jboss-logging-3.1.0.GA
Jboss的日志框架
jboss-transaction-api_1.1_spec-1.0.0.Final
Jboss事务处理
    其中的javassist-3.15.0-GA与Struts2中javassist-3.11.0-GA冲突,可以将低版本删除(这里不删除本文的搭建也没有异常抛出,但建议删除低版本的jar包)
    步骤二:拷贝hibernate-release-4.1.1.Final\project\etc文件夹下hibernate.cfg.xml文件到项目src目录下,然后进行更改,具体的项目结构如图2所示:


                   图2

  对配置文件hibernate.cfg.xml进行更改,如下所示:

  hibernate.cfg.xml

  1. <!DOCTYPE hibernate-configuration PUBLIC  
  2.     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
  3.     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">  
  4.   
  5. <hibernate-configuration>  
  6.     <session-factory>  
  7.         <!-- mysql连接驱动,需要导入mysql驱动jar包 -->  
  8.         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>  
  9.         <!-- mysql数据库连接地址 -->  
  10.         <property name="connection.url">jdbc:mysql://localhost/steven</property>  
  11.         <!-- 数据库用户名 -->  
  12.         <property name="connection.username">root</property>  
  13.         <!-- 数据库密码 -->  
  14.         <property name="connection.password">mysqladmin</property>  
  15.         <!-- 数据库方言 -->  
  16.         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>  
  17.         <!-- 显示sql语句 -->  
  18.         <property name="show_sql">true</property>  
  19.         <!-- 格式化sql语句 -->  
  20.         <property name="format_sql">true</property>  
  21.   
  22.         <!-- 加载hibernate自动更新数据库结构 -->  
  23.         <property name="hbm2ddl.auto">update</property>  
  24.   
  25.         <!-- 映射实体类 -->  
  26.         <mapping class="com.steven.entity.User" />  
  27.     </session-factory>  
  28. </hibernate-configuration>  
    在这个过程中将用到数据库,本文采用Mysql5.0进行操作,具体的安装步骤将不再给出,可以参照http://blog.csdn.net/digyso888/article/details/3552981文章进行配置。

 打开命令提示符,连接Mysql,创建数据库steven,如图3所示:


                           图3

 注:本文Hibernate映射采用全注解方式使用,首先,注解方式简单,灵活,简洁,其次在开发中在有源代码的情况下使用较多,建议使用注解方式。


 由于在hibernate.cfg.xml配置文件中已经配置映射实体类User.java,下面给出添加注解后的实体类

 User.java

  1. package com.steven.entity;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import javax.persistence.Entity;  
  6. import javax.persistence.GeneratedValue;  
  7. import javax.persistence.Id;  
  8. import javax.persistence.Table;  
  9.   
  10. /** 
  11.  * 实体类 
  12.  *  
  13.  * @author Steven 
  14.  *  
  15.  */  
  16. // 标示这个类为映射实体类  
  17. @Entity  
  18. // 改变数据库中映射表的名称,不加默认表名称为类名即User  
  19. @Table(name = "t_user")  
  20. public class User {  
  21.     // 用户Id  
  22.     private int userId;  
  23.     // 用户名  
  24.     private String userName;  
  25.     // 用户年龄  
  26.     private int age;  
  27.     // 用户生日  
  28.     private Date birthday;  
  29.     // 用户是否是会员 true:是 false:不是  
  30.     private boolean isVip;  
  31.   
  32.     public User() {  
  33.     }  
  34.   
  35.     // 有参构造  
  36.     public User(String userName, int age, Date birthday, boolean isVip) {  
  37.         this.userName = userName;  
  38.         this.age = age;  
  39.         this.birthday = birthday;  
  40.         this.isVip = isVip;  
  41.     }  
  42.   
  43.     // 标识此字段为数据库中的主键  
  44.     @Id  
  45.     // 标识此字段为数据库中成序列增长的列,不同的数据库,Hibernate会自动匹配  
  46.     @GeneratedValue  
  47.     public int getUserId() {  
  48.         return userId;  
  49.     }  
  50.   
  51.     public void setUserId(int userId) {  
  52.         this.userId = userId;  
  53.     }  
  54.   
  55.     public String getUserName() {  
  56.         return userName;  
  57.     }  
  58.   
  59.     public void setUserName(String userName) {  
  60.         this.userName = userName;  
  61.     }  
  62.   
  63.     public int getAge() {  
  64.         return age;  
  65.     }  
  66.   
  67.     public void setAge(int age) {  
  68.         this.age = age;  
  69.     }  
  70.   
  71.     public Date getBirthday() {  
  72.         return birthday;  
  73.     }  
  74.   
  75.     public void setBirthday(Date birthday) {  
  76.         this.birthday = birthday;  
  77.     }  
  78.   
  79.     public boolean getIsVip() {  
  80.         return isVip;  
  81.     }  
  82.   
  83.     public void setIsVip(boolean isVip) {  
  84.         this.isVip = isVip;  
  85.     }  
  86.   
  87.     @Override  
  88.     public String toString() {  
  89.         return "用户信息: [年龄是" + this.getAge() + ", 生日是" + this.getBirthday()  
  90.                 + ", 用户编号是" + this.getUserId() + ", 用户名是" + userName  
  91.                 + isVip(this.getIsVip()) + "]";  
  92.     }  
  93.   
  94.     /** 
  95.      * 用来进行测试使用 
  96.      *  
  97.      * @param isVip 
  98.      * @return 
  99.      */  
  100.     public String isVip(boolean isVip) {  
  101.         return ", " + (isVip == true ? "是" : "不是") + "会员";  
  102.     }  
  103.   
  104. }  


 然后建立测试类,首先建立一个Source Folder,用来存放所有的测试代码,点击项目名称,右键New—>Source Folder,如图4所示:


                          图4

点击Finish,完成创建,然后,创建包com.steven.test,创建后的目录结构如图5所示:


            图5

下面将创建JUnit Test Case,点击包名com.steven.test,右键New->Other,弹出New选项窗口,选择JUnit Test Case,如图6所示:


                          图6

点击Next进入下一步,然后如图7所示进行选择和填写,


                        图7

点击Finish,弹出如图8所示的窗口,点击OK完成创建,


                         图8

此时项目结构图如图9所示:


             图9

打开HibernateTest.java,然后更改代码如下所示:

HibernateTest.java

  1. package com.steven.test;  
  2.   
  3. import org.hibernate.cfg.Configuration;  
  4. import org.hibernate.tool.hbm2ddl.SchemaExport;  
  5. import org.junit.Test;  
  6.   
  7. /** 
  8.  * Hibernate测试类 
  9.  *  
  10.  * @author Steven 
  11.  *  
  12.  */  
  13. public class HibernateTest {  
  14.     // JUnit注解,可以通过此进行测试  
  15.     @Test  
  16.     /** 
  17.      * 测试1,自动创建数据表,因为在配置文件Hibernate.cfg.xml中配置了<property name="hbm2ddl.auto">update</property> 
  18.      */  
  19.     public void testSchemaExport() {  
  20.         new SchemaExport(new Configuration().configure()).create(truetrue);  
  21.     }  
  22. }  

接着进行测试,选中要测试的方法,右击Run As->JUnit Test,此时控制台会发现出现异常信息,

  1. ERROR: HHH000231: Schema export unsuccessful  
  2. org.hibernate.HibernateException: Specified JDBC Driver com.mysql.jdbc.Driver class not found  
  3.     at org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:104)  
  4.     at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)  
  5.     at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)  
  6.     at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)  
  7.     at org.hibernate.tool.hbm2ddl.ManagedProviderConnectionHelper.prepare(ManagedProviderConnectionHelper.java:55)  
  8.     at org.hibernate.tool.hbm2ddl.DatabaseExporter.<init>(DatabaseExporter.java:52)  
  9.     at org.hibernate.tool.hbm2ddl.SchemaExport.execute(SchemaExport.java:368)  
  10.     at org.hibernate.tool.hbm2ddl.SchemaExport.create(SchemaExport.java:305)  
  11.     at org.hibernate.tool.hbm2ddl.SchemaExport.create(SchemaExport.java:294)  
  12.     at com.steven.test.HibernateTest.testSchemaExport(HibernateTest.java:20)  
  13.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  14.     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  
  15.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
  16.     at java.lang.reflect.Method.invoke(Method.java:597)  
  17.     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)  
  18.     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)  
  19.     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)  
  20.     at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)  
  21.     at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)  
  22.     at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)  
  23.     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73)  
  24.     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)  
  25.     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)  
  26.     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)  
  27.     at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)  
  28.     at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)  
  29.     at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)  
  30.     at org.junit.runners.ParentRunner.run(ParentRunner.java:220)  
  31.     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)  
  32.     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)  
  33.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)  
  34.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)  
  35.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)  
  36.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)  
  37. Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver  
  38.     at java.net.URLClassLoader$1.run(URLClassLoader.java:200)  
  39.     at java.security.AccessController.doPrivileged(Native Method)  
  40.     at java.net.URLClassLoader.findClass(URLClassLoader.java:188)  
  41.     at java.lang.ClassLoader.loadClass(ClassLoader.java:307)  
  42.     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)  
  43.     at java.lang.ClassLoader.loadClass(ClassLoader.java:252)  
  44.     at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)  
  45.     at java.lang.Class.forName0(Native Method)  
  46.     at java.lang.Class.forName(Class.java:169)  
  47.     at org.hibernate.internal.util.ReflectHelper.classForName(ReflectHelper.java:192)  
  48.     at org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:101)  
  49.     ... 33 more  
  50. 2013-12-10 19:26:52 org.hibernate.tool.hbm2ddl.SchemaExport execute  
  51. INFO: HHH000230: Schema export complete  

 Specified JDBC Driver com.mysql.jdbc.Driver class not found, 原因是因为没有导入Mysql的驱动包,此时需要加入mysql-connector-java-5.1.7-bin.jar(http://pan.baidu.com/s/1efRMV)到lib下,此时再次执行测试方法,会发现控制台出现以下信息

  1. …………………………………………………………  
  2. INFO: HHH000046: Connection properties: {user=root, password=****}  
  3.   
  4.     drop table if exists t_user  
  5.   
  6.     create table t_user (  
  7.         userId integer not null auto_increment,  
  8.         age integer not null,  
  9.         birthday datetime,  
  10.         isVip boolean not null,  
  11.         userName varchar(255),  
  12.         primary key (userId)  
  13.     )  
  14. 2013-12-10 19:37:59 org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop  
  15. INFO: HHH000030: Cleaning up connection pool [jdbc:mysql://localhost/steven]  
  16. 2013-12-10 19:37:59 org.hibernate.tool.hbm2ddl.SchemaExport execute  
  17. INFO: HHH000230: Schema export complete  
在观察数据库,会发现数据表t_user已经被创建,如图10所示:


                                   图10

 数据表t_user已经创建,并且所有的字段,类型,包括主键和序列增长都已经被创建,这就是Hibernate带来的好处,但是很多类型都是Hibernate默认创建的,如果想自己定义也是可以通过注解的方式更改,在此没有给出,有兴趣的可以参照其他博文进行学习。

 注:在开发过程中是先写实体类还是先建表,面向对象标准开发流程推荐第一种方法,但实际开发中大部分是第二种,主要是因为在表里设置外键比在类里写关联属性要简单,使得不熟悉Hibernate的人用第二种也可以轻松的建立好mapping,而且更加灵活的创建表结构。

 此时就可以测试数据库的增删改查的方法了,为了方便测试,可以为Hibernate封装一个Util类(这个类可以在Hibernate的参考文档中找到),专门用来对Session的获取(也就相当于JDBC中连接的概念),此时项目结构如图11所示:


           图11

HibernateUtil.java内容如下:

  1. package com.steven.util;  
  2.   
  3. import org.hibernate.Session;  
  4. import org.hibernate.SessionFactory;  
  5. import org.hibernate.cfg.Configuration;  
  6. import org.hibernate.service.ServiceRegistry;  
  7. import org.hibernate.service.ServiceRegistryBuilder;  
  8.   
  9. /** 
  10.  * 创建Hibernate工具类 
  11.  *  
  12.  * @author Steven 
  13.  *  
  14.  */  
  15. public class HibernateUtil {  
  16.     // Session 工厂  
  17.     private static SessionFactory factory;  
  18.   
  19.     static {  
  20.         Configuration cfg = new Configuration().configure();  
  21.         ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(  
  22.                 cfg.getProperties()).buildServiceRegistry();  
  23.         factory = cfg.buildSessionFactory(sr);  
  24.         // 已经过时(主要出现在Hibernate3.x版本)  
  25.         // factory = new  
  26.         // AnnotationConfiguration().configure().buildSessionFactory();  
  27.     }  
  28.   
  29.     public static SessionFactory getSessionFactory() {  
  30.         return factory;  
  31.     }  
  32.   
  33.     public static Session getSession() {  
  34.         return factory.openSession();  
  35.     }  
  36.   
  37.     public static void closeSession(Session session) {  
  38.         if (session != null) {  
  39.             if (session.isOpen()) {  
  40.                 session.close();  
  41.             }  
  42.         }  
  43.     }  
  44. }  

    此时进行创建表数据的测试,在HibernateTest.java中添加如下代码:

  1. @Test  
  2.     /** 
  3.      * 测试2,用来测试创建表数据 
  4.      */  
  5.     public void testCreate() {  
  6.         User u1 = new User("Steven"1new Date(), true);  
  7.         Session session = HibernateUtil.getSession();  
  8.         session.beginTransaction();  
  9.         session.save(u1);  
  10.         session.getTransaction().commit();  
  11.         HibernateUtil.closeSession(session);  
  12.     }  

然后一样进行JUnit测试,运行后控制台输出信息:

  1. Hibernate:   
  2.     insert   
  3.     into  
  4.         t_user  
  5.         (age, birthday, isVip, userName)   
  6.     values  
  7.         (?, ?, ?, ?)  

在查看数据库,发现增加了一条数据,如图12所示:


                         图12

 这样可以确定Hibernate整合已经没有问题了,下面就可以进行具体的Hibernate对数据库增删改查操作的封装,因为在开发过程中会有着很多不同的项目结构层次,但为了便于学习,一般情况下可以分为entity(实体类层),dao(数据访问对象层),service(业务层,主要可以通过Spring进行事物处理(稍后讲解)),action(执行层),有时候用到的工具包可以放在util包下,这样就可以基本架构整个项目的层次,比如在有些时候可以用到dto(数据传输对象层),都是很常见的,所以开发过程中需要具体问题具体分析,本文不需要那么复杂,仅仅在于搭建框架,可以让初学者迅速掌握搭建框架中的流程以及注意事项就可以了,以后的深入讨论,我会有其他的博文讲解,下面继续进行框架的搭建。

具体的架构呈现会在整合Spring时候完全给出,暂时的架构如图13所示:


           图13

此时具体的类的内容如下:

IBaseDao.java

  1. package com.steven.dao.iface;  
  2.   
  3. import java.util.List;  
  4.   
  5. /** 
  6.  * 将常用的数据库增删改查进行封装 
  7.  *  
  8.  * @author Steven 
  9.  *  
  10.  * @param <T> 
  11.  */  
  12. public interface IBaseDao<T> {  
  13.     /** 
  14.      * 保存对象 
  15.      *  
  16.      * @param t 
  17.      * @return 
  18.      */  
  19.     public void insert(T t);  
  20.   
  21.     /** 
  22.      * 删除对象 
  23.      *  
  24.      * @param t 
  25.      * @return 
  26.      */  
  27.     public void delete(T t);  
  28.   
  29.     /** 
  30.      * 更新对象 
  31.      *  
  32.      * @param t 
  33.      * @return 
  34.      */  
  35.     public void update(T t);  
  36.   
  37.     /** 
  38.      * 根据Id查找单个对象 
  39.      *  
  40.      * @param id 
  41.      * @return 
  42.      */  
  43.     public T getById(int id);  
  44.   
  45.     /** 
  46.      * 查询对象集合 
  47.      *  
  48.      * @return 
  49.      */  
  50.     public List<T> getAll();  
  51. }  

IUserDao.java

  1. package com.steven.dao.iface;  
  2.   
  3. import com.steven.entity.User;  
  4.   
  5. /** 
  6.  * 用来继承接口,如果有个别自己的方法可以在此进行添加 
  7.  *  
  8.  * @author Steven 
  9.  *  
  10.  */  
  11. public interface IUserDao extends IBaseDao<User> {  
  12.   
  13. }  

UserDao.java

  1. package com.steven.dao.impl;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.hibernate.Query;  
  6. import org.hibernate.Session;  
  7.   
  8. import com.steven.dao.iface.IUserDao;  
  9. import com.steven.entity.User;  
  10. import com.steven.util.HibernateUtil;  
  11.   
  12. /** 
  13.  * 主要对方法进行编写,在这里主要实现了增加和查询所有的方法,其他的没有实现,在整合Spring过程中会进行再次的封装,到时候会编写所有的方法 
  14.  *  
  15.  * @author Steven 
  16.  *  
  17.  */  
  18.   
  19. public class UserDao implements IUserDao {  
  20.   
  21.     public void delete(User t) {  
  22.         // TODO Auto-generated method stub  
  23.   
  24.     }  
  25.   
  26.     @SuppressWarnings("unchecked")  
  27.     public List<User> getAll() {  
  28.         Session sesson = HibernateUtil.getSession();  
  29.         // 由于Hibernate4已经没有了HibernateSupport和HibernateTemplate这两个辅助类,可以通过以下实现,  
  30.         Query query = sesson.createQuery("from User");  
  31.         return (List<User>) query.list();  
  32.     }  
  33.   
  34.     public User getById(int id) {  
  35.         // TODO Auto-generated method stub  
  36.         return null;  
  37.     }  
  38.   
  39.     public void insert(User t) {  
  40.         Session session = HibernateUtil.getSession();  
  41.         session.beginTransaction();  
  42.         session.save(t);  
  43.         session.getTransaction().commit();  
  44.         HibernateUtil.closeSession(session);  
  45.     }  
  46.   
  47.     public void update(User t) {  
  48.         // TODO Auto-generated method stub  
  49.   
  50.     }  
  51.   
  52. }  

   此时可以将UserAction.java更改成如下代码:

UserAction.java

  1. package com.steven.action;  
  2.   
  3. import java.util.Date;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6.   
  7. import org.apache.struts2.interceptor.RequestAware;  
  8.   
  9. import com.opensymphony.xwork2.ActionSupport;  
  10. import com.steven.dao.impl.UserDao;  
  11. import com.steven.entity.User;  
  12.   
  13. /** 
  14.  * 通过继承ActionSupport获得Struts2的已有功能, 
  15.  * 通过实现RequestAware获取request(这种方式常用,还有其他三种方式,这里不再赘述) 
  16.  * 四种获取request方式请参照http://blog.csdn.net/ms2146/article/details/5406004 
  17.  *  
  18.  * @author Steven 
  19.  *  
  20.  */  
  21. public class UserAction extends ActionSupport implements RequestAware {  
  22.     private static final long serialVersionUID = 1L;  
  23.     private Map<String, Object> request;  
  24.     private UserDao userDao = new UserDao();  
  25.   
  26.     @Override  
  27.     public String execute() throws Exception {  
  28.         userDao.insert(new User("Lily"1new Date(), false));  
  29.         userDao.insert(new User("Tom"1new Date(), false));  
  30.         // 创建一个用户集合  
  31.         List<User> userList = userDao.getAll();  
  32.         // 创建用户并添加到用户集合中  
  33.         // userList.add(new User("Steven", 1, new Date(), true));  
  34.         // userList.add(new User("Lily", 1, new Date(), false));  
  35.         // userList.add(new User("Tom", 1, new Date(), false));  
  36.   
  37.         // 将用户存储到ActionContext中(可以通过ognl表达式获取)  
  38.         request.put("userList", userList);  
  39.         return SUCCESS;  
  40.     }  
  41.   
  42.     public void setRequest(Map<String, Object> request) {  
  43.         this.request = request;  
  44.     }  
  45.   
  46. }  

    此时在启动Tomcat,在浏览器输入http://localhost:8080/SSH,如图14所示:


                        图14

运行结果如图15所示:


                        图15

此时控制台输出信息如下所示:

  1. …………………………………………  
  2. Hibernate:   
  3.     insert   
  4.     into  
  5.         t_user  
  6.         (age, birthday, isVip, userName)   
  7.     values  
  8.         (?, ?, ?, ?)  
  9. Hibernate:   
  10.     insert   
  11.     into  
  12.         t_user  
  13.         (age, birthday, isVip, userName)   
  14.     values  
  15.         (?, ?, ?, ?)  
  16. Hibernate:   
  17.     select  
  18.         user0_.userId as userId0_,  
  19.         user0_.age as age0_,  
  20.         user0_.birthday as birthday0_,  
  21.         user0_.isVip as isVip0_,  
  22.         user0_.userName as userName0_   
  23.     from  
  24.         t_user user0_  

    因此可以看出所有的操作都是通过Hibernate操作数据库的,然后通过Struts将获得的用户集合显示到页面中,所以在这个过程中,Hibernate起到的作用仅仅是对数据库的操作,而且Hibernate可以不要依靠Tomcat运行就可以使用,而Struts2主要负责接收处理数据,进行操作后然后返回到页面中呈现,典型的MVC,而且Struts依靠Tomcat的运行。

如图16所示,可以查看到数据库中的数据:


                           图16

 注:在此,Struts2和Hibernate的简单整合已经实现,下面将进行Spring的整合,而Spring又是SSH中用到的最多而且最重要的框架之一,所以在Spring整合中我将重点讲解器IOC,AOP所代表的含义,具体的会通过例子讲解,当然到时候层次架构会发生改变,而且Dao实现会完成企业级应用的封装,到时候会改变Dao的实现方式,在此一样恭祝大家学习愉快。

转至:http://blog.csdn.net/songdeitao/article/details/17226523

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值