16_Spring 整合Hibernate(XML方式)

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

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

  1. 配置好 hibernate.cfg.xml 文件



    
    
        
        com.mysql.jdbc.Driver
        jdbc:mysql://localhost:3306/sshtest
        root
        root

        
        org.hibernate.dialect.MySQLDialect

        
        true

        
        true
        
        
        update

        
        org.hibernate.connection.C3P0ConnectionProvider
        
        
        20
        5
        120
        3000

        
        
        
    

  1. 将 sessionFactory 交由 Spring 容器来管理
    • Spring 中提供了 LocalSessionFactory 来加载 hibernate.cfg.xml 文件
    • 注意:LocalSessionFactory 类针对 Hibernate 的不同版本,有不同的实现类
    
    
        
    
    
  2. 在 web.xml 中配置监听器,在服务器启动的时候加载 Spring 的配置文件


    org.springframework.web.context.ContextLoaderListener



    contextConfigLocation
    classpath:applicationContext.xml

  1. 当工程加载到服务器后,如果可以自动创建表,就代表Spring整合Hibernate成功。因为在 hibernate.cfg.xml 配置文件中设置了自动创建表。

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

  1. 在 applicationContext.xml 引入 db.properties 文件


jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/sshtest
jdbc.username=root
jdbc.password=root
  1. 配置C3P0连接池
 

    
    
    
    

  1. 创建 LocalSessionFactoryBean
    • 由 Spring 管理 Hibernate 中的 SessionFactory


    
    
    
    
    
        
        
        
        
            hibernate.dialect=org.hibernate.dialect.MySQLDialect
            hibernate.show_sql=true
            hibernate.format_sql=true
            hibernate.hbm2ddl.auto=update
        
    
    
    
    
        
            com/zhangquanli/sshxml/domain/Person.hbm.xml
        
    

  1. 映射文件加载方式
    • mappingResources 类似于
    
        
            com/zhangquanli/sshxml/domain/Person.hbm.xml
        
    
    
    • mappingLocations 根据类路径加载 classpath:路径
    
        
            classpath:com/zhangquanli/sshxml/domain/Person.hbm.xml
        
    
    
    • mappingDirectoryLocations 加载目录下所有映射文件
    
        
            classpath:com/zhangquanli/sshxml/domain
        
    
    
    • mappingJarLocations 加载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 findAll() {
            return (List) getHibernateTemplate().find("from User");//session.createQuery(hql).list()
        }
    
    }
    
  2. 声明 dao
    • 在 HibernateDaoSupport 中注入 SessionFactory 获取 HibernateTemplate
    • HibernateTemplate 是对 Hibernate 操作的简单封装
    
    
        
    
    
  3. 编写业务层代码
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 findAll() {
        return userDao.findAll();
    }

}
  1. 声明 service


    

  1. 在 applicationContext.xml 中配置事务管理



    




    
        
        
        
        
    




    
    

  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 list = userService.findAll();
        System.out.println(list);
    }

}

HibernateTemplate API

  1. 增删改
    • Serializable save(Object entity)
    • void update(Object entity)
    • void saveOrUpdate(Object entity)
    • void delete(Object entity)
    • T get(Class entityClass, Serializable id)
    • T load(Class entityClass, Serializable id)
    • List find(String queryString, Object... values)
    • List findByCriteria(DetachedCriteria criteria)
    • List findByNamedQuery(String queryName, Object... values)
  2. 一级缓存相关
    • void evict(Object entity)
    • void clear()
  3. 一级缓存与数据库交互
    • void flush()
    • void refresh(Object entity)
  4. 演示 findByCriteria 方法
    • 创建 DetachedCriteria 对象
    public void testFindByCriteria() {
        DetachedCriteria criteria = DetachedCriteria.forClass(User.class);
        criteria.add(Restrictions.gt("age", 20));
        List list = userService.findByCriteria(criteria);
        System.out.println(list);
    }
    
    • 在dao层调用 findByCriteria 方法
    public List findByCriteria(DetachedCriteria criteria) {
        return (List) getHibernateTemplate().findByCriteria(criteria);
    }
    
  5. 演示 findByNamedQuery 方法
    • 在 User.hbm.xml 文件中定义 hql 和 sql
    
        from User where id>?
    
    
    
        
        select * from t_user
    
    
    • 持久层代码
    public List findByNamedQueryHQL(Integer id) {
        return (List) getHibernateTemplate().findByNamedQuery("findUserByHQL", id);
    }
    
    public List findByNamedQuerySQL() {
        return (List) getHibernateTemplate().findByNamedQuery("findUserBySQL");
    }
    
    • 测试代码
    @Test
    public void testFindByNamedQueryHQL() {
        List list = userService.findByNamedQueryHQL(2);
        System.out.println(list);
    }
    
    @Test
    public void testFindByNamedQuerySQL() {
        List list = userService.findByNamedQuerySQL();
        System.out.println(list);
    }
    

你可能感兴趣的:(16_Spring 整合Hibernate(XML方式))