Spring学习笔记(五)

Spsring整合Hibernate

首先在beans.xml中配置数据库连接的驱动和用户名,密码等属性,我们将用到dbcpdatabase connection pool)即数据库连接池---通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。在xml中的配置如下:

<bean id="dataSource" 
        class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/spring"/>
    <property name="username" value="root"/>
    <property name="password" value="root"/>
</bean>

 

在UserDAOImpl类中添加一个DataSource的引用作为DriverManager工具的替代项,DataSource对象是获取连接的首选方法。通过DataSource对象访问的驱动程序本身不会向DriverManager注册。通过查找操作获取DataSource对象,然后使用该对象创建Connection对象,UserDAOImpl代码如下:

public class UserDAOImpl implements UserDAO{
	private DataSource dataSource;
	
	public void save(User u){
		try {
			Connection conn = dataSource.getConnection();
			conn.createStatement().executeUpdate("insert into user value(null,'zhangsan')");
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		System.out.println("a user saved!");
	}
	
	public DataSource getDataSource() {
		return dataSource;
	}
	
	@Resource
	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}
}


 

这样就可以和数据库进行交互了。另一种PropertyPlaceholderConfigurer,用占位符在进行配置:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations" value="classpath:jdbc.properties"/>
</bean>
 
<bean id="dataSource" destroy-method="close"
    class="org.apache.commons.dbcp.BasicDataSource">
  <property name="driverClassName" value="${jdbc.driverClassName}"/>
  <property name="url" value="${jdbc.url}"/>
  <property name="username" value="${jdbc.username}"/>
  <property name="password" value="${jdbc.password}"/>
</bean>


这样需要定义一个Filejdbc.properties)来说明占位符所代表的东西:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring
jdbc.username=root
jdbc.password=root


现在要整合spring和hibernate在beans.xml中进行如下配置:

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="annotatedClasses">
      <list>
        <value>com.bjsxt.model.User</value>
      </list>
    </property>
    <property name="hibernateProperties">
  <props>
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
      <prop key="hibernate.show_sql">true</prop>
  </props>
</property>
</bean>


其中annotatedClasses的配置是为了在User类中使用annotation而hibernateProperties的配置和hibernate中hibernate.cfg.xml具有相同的作用,可以根据自己的需要进行配置。这样User中的代码就变为下面了:

@Entity
public class User {
	private int id;
	private String name;
	
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	
	public void setId(int id) {
		this.id = id;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
}


 

UserDAOImpl中可以通过spring来对sessionFactory进行注入,然后通过sessionFactory产生session来进行数据库的增删改查。

下面介绍使用annotation对事物进行管理(transaction management):

当对数据库进行增删改查发生异常时我们需要对事物进行回滚等处理,在之前我们经常是用try…..catch…..finally进行处理,现在可以用@Transactional代替了。在beans.xml中的配置是这样的:

<bean id="dataSource"
		class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://localhost:3306/spring" />
		<property name="username" value="root" />
		<property name="password" value="root" />
	</bean>

	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="annotatedClasses">
			<list>
				<value>com.bjsxt.model.User</value>
				<value>com.bjsxt.model.Log</value>
			</list>
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					org.hibernate.dialect.MySQLDialect
				</prop>
				<prop key="hibernate.show_sql">true</prop>
			</props>
		</property>
	</bean>

	<bean id="txManager"
		class="org.springframework.orm.hibernate4.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<tx:annotation-driven transaction-manager="txManager" />


为了逻辑上更加清晰,我把之前的代码也贴出来了,首先我们建立了一个dataSource的bean用来得到一个数据库的连接,然后建立一个sessionFactory的bean并把之前的dataSource注入进去,然后就可以用这个sessionFactory得到session了,有了session我们就可以和数据库进行交互了。我们又建立了一个txmanager来进行事物的管理,而HibernateTransactionManager需要hibernate的配置文件,所以我们有参考了sessionFactory,但是要注意的是在这里用到了tx即transaction所以需要它的命名空间以及xsd文件如下:

xmlns:tx=http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd


这样配置完成以后我们就可以用annotation了,用法是在你需要transaction的方法上面加上@Transactional,注意这里还有一个问题是我们的transaction是加在UserDAOImpl中的save上,还是加在UserServiceadd方法上,他们的效果是一样的,但当有多个实体类需要和数据库进行交互的时候,加在service上就可以对他们进行统一的管理了。在这里的@Transactional有很多属性,最重要的是propagation属性,它是一个Propagation 枚举类,其中一个是需要我们记住的Propagation.REQUIRED

当在一个方法上创建一个transaction后,如果这个方法调用了另一个方法,那么在那个方法中就不需要创建新的transaction了配置如下:

@Transactional(propagation=Propagation.REQUIRED)

下面是用XML对事物进行管理(transaction management):

Beans.xml中的配置如下:

<bean id="txManager"
		class="org.springframework.orm.hibernate4.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>
	
	<aop:config>
		<aop:pointcut id="bussinessService" expression="execution(public * com.bjsxt.service..*.*(..))"/>
		<aop:advisor pointcut-ref="bussinessService" advice-ref="txAdvice"/>
	</aop:config>
	
	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<tx:method name="getUser" read-only="true"/>
			<tx:method name="add*"/>
		</tx:attributes>
	</tx:advice>

 

首先建立一个pointcut,在这个pointcut上加事物(txAdvice),事物用到了事物管理器(txManager)由于我们用到的是Hibernate所以它用到的是HibernateTransactionManager这个事物是在getUser上加只读,在add打头的方法上为默认的required.

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值