spring学习(五)DAO

spring JDBC

想要使用Spring的JDBC模块,就必须引入两个jar文件:

  • 引入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&amp;characterEncoding=utf8&amp;useSSL=false&amp;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&amp;characterEncoding=utf8&amp;useSSL=false&amp;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注解就行了!如果想要控制整个类的事务,那么在类上面添加就行了

@Repository
public class UserDao {
   @Autowired
   private JdbcTemplate jdbcTemplate;
   public void save(){
       jdbcTemplate.execute("insert into users values('3','jerry')");
  }
}

@Service
public class UserService {
   @Autowired
   private UserDao userDao;
   @Transactional
   public void save(){
       userDao.save();
       int i=1/0;
       userDao.save();
  }
}

 

posted @ 2020-12-20 18:00  hjy1995  阅读(124)  评论(0编辑  收藏  举报