16_Spring 整合Hibernate(XML方式)

基本原理:由Spring來管理Hibernate的SessionFactory

方式一:零障礙整合(了解)

  1. 配置好 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>
    
        <!-- 配置數(shù)據(jù)庫連接 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/sshtest</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>

        <!-- Hibernate的方言 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- 顯示sql語句 -->
        <property name="hibernate.show_sql">true</property>

        <!-- 格式化sql語句 -->
        <property name="hibernate.format_sql">true</property>
        
        <!-- 自動創(chuàng)建表 -->
        <property name="hibernate.hbm2ddl.auto">update</property>

        <!-- 設(shè)置連接提供者 -->
        <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
        
        <!-- c3p0連接配置 -->
        <property name="hibernate.c3p0.max_size">20</property><!-- 最大連接數(shù) -->
        <property name="hibernate.c3p0.min_size">5</property><!-- 最小連接數(shù) -->
        <property name="hibernate.c3p0.timeout">120</property><!-- 超時 -->
        <property name="hibernate.c3p0.idle_test_period">3000</property><!-- 空閑連接 -->

        <!-- 配置映射文件 -->
        <mapping resource="com/zhangquanli/sshxml/domain/Person.hbm.xml"/>
        
    </session-factory>
</hibernate-configuration>
  1. 將 sessionFactory 交由 Spring 容器來管理
    • Spring 中提供了 LocalSessionFactory 來加載 hibernate.cfg.xml 文件
    • 注意:LocalSessionFactory 類針對 Hibernate 的不同版本,有不同的實現(xiàn)類
    <!-- spring整合hibernate方式一 -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="configLocation" value="classpath:hibernate.cfg.xml"/>
    </bean>
    
  2. 在 web.xml 中配置監(jiān)聽器,在服務(wù)器啟動的時候加載 Spring 的配置文件
<!-- 配置 ContextLoaderListener 監(jiān)聽器 -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置 applicationContext.xml 路徑 -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>
  1. 當(dāng)工程加載到服務(wù)器后,如果可以自動創(chuàng)建表,就代表Spring整合Hibernate成功。因為在 hibernate.cfg.xml 配置文件中設(shè)置了自動創(chuàng)建表。

方式二:由 Spring 管理 Hibernate 的配置文件(重點)

  1. 在 applicationContext.xml 引入 db.properties 文件
<!-- 引入properties文件 -->
<context:property-placeholder location="classpath:db.properties"/>
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/sshtest
jdbc.username=root
jdbc.password=root
  1. 配置C3P0連接池
 <!-- 配置C3P0連接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driverClass}"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
    <property name="user" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>
  1. 創(chuàng)建 LocalSessionFactoryBean
    • 由 Spring 管理 Hibernate 中的 SessionFactory
<!-- 創(chuàng)建sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" >
    <!-- 注入連接池 -->
    <property name="dataSource" ref="dataSource"/>
    
    <!-- 配置Hibernate -->
    <property name="hibernateProperties">
        <!-- 以下屬性在書寫時不能省略hibernate -->
        <!-- <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props> -->
        <!-- 上述props可以簡寫成以下方案 -->
        <value>
            hibernate.dialect=org.hibernate.dialect.MySQLDialect
            hibernate.show_sql=true
            hibernate.format_sql=true
            hibernate.hbm2ddl.auto=update
        </value>
    </property>
    
    <!-- 加載映射文件 -->
    <property name="mappingResources">
        <list>
            <value>com/zhangquanli/sshxml/domain/Person.hbm.xml</value>
        </list>
    </property>
</bean>
  1. 映射文件加載方式
    • <font color="red">mappingResources</font> 類似于 <mappring resource=""/>
    <property name="mappingResources">
        <list>
            <value>com/zhangquanli/sshxml/domain/Person.hbm.xml</value>
        </list>
    </property>
    
    • <font color="red">mappingLocations</font> 根據(jù)類路徑加載 classpath:路徑
    <property name="mappingLocations">
        <list>
            <value>classpath:com/zhangquanli/sshxml/domain/Person.hbm.xml</value>
        </list>
    </property>
    
    • <font color="red">mappingDirectoryLocations</font> 加載目錄下所有映射文件
    <property name="mappingDirectoryLocations">
        <list>
            <value>classpath:com/zhangquanli/sshxml/domain</value>
        </list>
    </property>
    
    • <font color="red">mappingJarLocations</font> 加載jar文件中的映射文件
  2. 由 Spring 管理 Hibernate 的配置文件時,不再需要 hibernate.cfg.xml 配置文件。因為 applicationContext.xml 文件中,就可以完成 Hibernate 的配置。

Spring 整合 Hibernate 后的 Dao

  1. 編寫持久層代碼
    • Spring 整合 Hibernate 后,Dao需要繼承 HibernateDaoSupport
    package com.zhangquanli.sshxml.dao;
    
    import java.util.List;
    import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
    import com.zhangquanli.sshxml.domain.User;
    
    public class UserDaoImpl extends HibernateDaoSupport implements IUserDao {
    
        @Override
        public void add(User user) {
            getHibernateTemplate().save(user);//session.save()
        }
    
        @Override
        public void update(User user) {
            getHibernateTemplate().update(user);//session.update()
        }
    
        @Override
        public void del(User user) {
            getHibernateTemplate().delete(user);//session.delete();
        }
    
        @Override
        public User findById(Integer id) {
            return getHibernateTemplate().get(User.class, 1);//session.get()
        }
    
        @Override
        @SuppressWarnings("unchecked")
        public List<User> findAll() {
            return (List<User>) getHibernateTemplate().find("from User");//session.createQuery(hql).list()
        }
    
    }
    
  2. 聲明 dao
    • 在 HibernateDaoSupport 中注入 SessionFactory 獲取 HibernateTemplate
    • HibernateTemplate 是對 Hibernate 操作的簡單封裝
    <!-- dao -->
    <bean id="userDao" class="com.zhangquanli.sshxml.dao.UserDaoImpl">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    
  3. 編寫業(yè)務(wù)層代碼
package com.zhangquanli.sshxml.service;

import java.util.List;
import com.zhangquanli.sshxml.dao.IUserDao;
import com.zhangquanli.sshxml.domain.User;

public class UserServiceImpl implements IUserService {
    private IUserDao userDao;

    public void setUserDao(IUserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void add(User user) {
        userDao.add(user);
    }

    @Override
    public void update(User user) {
        userDao.update(user);
    }

    @Override
    public void del(User user) {
        userDao.del(user);
    }

    @Override
    public User findById(Integer id) {
        return userDao.findById(id);
    }

    @Override
    public List<User> findAll() {
        return userDao.findAll();
    }

}
  1. 聲明 service
<!-- service -->
<bean id="userService" class="com.zhangquanli.sshxml.service.UserServiceImpl">
    <property name="userDao" ref="userDao" />
</bean>
  1. 在 applicationContext.xml 中配置事務(wù)管理
<!-- 聲明式事務(wù)管理 -->
<!-- 事務(wù)管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

<!-- 通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="find*" read-only="true"/>
        <tx:method name="add"/>
        <tx:method name="update"/>
        <tx:method name="del"/>
    </tx:attributes>
</tx:advice>

<!-- 切面 -->
<aop:config>
    <aop:pointcut expression="execution(* com.zhangquanli.sshxml.service.*..*(..))" id="myPointcut"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut"/>
</aop:config>
  1. 編寫測試代碼
package com.zhangquanli.sshxml.service;

import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.zhangquanli.sshxml.domain.User;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class UserServiceImplTest {
    
    @Autowired
    private IUserService userService;

    @Test
    public void testAdd() {
        User user = new User();
        user.setName("lis");
        user.setAge(29);
        user.setSex("女");
        userService.add(user);
    }

    @Test
    public void testUpdate() {
        User user = userService.findById(2);
        user.setName("黃珊珊");
        userService.update(user);
    }

    @Test
    public void testDel() {
        User user = userService.findById(2);
        userService.del(user);
    }

    @Test
    public void testFindById() {
        User user = userService.findById(2);
        System.out.println(user);
    }

    @Test
    public void testFindAll() {
        List<User> list = userService.findAll();
        System.out.println(list);
    }

}

HibernateTemplate API

  1. 增刪改
    • <font color="red">Serializable save(Object entity)</font>
    • <font color="red">void update(Object entity)</font>
    • <font color="red">void saveOrUpdate(Object entity)</font>
    • <font color="red">void delete(Object entity)</font>
    • <font color="red"><T> T get(Class<T> entityClass, Serializable id)</font>
    • <font color="red"><T> T load(Class<T> entityClass, Serializable id)</font>
    • <font color="red">List<?> find(String queryString, Object... values)</font>
    • <font color="red">List<?> findByCriteria(DetachedCriteria criteria)</font>
    • <font color="red">List<?> findByNamedQuery(String queryName, Object... values)</font>
  2. 一級緩存相關(guān)
    • <font color="red">void evict(Object entity)</font>
    • <font color="red">void clear()</font>
  3. 一級緩存與數(shù)據(jù)庫交互
    • <font color="red">void flush()</font>
    • <font color="red">void refresh(Object entity)</font>
  4. 演示 <font color="red">findByCriteria</font> 方法
    • 創(chuàng)建 DetachedCriteria 對象
    public void testFindByCriteria() {
        DetachedCriteria criteria = DetachedCriteria.forClass(User.class);
        criteria.add(Restrictions.gt("age", 20));
        List<User> list = userService.findByCriteria(criteria);
        System.out.println(list);
    }
    
    • 在dao層調(diào)用 findByCriteria 方法
    public List<User> findByCriteria(DetachedCriteria criteria) {
        return (List<User>) getHibernateTemplate().findByCriteria(criteria);
    }
    
  5. 演示 <font color="red">findByNamedQuery</font> 方法
    • 在 User.hbm.xml 文件中定義 hql 和 sql
    <query name="findUserByHQL">
        from User where id>?
    </query>
    
    <sql-query name="findUserBySQL">
        <return class="com.zhangquanli.sshxml.domain.User"/>
        select * from t_user
    </sql-query>
    
    • 持久層代碼
    public List<User> findByNamedQueryHQL(Integer id) {
        return (List<User>) getHibernateTemplate().findByNamedQuery("findUserByHQL", id);
    }
    
    public List<User> findByNamedQuerySQL() {
        return (List<User>) getHibernateTemplate().findByNamedQuery("findUserBySQL");
    }
    
    • 測試代碼
    @Test
    public void testFindByNamedQueryHQL() {
        List<User> list = userService.findByNamedQueryHQL(2);
        System.out.println(list);
    }
    
    @Test
    public void testFindByNamedQuerySQL() {
        List<User> list = userService.findByNamedQuerySQL();
        System.out.println(list);
    }
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,706評論 18 399
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,273評論 6 342
  • 文/十二 我與父親的真正意義上的交集與交流,大概是在我上高中之后。在那之前,我們之間的聯(lián)系寥寥無幾,這其中大概有通...
    十二在路上閱讀 421評論 0 1
  • 文:筠心 圖:網(wǎng)絡(luò) 君主禮遇文臣,莫過于宋朝。宋太祖以武職篡位,對武將日夜提防,擔(dān)心他們有樣學(xué)樣,步自己后塵;...
    筠心_閱讀 787評論 0 9

友情鏈接更多精彩內(nèi)容