您的位置:首页 > 编程语言 > Java开发

Spring学习笔记(五)

2012-06-12 11:14 465 查看
Spsring整合Hibernate
首先在beans.xml中配置数据库连接的驱动和用户名,密码等属性,我们将用到dbcp(database 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>


这样需要定义一个File(jdbc.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上,还是加在UserService的add方法上,他们的效果是一样的,但当有多个实体类需要和数据库进行交互的时候,加在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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: