• 整合struts2+hibernate详细配置步骤及注意事项


    刚刚学完这两个框架,就迫不及待的做了一个例子,在整合两个框架的时候,也碰到了一些小问题,下面介绍一下配置的步骤:

    1.创建一个自定义的struts2和hibernate的类库

      因为之前写例子都是直接将jar包拖到WEB-INF下的lib包下,但是这里需要导入两个框架的jar包,放在一起的话,会很乱,所以最好是创建自定义的类库:

        1.window->Preferecces->Java->BuildPath->UserLibraries->new.

          

          以struts2的类库为例,输入struts2-core,点击ok.选中该文件,点击Add External JARs..,找到struts2的核心jar包,全部放进来.完成后点击ok.

          

      hibernate的jar包,步骤同上.

    2.导入struts和hibernate的jar包.

      新建一个Web project,选中当前工程,右键选择最下方的Propertie->Java buildPath->Libraries->Add Libraries->User Libraries.

              

    找到你之前建好的类库,导入即可.

    3.配置web.xml.

      在web.xml中添加struts2的核心过滤器:

    复制代码
      <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    复制代码

    4.src目录下创建struts.xml.

    复制代码
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
        <package name="default" namespace="/" extends="struts-default">
        

    </package> </struts>
    复制代码

    5.src目录下创建并配置hibernate.cfg.xml:

    复制代码
    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
        <session-factory>
            <!-- 配置数据库连接信息 -->
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="connection.url">jdbc:mysql:///hibernate</property>
            <property name="connection.username">root</property>
            <property name="connection.password">123</property>
            <!-- 配置数据库方言 -->
            <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
            <property name="show_sql">true</property>
            <property name="format_sql">true</property>
            <property name="hbm2ddl.auto">update</property>
            <!-- 使用getCurrentSession方式打开会话 -->
            <property name="hibernate.current_session_context_class">thread</property>
        </session-factory>
    </hibernate-configuration>
    复制代码

    到这里,环境已经配置好了,接下来就可以享受框架带来的便利了

    下面关于hibernate的介绍也比较相信,对于初入门的同学很有帮助。

    Hibernate介绍

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 

    官网  http://hibernate.org/ 

    以下为其原理和基本的结构示意图

    一步一步简单讲述其基本应用

    1、创建java项目,添加hibernate引用

    下载地址:

    https://sourceforge.net/projects/hibernate/files/hibernate-orm/

    下载的完整版本,直接在lib/required中的jar包导入

    2、导入数据库连接器

    我使用的是Mysql数据库,大家可以在以下下载,然后导入连接器

    http://dev.mysql.com/downloads/connector/j/

     

    3、创建数据表

    create table students(
        id int primary key not null,
        name nvarchar(50),
        age int
    )

    4、创建实体类

    建议实体类符合JavaBean标准,字段、get、set方法,还有默认构造函数。

    复制代码
    package yank.hibernate.sample;
    
    /**
     * 学生信息
     * @author yank
     *
     */
    public class Student {
        private Integer id;
        private String name;
        private Integer age;
        
        /**
         * 无参构造函数
         */
        public Student(){
            
        }
        
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Integer getAge() {
            return age;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
    }
    复制代码

     

    5、配置实体与表的映射关系

    非持久化的属性,不要在这里声明。这里的type并非java的类型或者sql的类型,而是hibernate定义的映射类型,如果未设置,hibernate会自动给一合适的类型。

    最好安装hibernate的eclipse插件,可能更方便点

    http://marketplace.eclipse.org/content/hibernate-tools-helios

    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC  
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
     
    <!-- 映射 -->
    <hibernate-mapping package="yank.hibernate.sample">    
        <class name="Student" table="students">  
            <id name="id" column="id">  
                <generator class="increment" /> <!-- 标识符生成策略 --> 
            </id>  
            <property name="name" type="string" column="name" />  
            <property name="age" type="int" column="age" />  
        </class>    
    </hibernate-mapping> 
    复制代码

    这里的类型,应该是Hibernate-Types,这样可以实现JAVA类型与数据库类型的转换。如果没有找到匹配类型,Hibernate会自动判定给一合适类型。

    注意:使用最后一列(Registry Key)的值即可。

    6、创建hibernate的配置文件

    这里就需要配置hibernate如何访问数据库,包括连接驱动,连接地址、用户名、密码,连接池大小等。并且在这里将配置映射文件

    文件创建在srv根目录下。

    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory>
            <!-- 数据库连接相关 -->
            <property name="myeclipse.connection.profile">mysql</property>    
            <property name="connection.url">    
                jdbc:mysql://localhost:3306/test     
            </property>    
            <property name="connection.username">root</property>    
            <property name="connection.password">admin</property>    
            <property name="connection.driver_class">    
                com.mysql.jdbc.Driver     
            </property>    
            <property name="dialect">    
                org.hibernate.dialect.MySQLDialect     
            </property>    
            <property name="show_sql">true</property>    
            
            <!-- 映射资源 --> 
            <mapping resource="yank/hibernate/sample/student.hbm.xml" /> 
        </session-factory>
    </hibernate-configuration>
    复制代码

    SessionFactory- 一个关联于特定数据库全局性的工厂(factory)。如果你要使用多个数据库,通常应该在多个配置文件中使用多个<session-factory>进行配置

    7、从配置文件加载SessionFactory

    复制代码
    package yank.hibernate.sample;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    
    /**
     * hibernate工具类
     * @author yank
     *
     */
    public class HibernateUtils {
        private static final SessionFactory sessionFactory = buildSessionFactory();  
        
        private static SessionFactory buildSessionFactory() {  
            try {  
                // Create the SessionFactory from hibernate.cfg.xml  
                return new Configuration().configure().buildSessionFactory();  
            }  
            catch (Throwable ex) {  
                // Make sure you log the exception, as it might be swallowed  
                System.err.println("Initial SessionFactory creation failed." + ex);  
                throw new ExceptionInInitializerError(ex);  
            }  
        }  
      
        public static SessionFactory getSessionFactory() {  
            return sessionFactory;  
        } 
    }
    复制代码

    8、基本功能测试,简单的CRUD可以实现了

    复制代码
    package yank.hibernate.sample;
    
    import java.util.List;
    
    import org.hibernate.SQLQuery;
    import org.hibernate.Session;
    
    public class StudentManager {
        public static void main(String[] args){
            //新增
            StudentManager stuMgr = new StudentManager();
            stuMgr.createStudent("LiLei", 20);
            
            //查询
            Student student = stuMgr.findById(1);
            
            //编辑,保存
            student.setAge(21);
            stuMgr.update(student);
            
            //查询所有
            Student last = null;
            List stuList = stuMgr.findList();
            for(Object item : stuList){
                System.out.println(((Student)item).getName());
                last = (Student)item;
            }
            
            //删除
            stuMgr.delete(last);        
        }
        /**
         * 新增
         * @param id
         * @param name
         * @param age
         */
        public void createStudent(String name,Integer age){
            Student student = new Student();
            student.setName(name);
            student.setAge(age);
            this.save(student);
        }
        /**
         * 保存
         * @param student
         */
        public void save(Student student){
            Session session = HibernateUtils.getSessionFactory().openSession();
            session.beginTransaction();
            session.save(student);
            session.getTransaction().commit();
            session.close();
        }
        /**
         * 更新
         * @param student
         */
        public void update(Student student){
            Session session = HibernateUtils.getSessionFactory().openSession();
            session.beginTransaction();
            session.update(student);
            session.getTransaction().commit();
            session.close();
        }
        /**
         * 根据id查询
         * @param stuId
         * @return
         */
        public Student findById(Integer stuId){
            Session session = HibernateUtils.getSessionFactory().openSession();
            Student student = session.get(Student.class, stuId);
            session.close();
            return student;
        }
        /**
         * 查询集合
         */
        public List findList(){        
            Session session = HibernateUtils.getSessionFactory().openSession();        
            SQLQuery qry = session.createSQLQuery(" select * from Students").addEntity(Student.class);
            List list = qry.list();
            session.close();
            return list;
        }
        /**
         * 删除
         * @param 学生对象
         */
        public void delete(Student student){
            Session session = HibernateUtils.getSessionFactory().openSession();
            session.beginTransaction();
            session.delete(student);
            session.getTransaction().commit();
            session.close();
        }
    }
    复制代码

    9、其他:

    查询List时报异常

    Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to yank.hibernate.sample.Student

    代码如下:

    复制代码
        /**
         * 查询集合
         */
        public List findList(){        
            Session session = HibernateUtils.getSessionFactory().openSession();
            SQLQuery qry = session.createSQLQuery(" select * from Students");
            List list = qry.list();
            session.close();
            return list;
        }
    复制代码

    原因:

    查询出来的对象不能自动转为JavaBean对象 

    解决方案:

    利用addEntity,增加类型映射。

    复制代码
        /**
         * 查询集合
         */
        public List findList(){        
            Session session = HibernateUtils.getSessionFactory().openSession();        
            SQLQuery qry = session.createSQLQuery(" select * from Students").addEntity(Student.class);
            List list = qry.list();
            session.close();
            return list;
        }
    复制代码

      

    JPA:

    JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

    Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。

    JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。
    JPA框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。

    Hibernate是在版本3.2后遵循JPA标准的。

  • 相关阅读:
    SpringMVC07处理器方法的返回值
    html01基本标签
    java09数组的使用
    SpringMVC06以对象的方式获取前台的数据
    面向对象的程序设计(五)借用构造函数继承
    面向对象的程序设计(四)原型链继承
    面向对象的程序设计(三)对象字面量创建原型方法与直接创建原型方法的区别
    面向对象的程序设计(二)理解各种方法和属性typeof、instanceof、constructor、prototype、__proto__、isPrototypeOf、hasOwnProperty
    面向对象的程序设计(一)创建对象的各种方法
    二叉树的层次遍历
  • 原文地址:https://www.cnblogs.com/xiadongqing/p/5278875.html
Copyright © 2020-2023  润新知