SSH之Hibernate

hibernate

l Hibernate是一个开源ORM框架。

l ORM全称Object Relation Mapping,即对象关系映射。它是一种用来完成对象模型到关系模型的映射技术。就是把应用程序中的对象数据持久化到关系数据库的表的一种技术。

l 简单的说:ORM能利用面向对象的思想开放基于关系型数据库的应用程序,它的主要工作是将对象数据保存到关系数据库的表中,以及将关系数据库表中数据读入到对象中。


l 配置文件hibernate.cfg.xml和hibernate.properties,XML和properties两种,这两个文件的作用一样,提供一个即可,推荐XML格式


在Struts基础上整合Hibernate


整合Hibernate

  1. 将Hibernate内的lib/required下的jar包和lib/jpa下的jar包复制到SSHProject项目的lib目录下。
  2. 在上面Struts项目的基础上添加com.ynwi.ssh.dao和com.ynwi.ssh.daoImpl包。分别创建BaseDao接口和UserDao类。
  3. 在数据库中创建对应的表user来写入要注册的用户。
  4. 创建user表的Hibernate映射文件。因为这里要创建user表对应的POJO类,所以我这里把之前com.ynwi.ssh.beans包改成com.ynwi.ssh.forms包,用来存放页面传过来的表单数据,新创建com.ynwi.ssh.beans包,用来创建POJO对象来对应数据库中的表。路径:POJO类同目录。
  5. 建立Hibernate配置文件。路径:src目录下。
  6. 编写Session工厂类。整合Spring后,数据源的创建和SessionFactory的创建都交给Spring去管理,就无需这个工厂类了,所以这里我临时创建在daoImpl包里面。
  7. 修改业务逻辑实现类。
  8. 创建表的脚本
    create table user(  
    userId int auto_increment,  
    userName varchar(16) not null,  
    password varchar(16) not null,  
    gender int not null,  
    primary key(userId)  
    );

操作完成后的结构如图所示:

编写代码

接口类BaseDao.java的内容。 注意:接口里的两个get/set方法是为了让实现类覆盖。这样使用BaseDao dao = new UserDao()的时候,dao实体中有这两个方法。

package com.ynwi.ssh.dao;  
  
import org.hibernate.HibernateException;  
import org.hibernate.Session;  
  
public interface BaseDao {  
  
    public void saveObject(Object obj) throws HibernateException;  
  
    public Session getSession();  
  
    public void setSession(Session session);  
}<span style="color:#990000;">  </span>
实现类UserDao.java的内容

package com.ynwi.ssh.daoImpl;  
  
import org.hibernate.HibernateException;  
import org.hibernate.Session;  
  
import com.ynwi.ssh.dao.BaseDao;  
  
public class UserDao implements BaseDao {  
  
    private Session session;  
  
    @Override  
    public Session getSession() {  
        return session;  
    }  
  
    @Override  
    public void setSession(Session session) {  
        this.session = session;  
    }  
  
    @Override  
    public void saveObject(Object obj) throws HibernateException {  
        session.save(obj);  
    }  
  
}  

  • 表user的POJO类User.java的内容,因为跟UserForm.java内容差不多,所以不再列出。这个比UserForm.java多一个userId属性,因为在表user里面有userId的column。在POJO类里需要跟这个column有映射。
  • POJO类User.java的Hibernate映射文件User.hbm.xml的内容。代码<generator class="native"></generator>说明将根据本地数据库的设置来创建userId,如MySQL中将表user的userId设置为自动增长,则在保存记录是,userId将自动增长。对于需要在程序中指定主键的值,则将generator的class属性设置为assigned。
<?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="com.ynwi.ssh.beans">  
    <class name="User" table="user">  
        <id name="userId" column="userId">  
            <generator class="native"></generator>  
        </id>  
        <property name="username" column="userName" type="java.lang.String"  
            not-null="true" length="16"></property>  
        <property name="password" column="password" type="java.lang.String"  
            not-null="true" length="16" />  
        <property name="gender" column="gender" type="java.lang.Integer" length="1" />  
    </class>  
</hibernate-mapping>

Hibernate配置文件Hibernate.cfg.xml的内容。

<?xml version='1.0' encoding='utf-8'?>  
<!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>  
    <!-- Database connection settings -->  
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>  
    <property name="connection.url">jdbc:mysql://localhost:3306/project</property>  
    <property name="connection.username">root</property>  
    <property name="connection.password">root</property>  
  
    <!-- JDBC connection pool (use the built-in) -->  
    <!-- <property name="connection.pool_size">1</property> -->  
  
    <!-- SQL dialect -->  
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>  
  
    <!-- Enable Hibernate's automatic session context management -->  
    <!-- <property name="current_session_context_class">thread</property> -->  
  
    <!-- Disable the second-level cache  -->  
    <!-- <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property> -->  
  
    <!-- Echo all executed SQL to stdout -->  
    <property name="show_sql">true</property>  
  
    <!-- Drop and re-create the database schema on startup -->  
    <!-- <property name="hbm2ddl.auto">update</property> -->  
    <mapping resource="com/ynwi/ssh/beans/User.hbm.xml"/>  
  </session-factory>  
</hibernate-configuration>  

工厂类SessionFactory的内容。( 这是使用Hibernate4时候的SessionFactory,Hibernate3时候sessionFactory的创建估计会不一样,请自行查阅。

package com.ynwi.ssh.daoImpl;  
  
import org.hibernate.HibernateException;  
import org.hibernate.Session;  
import org.hibernate.SessionFactory;  
import org.hibernate.cfg.Configuration;  
import org.hibernate.service.ServiceRegistry;  
import org.hibernate.service.ServiceRegistryBuilder;  
  
public class HibernateSessionFactory {  
  
    private static final String CFG_FILE_LOCATION = "/Hibernate.cfg.xml";  
  
    private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();  
  
    private static final Configuration cfg = new Configuration()  
            .configure(CFG_FILE_LOCATION);  
  
    private static ServiceRegistryBuilder builder = new ServiceRegistryBuilder()  
            .applySettings(cfg.getProperties());  
  
    private static ServiceRegistry registry;  
  
    private static SessionFactory sessionFactory;  
  
    public static Session currentSession() throws HibernateException {  
        Session session = threadLocal.get();  
  
        if (session == null || session.isOpen() == false) {  
  
            if (sessionFactory == null) {  
                try {  
                    registry = builder.buildServiceRegistry();  
                    sessionFactory = cfg.buildSessionFactory(registry);  
                } catch (Exception e) {  
                    e.printStackTrace();  
                }  
            }  
  
            session = sessionFactory.openSession();  
            threadLocal.set(session);  
  
        }  
  
        return session;  
    }  
  
    public static void closeSession() throws HibernateException {  
        Session session = threadLocal.get();  
        threadLocal.set(null);  
        if (session != null) {  
            session.close();  
        }  
    }  
  
}  

修改后的业务逻辑实现类的内容。

package com.ynwi.ssh.serviceImpl;  
  
import org.hibernate.HibernateException;  
import org.hibernate.Session;  
import org.hibernate.Transaction;  
  
import com.ynwi.ssh.beans.User;  
import com.ynwi.ssh.dao.BaseDao;  
import com.ynwi.ssh.daoImpl.HibernateSessionFactory;  
import com.ynwi.ssh.daoImpl.UserDao;  
import com.ynwi.ssh.forms.UserForm;  
import com.ynwi.ssh.service.UserManager;  
  
public class UserManagerImpl implements UserManager {  
  
    private BaseDao dao;  
  
    private Session session;  
  
    public UserManagerImpl() {  
        dao = new UserDao();  
    }  
  
    @Override  
    public void regUser(UserForm userForm) throws HibernateException {  
        session = HibernateSessionFactory.currentSession();  
        dao.setSession(session);  
        // 获取事务  
        Transaction ts = session.beginTransaction();  
        // 构造User对象  
        User user = new User();  
        user.setUsername(userForm.getUsername());  
        user.setPassword(userForm.getPassword());  
        user.setGender(userForm.getGender());  
        // 保存User对象  
        dao.saveObject(user);  
        // 提交事务  
        ts.commit();  
        // 关闭Session  
        HibernateSessionFactory.closeSession();  
    }  
  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值