• 在Java Web程序中使用Hibernate


    在Java Web程序中使用Hibernate与普通Java程序一样。本文中将使用Servlet和JSP结合Hibernate实现数据库表的增删改查操作。

    Web程序中,hibernate.cfg.xml中必须配置current_session_context_class参数。如果使用JBoss等内置Hibernae的容器,参数值要配置为jta,其他容器(如Tomcat等)需要配置为thread。

    1. 创建工程并搭建Hibernate框架

    在MyEclipse中创建一个Web工程,工程名为hibernate_web,把MySQL数据库驱动包和JSTL需要的jar包复制到WebRoot/WEB-INF/lib目录下;然后使用MyEclipse向导把Hibernate的jar包导到工程中。关于搭建Hibernate框架,可以参考网上的教程,这里就不再介绍了。接着,使用Hibernate连接数据库,并通过数据库表自动生成数据库对应的实体类和实体类映射文件。所使用的数据库表是MySQL的bank数据库中的users表。

    自动生成及修改的代码如下:

    package com.cn.vo;
    
    /**
     * UsersVo entity. @author MyEclipse Persistence Tools
     */
    
    public class UsersVo implements java.io.Serializable {
    
        // Fields
    
        private Integer id;
        private String name;
        private Integer age;
        private String tel;
        private String address;
    
        // Constructors
    
        /** default constructor */
        public UsersVo() {
        }
    
        /** minimal constructor */
        public UsersVo(Integer id) {
            this.id = id;
        }
    
        /** full constructor */
        public UsersVo(Integer id, String name, Integer age, String tel,
                String address) {
            this.id = id;
            this.name = name;
            this.age = age;
            this.tel = tel;
            this.address = address;
        }
    
        // Property accessors
    
        public Integer getId() {
            return this.id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return this.name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return this.age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getTel() {
            return this.tel;
        }
    
        public void setTel(String tel) {
            this.tel = tel;
        }
    
        public String getAddress() {
            return this.address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
    }

    UsersVo.hbm.xml

    <?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">
    <!-- 
        Mapping file autogenerated by MyEclipse Persistence Tools
    -->
    <hibernate-mapping>
        <class name="com.cn.vo.UsersVo" table="users" catalog="bank">
            <id name="id" type="java.lang.Integer">
                <column name="id" />
                <generator class="assigned" />
            </id>
            <property name="name" type="java.lang.String">
                <column name="name" length="20" />
            </property>
            <property name="age" type="java.lang.Integer">
                <column name="age" />
            </property>
            <property name="tel" type="java.lang.String">
                <column name="tel" length="20" />
            </property>
            <property name="address" type="java.lang.String">
                <column name="address" length="50" />
            </property>
        </class>
    </hibernate-mapping>

    hibernate.cfg.xml(修改)

    <?xml version='1.0' encoding='gbk'?>
    <!DOCTYPE hibernate-configuration PUBLIC
              "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    
    <!-- Generated by MyEclipse Hibernate Tools.                   -->
    <hibernate-configuration>
    
        <session-factory>    
            <!-- 声明使用SQL语句是MySQL数据库的SQL语句(MySQL方言) -->
            <property name="dialect">
                org.hibernate.dialect.MySQLDialect
            </property>
            
            <!-- 在控制台打印执行的SQL语句 -->
            <property name="show_sql">true</property>
            
            <!-- 指定Hibernate启动的时候自动更新表,如果不存在则创建 -->
            <property name="hbm2ddl.auto">update</property>
            
            <!-- 使用线程,防止遇到异常 -->
            <property name="current_session_context_class">thread</property>
            
                <!-- JDBC配置代码包括数据库驱动、用户名密码及连接地址 -->
            <property name="connection.url">
                jdbc:mysql://localhost:3306/bank
            </property>
            <property name="connection.username">root</property>
            <property name="connection.password">1234</property>
            <property name="connection.driver_class">
                com.mysql.jdbc.Driver
            </property>
            <property name="myeclipse.connection.profile">
                com.mysql.jdbc.Driver
            </property>
            
            <!-- 指定Hibernate的映射文件 -->
            <mapping resource="com/cn/vo/UsersVo.hbm.xml" />
    
        </session-factory>
    
    </hibernate-configuration>

    HibernateSessionFactory.java

    package com.cn.hibernate;
    
    import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import org.hibernate.cfg.Configuration;
    
    /**
     * Configures and provides access to Hibernate sessions, tied to the
     * current thread of execution.  Follows the Thread Local Session
     * pattern, see {@link http://hibernate.org/42.html }.
     */
    public class HibernateSessionFactory {
    
        /** 
         * Location of hibernate.cfg.xml file.
         * Location should be on the classpath as Hibernate uses  
         * #resourceAsStream style lookup for its configuration file. 
         * The default classpath location of the hibernate config file is 
         * in the default package. Use #setConfigFile() to update 
         * the location of the configuration file for the current session.   
         */
        private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
        private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
        private  static Configuration configuration = new Configuration();    
        private static org.hibernate.SessionFactory sessionFactory;
        private static String configFile = CONFIG_FILE_LOCATION;
    
        static {
            try {
                configuration.configure(configFile);
                sessionFactory = configuration.buildSessionFactory();
            } catch (Exception e) {
                System.err
                        .println("%%%% Error Creating SessionFactory %%%%");
                e.printStackTrace();
            }
        }
        private HibernateSessionFactory() {
        }
        
        /**
         * Returns the ThreadLocal Session instance.  Lazy initialize
         * the <code>SessionFactory</code> if needed.
         *
         *  @return Session
         *  @throws HibernateException
         */
        public static Session getSession() throws HibernateException {
            Session session = (Session) threadLocal.get();
    
            if (session == null || !session.isOpen()) {
                if (sessionFactory == null) {
                    rebuildSessionFactory();
                }
                session = (sessionFactory != null) ? sessionFactory.openSession()
                        : null;
                threadLocal.set(session);
            }
    
            return session;
        }
    
        /**
         *  Rebuild hibernate session factory
         *
         */
        public static void rebuildSessionFactory() {
            try {
                configuration.configure(configFile);
                sessionFactory = configuration.buildSessionFactory();
            } catch (Exception e) {
                System.err
                        .println("%%%% Error Creating SessionFactory %%%%");
                e.printStackTrace();
            }
        }
    
        /**
         *  Close the single hibernate session instance.
         *
         *  @throws HibernateException
         */
        public static void closeSession() throws HibernateException {
            Session session = (Session) threadLocal.get();
            threadLocal.set(null);
    
            if (session != null) {
                session.close();
            }
        }
    
        /**
         *  return session factory
         *
         */
        public static org.hibernate.SessionFactory getSessionFactory() {
            return sessionFactory;
        }
    
        /**
         *  return session factory
         *
         *    session factory will be rebuilded in the next call
         */
        public static void setConfigFile(String configFile) {
            HibernateSessionFactory.configFile = configFile;
            sessionFactory = null;
        }
    
        /**
         *  return hibernate configuration
         *
         */
        public static Configuration getConfiguration() {
            return configuration;
        }
    
    }

    2. 编写数据持久层

    为了使程序结构清晰,数据持久层独立出来,放在DAO层中,在DAO层的类中编写数据的增删修改查方法,通过这些方法操作数据。在使用时,只需要根据实际情况来调用DAO层中的方法就可以了。这个例子中,DAO层只有一个类,类名为HibernateDao,HibernateDao类的代码如下:

    package com.cn.dao;
    
    import org.hibernate.HibernateException;
    import org.hibernate.Session;
    
    import java.util.List;
    
    import com.cn.hibernate.HibernateSessionFactory;
    import com.cn.vo.UsersVo;
    
    public class HibernateDao {
        //添加数据的方法
        public void add(UsersVo usersVo){
            //调用HibernateSessionFactory的会话
            Session session = HibernateSessionFactory.getSession();
            try {
                session.beginTransaction(); //开启事务
                session.persist(usersVo); //将对象添加到数据库
                session.getTransaction().commit(); //提交事务
                
            } catch (Exception e) {
                session.getTransaction().rollback(); //回滚事务
            } finally {
                session.close(); //关闭session
            }
        }
        
        //修改数据的方法
        public void modifyUsers(UsersVo usersVo){
            Session session = HibernateSessionFactory.getSession();
            try {
                session.beginTransaction(); //开启事务
                session.update(usersVo); //修改数据
                session.getTransaction().commit(); //提交事务
            } catch (Exception e) {
                session.getTransaction().rollback(); //回滚事务
            } finally {
                session.close(); //关闭session
            }
        }
        
        //从表中删除数据
        public void delete(int id){
            Session session = HibernateSessionFactory.getSession();
            try {
                session.beginTransaction();
                UsersVo users = (UsersVo)session.get(UsersVo.class, id);
                session.delete(users);
                session.getTransaction().commit();
            } catch (Exception e) {
                session.getTransaction().rollback();
            } finally {
                session.close();
            }
        }
        
        //根据id查找数据
        @SuppressWarnings("unchecked")
        public UsersVo queryUsersById(int id){
            Session session = HibernateSessionFactory.getSession();
            UsersVo users = (UsersVo)session.get(UsersVo.class, id);
            return users;
        }
        
        //查找多条数据
        @SuppressWarnings("unchecked")
        public List<UsersVo> showlist(String hql){
            Session session = HibernateSessionFactory.getSession();
            try {
                session.beginTransaction();
                return session.createQuery(hql).list(); //使用HQL查询结果,返回List对象
            } catch (Exception e) {
                session.getTransaction().rollback();
            } finally {
                session.getTransaction().commit();
                session.close();
            }
            return null;
        }
    }

    该类中接受UsersVo类,Hibernate能够判断实体类的类型,决定操作哪个数据表。HibernateDao封装了最基本的CURD操作。

  • 相关阅读:
    LaTeX入门
    用jdom来解析xml文件小Demo
    Java乔晓松基于注解的面向AOP(切面)编程
    三层架构实战篇—系统登录实例
    selenium ide插件介绍
    WPF17行为(以控件在界面拖动为例)
    火狐浏览器显示“已阻止载入混合活动内容“的解决方法
    博客园—打赏功能
    网页返回顶部的几种方法
    自定义美化博客园
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4379952.html
Copyright © 2020-2023  润新知