1、第十三章spring应用spring管理hibernate第十三章spring管理hibernate 学习目标 学习内容在使用hibernate的过程中,我们体验到了把数据当成对象来处理的方便,但是仍然没有脱离从前使用jdbc时,打开连接关闭连接之类的重复操作。我们还是需要不停的打开session然后关闭,偶而在过程中还要处理一下事务。而在有了spring之后,我们这些复杂的重复劳动,终于可以解脱了。Spring提供了对orm框架的支持,这其中当然也包括了hibernate,我们可以通过spring为hibernate提供数据源,管理映射对象,管理事务等。先来做一个干扰性最小的集成方式,在本例
2、中,hibernate的配置完全由自己完成,不依赖spring,只由spring管理session对象与事务处理。创建实体对象User.javapackage ch04.entity;import java.io.Serializable;public class User implements Serializable private Integer uid; private String username; private String password; public Integer getUid() return uid; public void setUid(Integer uid)
3、 this.uid = uid; public String getUsername() return username; public void setUsername(String username) this.username = username; public String getPassword() return password; public void setPassword(String password) this.password = password; 映射文件:User.hbm.xml!DOCTYPE hibernate-mapping PUBLIC -/Hibern
4、ate/Hibernate Mapping DTD 3.0/EN hibernate.cfg.xml!DOCTYPE hibernate-configuration PUBLIC -/Hibernate/Hibernate Configuration DTD 3.0/EN root jdbc:mysql:/127.0.0.1:3306/test?&useUnicode=true&characterEncoding=gb2312 org.hibernate.dialect.MySQLDialect mysql root com.mysql.jdbc.Driver true tru
5、e UserDao.javapackage ch04.dao;import ch04.entity.User;public interface UserDao boolean add(User u); boolean del(User u); User getUserByName(User u);实现类,需要继承自org.springframework.orm.hibernate3.support.HibernateDaoSupport 类,以便于spring可以为本类对象注入sessionfactory对象。UserDaoImpl.javapackage ch04.dao.impl;impo
6、rt java.util.List;import org.springframework.dao.DataAccessException;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;import ch04.dao.UserDao;import ch04.entity.User;public class UserDaoImpl extends HibernateDaoSupport implements UserDao public boolean add(User u) try /得到操作模板 th
7、is.getHibernateTemplate().save(u); return true; catch (DataAccessException e) logger.error(e); return false; public boolean del(User u) getSession().delete(u); return false; public User getUserByName(User u) List ulist = (List) getHibernateTemplate().findByExample(u); if (ulist.size() != 0) return u
8、list.get(0); else return null; Override public String toString() return 测试; 配置文件:spring-hibernate.xml !- 详细见readme.txt - 在配置中, 用标签管理了事务的关注点,这在上次学习中已经给大家做过介绍,重点讲解一下execution的表达方式,要注意,这个方法签名定义切点的方式,支持的是方法: execution(public * *(.) 所有公有的方法, 第一个*表示返回值 第二个表示方法名 execution(* *User(.)这里第一个星表示返回值类型 上面定义了关注所有以
9、User结尾的方法 如:getUser() addUser() deleteUser() execution(* ch04.dao.UserDao.*(.)关注userdao接口定义的方法 execution(* ch04.dao.UserDao+.*(.)关注userdao接口和子类的方法,注意,这里包括了UserDaoImpl中定义的方法 execution(* com.*.*Dao.find*(.) 关注所有com包中子包内后缀为Dao的类里,以find开头的方法 关于参数的定义execution(* add(.) .表示的任意多个任意类型的参数 也可以用*来表示任意类型参数 如: ex
10、ecution(* add(*,int) execution(* add(String,.)第一个参数为String其它不限除了上面对于相应的hibernate事务处理进行aop管理之外,还可以为事务进行更详细的配置,比如: !- 这里可以指定方法名称的定义 如 propagation 事务的传播行为 : required必需的 supports支持 never从不 . read-only 事务是否是只读的 no- rollback-for 不回滚的异常 rollback-for回滚的异常,可以用,分开 - 测试类:Test.javapackage ch04.util;import org.s
11、pringframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import ch04.dao.UserDao;import ch04.entity.User;public class Test public static void main(String args) ApplicationContext ac=new ClassPathXmlApplicationContext(ch04/spring-hibernate.xm
12、l); UserDao ud=(UserDao) ac.getBean(userDao); /加用户 User u=new User(); u.setUsername(admin);/ u.setPassword(aaa); ud.add(u); u=ud.getUserByName(u); System.out.println(u.getUid()+:+u.getUsername()+:+u.getPassword(); 运行结果:Hibernate: insert into usertable (username, password) values (?, ?)Hibernate: sel
13、ect this_.uid as uid0_0_, this_.username as username0_0_, this_.password as password0_0_ from usertable this_ where ( this_.username=? )1:admin:null在上面的例子中,hibernate本身配置由自己完成,spring只起到辅助作用,帮助使用者完成了相应的sessionfactory、session及事务的管理。当然还有更深入的一些方式,比如我们可以省掉hibernate的配置文件,sessionfactory完全由spring提供。 其它部分基本一置,去掉hibernate.cfg.xml就行了,所以这里只给出配置文件写法:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1