Spring整合Hibernate
来源:互联网 发布:linux防火墙状态 编辑:程序博客网 时间:2024/05/17 05:04
在前一个项目SpringDemo的基础上加以改进,将Hibernate整合到项目中。
1、导入Hibernate所需jar包,这里我用的是Hibernate3.3.2版本的。
主要导入这几个包:antlr-2.7.6.jar、commons-collections-3.1.jar、dom4j.jar、ejb3、hibernate3.jar、hibernate-annotations、hibernate-common-annotations、javassist-3.9.0.GA.jar、jta-1.1.jar、slf4j-api.jar、slf4j-nop.jar;此外还有cglib。
缺少jar包,会在运行时出现各奇怪缺包的错误,需根据控制台信息添加jar包。比如ERROR:Ljavax/transaction/TransactionManager;是因为缺少jta.jar包。
我确实还不是很清楚Hibernate中各jar包的功能,好几个包都是根据错误信息逐个添加进去的。
2、这里我采用Spring风格的配置,无需新建hibernate.cfg.html文件,直接在在applicationContext.xml中对Hibernate进行配置。
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 启动包扫描功能,将带有@Controller、@Service、@repository、@Component等注解的类 自动转化为成为spring的bean --> <context:component-scan base-package="com.demo.service" /> <context:component-scan base-package="com.demo.dao" /> <!-- 数据源配置的文件,引入spring容器 --> <context:property-placeholderlocation="classpath:database.properties" /> <!-- dataSource,配置构建基于DBCP的数据源 --> <beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"lazy-init="false"p:driverClassName="${dataSource.driverClassName}"p:url="${dataSource.url}"p:username="${dataSource.username}"p:password="${dataSource.password}"p:maxActive="${dataSource.maxActive}"p:maxIdle="${dataSource.maxIdle}"p:maxWait="${dataSource.maxWait}" /> <!-- 定义jdbcTemplate模版的Bean <beanclass="org.springframework.jdbc.core.JdbcTemplate"p:dataSource-ref="dataSource" />--><!-- sessionFactory --><bean id="sessionFactory"class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"p:dataSource-ref="dataSource"><!-- 这里使用AnnotationSessionFactoryBean,以使用实体类的注解获取ORM配置信息 --><!-- 若使用LocalSessionFactoryBean,则用mappingLocations属性和xml文件获取配置 --><property name="annotatedClasses"><!-- name="packageToScan",则加载包类的带注解实体类 --><list><value>com.demo.domain.Account</value></list></property><!-- 指定hibernate配置属性 --><property name="hibernateProperties"><props><prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop><prop key="hibernate.show_sql">true</prop></props></property></bean><!-- 定义hibernateTemplete的Bean --><bean id="hibernateTemplete" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 更改后的Hibernate事务管理配置 --><bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <tx:annotation-driven transaction-manager="txManager"/> <!-- 事务管理配置 <beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"p:dataSource-ref="dataSource" /><tx:annotation-driventransaction-manager="transactionManager" /> --> </beans>
注:这里主要是配置了sessionFactory;Spring框架为创建SessionFactory提供了FactoryBean工厂类。
LocalSessionFactoryBean或AnnotationSessionFactoryBean可利用Hibernate配置文件创建SessionFactory代理对象,以便和Spring的事务机制配合工作。
3、在Account实体类中添加注解,使之能被hibernate持久化。package com.demo.domain;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Table;@Entity//@Entity表示该类能被hibernate持久化@Table(name="user")public class Account {@Id//指定该列为主键@GeneratedValue(strategy=GenerationType.AUTO)//auto为自增长private Integer id;@Column(name="name")private String username;@Column(name="password")private String password;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}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;}public Account(){}}4、修改AccountDaoImpl;把原来的函数注释掉,用注入的hibernateTemplate来进行数据库操作。
修改后的AccountDaoImpl.java代码如下:
package com.demo.dao.impl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.orm.hibernate3.HibernateTemplate;import org.springframework.stereotype.Repository;import com.demo.dao.AccountDao;import com.demo.domain.Account;@Repositorypublic class AccountDaoImpl implements AccountDao {/*@Autowiredprivate JdbcTemplate jdbcTemplate;*/@Autowiredprivate HibernateTemplate hibernateTemplate;@Overridepublic int getMatchCount(String username, String password) {return hibernateTemplate.find("from Account a where a.username = ? "+ "and a.password = ? ",username, password).size();}@Overridepublic Account getAcoountById(int id) {return hibernateTemplate.get(Account.class, id);}@Overridepublic Account getAccountByName(String username) {//return hibernateTemplate.get(Account.class, username); //errorreturn (Account) hibernateTemplate.find("from Account a where a.username = ?", username).get(0);}/*@Overridepublic int getMatchCount(String username, String password) {String strSql = "select count(*) from user "+ " where name = ? and password = ?";//?为参数占位符return jdbcTemplate.queryForInt(strSql, new Object[]{ username, password});}@Overridepublic Account getAcoountById(int id) {String strSql = "select id,name from user "+ " where id = ?";System.out.println("##########execute sql: "+strSql);final Account account = new Account();jdbcTemplate.query(strSql, new Object[]{ id },//匿名方式实现的回调函数new RowCallbackHandler(){@Overridepublic void processRow(ResultSet rs) throws SQLException {//将查询结果封装到对象实例中account.setId(rs.getInt("id"));account.setUsername(rs.getString("name"));}});return account;}@Overridepublic Account getAccountByName(String username) {String strSql = "select id,name from user "+ " where name = ?";System.out.println("##########execute sql: "+strSql);final Account account = new Account();jdbcTemplate.query(strSql, new Object[]{ username },//匿名方式实现的回调函数new RowCallbackHandler(){@Overridepublic void processRow(ResultSet rs) throws SQLException {//将查询结果封装到对象实例中account.setId(rs.getInt("id"));account.setUsername(rs.getString("name"));}});return account;}*/}
注:代码明显短了不少,是不是~~~。
基于模版类使用Hibernate是最简单的方式,HibernateTemplate代理了Hibernate Session的大多数持久化操作,调用也确实简单。
5、运行效果跟之前SpringDemo一样。[2014-11-27 17:40:40,578][DEBUG][org.hibernate.hql.ast.AST:266] - --- HQL AST --- \-[QUERY] 'query' +-[SELECT_FROM] 'SELECT_FROM' | \-[FROM] 'from' | \-[RANGE] 'RANGE' | +-[DOT] '.' | | +-[DOT] '.' | | | +-[DOT] '.' | | | | +-[IDENT] 'com' | | | | \-[IDENT] 'demo' | | | \-[IDENT] 'domain' | | \-[IDENT] 'Account' | \-[ALIAS] 'a' \-[WHERE] 'where' \-[EQ] '=' +-[DOT] '.' | +-[IDENT] 'a' | \-[IDENT] 'username' \-[PARAM] '?'[2014-11-27 17:40:40,579][DEBUG][org.hibernate.hql.ast.ErrorCounter:68] - throwQueryException() : no errors......[2014-11-27 17:40:40,716][DEBUG][org.hibernate.SQL:401] - select account0_.id as id0_, account0_.password as password0_, account0_.name as name0_ from user account0_ where account0_.name=?Hibernate: select account0_.id as id0_, account0_.password as password0_, account0_.name as name0_ from user account0_ where account0_.name=?......[2014-11-27 17:40:40,812][DEBUG][org.hibernate.jdbc.ConnectionManager:421] - opening JDBC connection[2014-11-27 17:40:40,813][DEBUG][org.hibernate.SQL:401] - select account0_.id as id0_0_, account0_.password as password0_0_, account0_.name as name0_0_ from user account0_ where account0_.id=?Hibernate: select account0_.id as id0_0_, account0_.password as password0_0_, account0_.name as name0_0_ from user account0_ where account0_.id=?......通过控制台信息,可以看到整合了Hibernate后的运行流程。
用Hibernate作为持久化技术还是比Spring JDBC便捷不少的。
6、总结:通过在Spring中整合Hibernate的Demo,可以发现框架有其各自的优势和不足,整合时的配置方式多样。
Java框架也是巨多,在实际开发,根据需求选择合适的框架即可,不必拘泥于其中一两个。
后面,将继续把Struts2整合到该项目中,这样就搭建起了一个完整基于SSH框架的项目,万里长征第一步。
- Spring:Spring整合Hibernate
- 【Spring】Spring+hibernate整合
- struts整合spring整合hibernate
- spring 整合hibernate整合方式
- 整合 struts spring hibernate
- struts+spring+hibernate整合
- struts,hibernate,spring整合
- struts+spring+hibernate整合
- struts+spring+hibernate整合
- Spring+hibernate+DWR整合
- webwork+spring+hibernate整合
- webwork+spring+hibernate整合
- Spring整合Hibernate
- Struts hibernate Spring 整合
- Struts hibernate Spring 整合
- Spring整合Hibernate
- 整合Spring、Struts、Hibernate
- webwork+spring+hibernate整合
- 不用json文件不用数据库存储实现三级联动
- 数组、指针数组、数组指针、返回数组指针的函数的关系
- 网络编程中概念
- 单独测试类的私有函数
- 给线程加个名
- Spring整合Hibernate
- OpenJudge - 1088:滑雪
- Environment和StatFs
- Android设计中的.9.png
- 函数重载
- readelf 命令详解
- extjs调试错误 TypeError:p is null 或 TypeError: el is null
- C#学习笔记3
- 【动态规划】Dynamic Programming