spring学习(五)DAO
spring JDBC
-
引入jar文件
-
-
spring-jdbc-3.2.5.RELEASE.jar 数据库连接
-
spring-tx-3.2.5.RELEASE.jar 数据库事务管理
-
c3p0-0.9.5.2.jar 数据库连接池
-
-
JDBC对C3P0数据库连接池是有很好的支持的。因此我们直接可以使用Spring的依赖注入,在配置文件中配置dataSource就行了
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC"/>
<property name="user" value="root"/>
<property name="password" value="123456"/>
<property name="initialPoolSize" value="3"/>
<property name="maxPoolSize" value="10"/>
<property name="maxStatements" value="100"/>
<property name="acquireIncrement" value="2"/>
</bean>
-
Spring来提供了JdbcTemplate这么一个类给我们使用!它封装了DataSource,也就是说我们可以在Dao中使用JdbcTemplate执行sql语句就行了
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
事务
Spring的事务控制是属于Spring Dao模块的。
一般地,我们事务控制都是在service层做的。。为什么是在service层而不是在dao层呢??有没有这样的疑问…
service层是业务逻辑层,service的方法一旦执行成功,那么说明该功能没有出错。
一个service方法可能要调用dao层的多个方法…如果在dao层做事务控制的话,一个dao方法出错了,仅仅把事务回滚到当前dao的功能,这样是不合适的[因为我们的业务由多个dao方法组成]。如果没有出错,调用完dao方法就commit了事务,这也是不合适的[导致太多的commit操作]。
事务控制分为两种:
-
编程式事务控制
-
声明式事务控制
编程式事务控制
自己手动控制事务,就叫做编程式事务控制。
-
Jdbc代码:
-
-
Conn.setAutoCommite(false); // 设置手动控制事务
-
-
Hibernate代码:
-
-
Session.beginTransaction(); // 开启一个事务
-
-
【细粒度的事务控制: 可以对指定的方法、指定的方法的某几行添加事务控制】
-
(比较灵活,但开发起来比较繁琐: 每次都要开启、提交、回滚.)
声明式事务控制
Spring提供对事务的控制管理就叫做声明式事务控制
Spring提供了对事务控制的实现。
-
如果用户想要使用Spring的事务控制,只需要配置就行了。
-
当不用Spring事务的时候,直接移除就行了。
-
Spring的事务控制是基于AOP实现的。因此它的耦合度是非常低的。
-
【粗粒度的事务控制: 只能给整个方法应用事务,不可以对方法的某几行应用事务。】(因为aop拦截的是方法。)
Spring给我们提供了事务的管理器类,事务管理器类又分为两种,因为JDBC的事务和Hibernate的事务是不一样的。
-
Spring声明式事务管理器类:
-
-
Jdbc技术:DataSourceTransactionManager
-
Hibernate技术:HibernateTransactionManager
-
基于Spring的JDBC事务控制
引入相关jar包
-
AOP相关的jar包【因为Spring的声明式事务控制是基于AOP的,那么就需要引入AOP的jar包。】
-
引入tx名称空间
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
-
引入AOP名称空间
-
引入jdbcjar包【jdbc.jar包和tx.jar包】
使用注解的方式实现事务控制,首先配置applicationContext.xml
<!--配置数据库连接池信息-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC"/>
<property name="user" value="root"/>
<property name="password" value="123456"/>
<property name="initialPoolSize" value="3"/>
<property name="maxPoolSize" value="10"/>
<property name="maxStatements" value="100"/>
<property name="acquireIncrement" value="2"/>
</bean>
<!--配置jdbcTemplate对象,用来执行sql语句-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置事务管理器类-->
<bean id="txManage" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--引用数据库连接池-->
<property name="dataSource" ref="dataSource"/>
</bean>
<!--开启以注解的方式实现事务控制-->
<tx:annotation-driven transaction-manager="txManage"/>
想要控制哪个方法事务,在方法添加@Transactional注解就行了!如果想要控制整个类的事务,那么在类上面添加就行了