zoukankan      html  css  js  c++  java
  • 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();
      }
    }

     

  • 相关阅读:
    登入界面的创建
    什么是IO流 以及文件输入输出
    java 的面向对象
    Mac 终端命令大全
    jQuery 的属性
    商城管理系统
    Java IO学习第二天部分详解
    Java IO学习第一天部分详解
    用JAVA描述一个车与修车厂两个事物
    JAVA基础(数组)数组排序和查找数组中是否还有某一个数
  • 原文地址:https://www.cnblogs.com/yjh1995/p/14164354.html
Copyright © 2011-2022 走看看