基本原理:由Spring来管理Hibernate的SessionFactory
方式一:零障碍整合(了解)
- 配置好 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
- 将 sessionFactory 交由 Spring 容器来管理
- Spring 中提供了 LocalSessionFactory 来加载 hibernate.cfg.xml 文件
- 注意:LocalSessionFactory 类针对 Hibernate 的不同版本,有不同的实现类
- 在 web.xml 中配置监听器,在服务器启动的时候加载 Spring 的配置文件
org.springframework.web.context.ContextLoaderListener
contextConfigLocation
classpath:applicationContext.xml
- 当工程加载到服务器后,如果可以自动创建表,就代表Spring整合Hibernate成功。因为在 hibernate.cfg.xml 配置文件中设置了自动创建表。
方式二:由 Spring 管理 Hibernate 的配置文件(重点)
- 在 applicationContext.xml 引入 db.properties 文件
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/sshtest
jdbc.username=root
jdbc.password=root
- 配置C3P0连接池
- 创建 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
- 映射文件加载方式
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文件中的映射文件
- 由 Spring 管理 Hibernate 的配置文件时,不再需要 hibernate.cfg.xml 配置文件。因为 applicationContext.xml 文件中,就可以完成 Hibernate 的配置。
Spring 整合 Hibernate 后的 Dao
- 编写持久层代码
- 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() } } - 声明 dao
- 在 HibernateDaoSupport 中注入 SessionFactory 获取 HibernateTemplate
- HibernateTemplate 是对 Hibernate 操作的简单封装
- 编写业务层代码
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();
}
}
- 声明 service
- 在 applicationContext.xml 中配置事务管理
- 编写测试代码
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
- 增删改
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)
- 一级缓存相关
void evict(Object entity)
void clear()
- 一级缓存与数据库交互
void flush()
void refresh(Object entity)
- 演示
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); } - 演示
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); }