>>分享流行的Java框架以及开源软件,对孙卫琴的《精通Spring:Java Web开发技术详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 21359 个阅读者 刷新本主题
 * 贴子主题:  Spring中的JdbcTemplate 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-01-28 20:21:25     消息  查看  搜索  好友  邮件  复制  引用

                  
1、Spring中的JdbcTemplate
JdbcTemplate的作用:
  它就是用于和数据库交互的,实现对表的CRUD操作
如何创建该对象:
对象中的常用方法:
2、作业:
Spring基于AOP的事务控制
3、Spring中的事务控制
基于XML的
基于注解的

                        一、Spring中的JdbcTemplate

     持久层技术

     点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                                                    二、基于xml的aop实现事务控制

     1.bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http: // www.springframework.org/schema/beans/spring-beans.xsd
        http: // www.springframework.org/schema/aop
        http: // www.springframework.org/schema/aop/spring-aop.xsd">

     <!-- 配置Service -->
    <bean id="accountService"  class="com.itheima.service.impl.AccountServiceImpl">
        <!-- 注入dao -->
        <property name="accountDao" ref="accountDao"></property>
    </bean>

    <!--配置Dao对象-->
    <bean id="accountDao"  class="com.itheima.dao.impl.AccountDaoImpl">
        <!-- 注入QueryRunner -->
        <property name="runner" ref="runner"></property>
        <!-- 注入ConnectionUtils -->
        <property name="connectionUtils" ref="connectionUtils"></property>
    </bean>

    <!--配置QueryRunner-->
    <bean id="runner"  class="org.apache.commons.dbutils.QueryRunner" scope="prototype"></bean>

    <!-- 配置数据源 -->
    <bean id="dataSource"  class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!--连接数据库的必备信息-->
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/eesy"></property>
        <property name="user" value="root"></property>
        <property name="password" value="1234"></property>
    </bean>

    <!-- 配置Connection的工具类 ConnectionUtils -->
    <bean id="connectionUtils"  class="com.itheima.utils.ConnectionUtils">
        <!-- 注入数据源-->
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- 配置事务管理器-->
    <bean id="txManager"  class="com.itheima.utils.TransactionManager">
        <!-- 注入ConnectionUtils -->
        <property name="connectionUtils" ref="connectionUtils"></property>
    </bean>

    <!--配置aop-->
    <aop:config>
        <!--配置通用切入点表达式-->
        <aop:pointcut id="pt1" expression="execution(* com.itheima.service.impl.*.*(..))"></aop:pointcut>
        <aop:aspect id="txAdvice" ref="txManager">
            <!--配置前置通知:开启事务-->
            <aop:before method="beginTransaction" pointcut-ref="pt1"></aop:before>
            <!--配置后置通知:提交事务-->
            <aop:after-returning method="commit" pointcut-ref="pt1"></aop:after-returning>
            <!--配置异常通知:回滚事务-->
            <aop:after-throwing method="rollback" pointcut-ref="pt1"></aop:after-throwing>
            <!--配置最终通知:释放连接-->
            <aop:after method="release" pointcut-ref="pt1"></aop:after>
        </aop:aspect>
    </aop:config>
</beans>

                                      三、基于注解的aop实现事务控制

     1.bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http: // www.springframework.org/schema/beans/spring-beans.xsd
        http: // www.springframework.org/schema/aop
        http: // www.springframework.org/schema/aop/spring-aop.xsd
        http: // www.springframework.org/schema/context
        http: // www.springframework.org/schema/context/spring-context.xsd">

    <!--配置spring创建容器时要扫描的包-->
    <context:component-scan base- package="com.itheima"></context:component-scan>

        <!--配置QueryRunner-->
    <bean id="runner"  class="org.apache.commons.dbutils.QueryRunner" scope="prototype"></bean>

    <!-- 配置数据源 -->
    <bean id="dataSource"  class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!--连接数据库的必备信息-->
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/eesy"></property>
        <property name="user" value="root"></property>
        <property name="password" value="1234"></property>
    </bean>

    <!--开启spring对注解AOP的支持-->
     <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

     2.通知类TransactionManager

     (若采用配置的方式,会造成关闭连接再提交事务,采用环绕通知,由于自己编码,能解决这一问题)

package  com.itheima.utils;

import  org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.* ;
import  org.springframework.beans.factory.annotation.Autowired;
import  org.springframework.stereotype.Component;

/**
* 和事务管理相关的工具类,它包含了,开启事务,提交事务,回滚事务和释放连接
  */

@Component("txManager" )
@Aspect
public  class  TransactionManager {

    @Autowired
     private  ConnectionUtils connectionUtils;

    @Pointcut("execution(* com.itheima.service.impl.*.*(..))" )
     private  void  pt1(){}

         /**
     * 开启事务
      */

     public   void  beginTransaction(){
         try  {
            connectionUtils.getThreadConnection().setAutoCommit( false );
        } catch  (Exception e){
            e.printStackTrace();
        }
    }

     /**
     * 提交事务
      */

     public   void  commit(){
         try  {
            connectionUtils.getThreadConnection().commit();
        } catch  (Exception e){
            e.printStackTrace();
        }
    }

     /**
     * 回滚事务
      */

     public   void  rollback(){
         try  {
            connectionUtils.getThreadConnection().rollback();
        } catch  (Exception e){
            e.printStackTrace();
        }
    }

         /**
     * 释放连接
      */

     public   void  release(){
         try  {
            connectionUtils.getThreadConnection().close(); // 还回连接池中
             connectionUtils.removeConnection();
        } catch  (Exception e){
            e.printStackTrace();
        }
    }

    @Around( "pt1()" )
     public  Object aroundAdvice(ProceedingJoinPoint pjp){
        Object rtValue =  null ;
         try  {
             // 1.获取参数
            Object[] args =  pjp.getArgs();
             // 2.开启事务
             this .beginTransaction();
             // 3.执行方法
            rtValue =  pjp.proceed(args);
             // 4.提交事务
             this .commit();

             // 返回结果
             return   rtValue;

        } catch  (Throwable e){
             // 5.回滚事务
             this .rollback();
             throw  new  RuntimeException(e);
        } finally  {
             // 6.释放资源
             this .release();
        }
    }
}

                                      四、基于xml实现声明式事务控制

     1.实体类

package  com.itheima.domain;

import  java.io.Serializable;

/**
* 账户的实体类
  */

public  class Account  implements  Serializable {

     private  Integer id;
     private  String name;
     private  Float money;

     public  Integer getId() {
         return  id;
    }

     public  void  setId(Integer id) {
         this.id =  id;
    }

     public  String getName() {
         return  name;
    }

     public  void  setName(String name) {
         this.name =  name;
    }

     public  Float getMoney() {
         return  money;
    }

     public  void  setMoney(Float money) {
         this.money =  money;
    }

    @Override
     public  String toString() {
         return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                '}' ;
    }
}

     2.业务层

package  com.itheima.service;

import  com.itheima.domain.Account;

/**
* 账户的业务层接口
  */

public  interface  IAccountService {
     /**
     * 根据id查询账户信息
     *  @param  accountId
     *  @return
      */

    Account findAccountById(Integer accountId);

     /**
     * 转账
     *  @param  sourceName    转成账户名称
     *  @param  targetName    转入账户名称
     *  @param  money         转账金额
      */

     void  transfer(String sourceName,String targetName,Float money);
}

package  com.itheima.service.impl;

import  com.itheima.dao.IAccountDao;
import  com.itheima.domain.Account;
import  com.itheima.service.IAccountService;

/**
* 账户的业务层实现类
*
* 事务控制应该都是在业务层
  */

public  class AccountServiceImpl  implements  IAccountService{

     private  IAccountDao accountDao;

     public  void  setAccountDao(IAccountDao accountDao) {
         this.accountDao =  accountDao;
    }

    @Override
     public  Account findAccountById(Integer accountId) {
         return  accountDao.findAccountById(accountId);

    }

    @Override
     public  void  transfer(String sourceName, String targetName, Float money) {
        System.out.println("transfer...." );
             // 2.1根据名称查询转出账户
            Account source =  accountDao.findAccountByName(sourceName);
             // 2.2根据名称查询转入账户
            Account target =  accountDao.findAccountByName(targetName);
             // 2.3转出账户减钱
            source.setMoney(source.getMoney()- money);
             // 2.4转入账户加钱
            target.setMoney(target.getMoney()+ money);
             // 2.5更新转出账户
             accountDao.updateAccount(source);

             int i=1/0 ;

             // 2.6更新转入账户
             accountDao.updateAccount(target);
    }
}

     3.dao层

package  com.itheima.dao;

import  com.itheima.domain.Account;

/**
* 账户的持久层接口
  */

public  interface  IAccountDao {

     /**
     * 根据Id查询账户
     *  @param  accountId
     *  @return
      */

    Account findAccountById(Integer accountId);

     /**
     * 根据名称查询账户
     *  @param  accountName
     *  @return
      */

    Account findAccountByName(String accountName);

     /**
     * 更新账户
     *  @param  account
      */

     void  updateAccount(Account account);
}

package  com.itheima.dao.impl;

import  com.itheima.dao.IAccountDao;
import  com.itheima.domain.Account;
import  org.springframework.jdbc.core.BeanPropertyRowMapper;
import  org.springframework.jdbc.core.support.JdbcDaoSupport;

import  java.util.List;

/**
* 账户的持久层实现类
  */

public  class AccountDaoImpl  extends JdbcDaoSupport  implements  IAccountDao {

    @Override
     public  Account findAccountById(Integer accountId) {
        List<Account> accounts =  super.getJdbcTemplate().query("select * from account where id = ?", new BeanPropertyRowMapper<Account>(Account. class ),accountId);
         return accounts.isEmpty()? null:accounts.get(0 );
    }

    @Override
     public  Account findAccountByName(String accountName) {
        List<Account> accounts =  super.getJdbcTemplate().query("select * from account where name = ?", new BeanPropertyRowMapper<Account>(Account. class ),accountName);
         if (accounts.isEmpty()){
             return  null ;
        }
         if(accounts.size()>1 ){
             throw  new RuntimeException("结果集不唯一" );
        }
         return accounts.get(0 );
    }

    @Override
     public  void  updateAccount(Account account) {
         super.getJdbcTemplate().update("update account set name=?,money=? where id=?" ,account.getName(),account.getMoney(),account.getId());
    }
}

     4.bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation= "
        http: // www.springframework.org/schema/beans
        http: // www.springframework.org/schema/beans/spring-beans.xsd
        http: // www.springframework.org/schema/tx
        http: // www.springframework.org/schema/tx/spring-tx.xsd
        http: // www.springframework.org/schema/aop
        http: // www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- 配置业务层-->
    <bean id="accountService"  class="com.itheima.service.impl.AccountServiceImpl">
        <property name="accountDao" ref="accountDao"></property>
    </bean>

    <!-- 配置账户的持久层-->
    <bean id="accountDao"  class="com.itheima.dao.impl.AccountDaoImpl">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

        <!-- 配置数据源-->
    <bean id="dataSource"  class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/eesy"></property>
        <property name="username" value="root"></property>
        <property name="password" value="1234"></property>
    </bean>

    <!--  spring中基于XML的声明式事务控制配置步骤

         1 、配置事务管理器
         2  、配置事务的通知
                此时我们需要导入事务的约束 tx名称空间和约束,同时也需要aop的
                使用tx:advice标签配置事务通知
                    属性:
                        id:给事务通知起一个唯一标识
                        transaction- manager:给事务通知提供一个事务管理器引用
         3 、配置AOP中的通用切入点表达式
        4 、建立事务通知和切入点表达式的对应关系
        5  、配置事务的属性
               是在事务的通知tx:advice标签的内部

     -->
    <!-- 配置事务管理器 -->
    <bean id="transactionManager"  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- 配置事务的通知-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <!--  配置事务的属性
                isolation:用于指定事务的隔离级别。默认值是DEFAULT,表示使用数据库的默认隔离级别。
                propagation:用于指定事务的传播行为。默认值是REQUIRED,表示一定会有事务,增删改的选择。查询方法可以选择SUPPORTS。
                read- only:用于指定事务是否只读。只有查询方法才能设置为true。默认值是false,表示读写。
                timeout:用于指定事务的超时时间,默认值是-1 ,表示永不超时。如果指定了数值,以秒为单位。
                rollback- for :用于指定一个异常,当产生该异常时,事务回滚,产生其他异常时,事务不回滚。没有默认值。表示任何异常都回滚。
                no-rollback- for :用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时事务回滚。没有默认值。表示任何异常都回滚。
        -->
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED" read-only="false"/>
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"></tx:method>
        </tx:attributes>
    </tx:advice>

    <!-- 配置aop-->
    <aop:config>
        <!-- 配置切入点表达式-->
        <aop:pointcut id="pt1" expression="execution(* com.itheima.service.impl.*.*(..))"></aop:pointcut>
        <!--建立切入点表达式和事务通知的对应关系 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"></aop:advisor>
    </aop:config>

</beans>

                                      五、基于注解实现声明式事务配置

     1.业务层

package  com.itheima.service.impl;

import  com.itheima.dao.IAccountDao;
import  com.itheima.domain.Account;
import  com.itheima.service.IAccountService;
import  org.springframework.beans.factory.annotation.Autowired;
import  org.springframework.stereotype.Service;
import  org.springframework.transaction.annotation.Propagation;
import  org.springframework.transaction.annotation.Transactional;

/**
* 账户的业务层实现类
*
* 事务控制应该都是在业务层
  */

@Service("accountService" )
@Transactional(propagation= Propagation.SUPPORTS,readOnly= true) // 只读型事务的配置
public  class AccountServiceImpl  implements  IAccountService{

    @Autowired
     private  IAccountDao accountDao;

        @Override
     public  Account findAccountById(Integer accountId) {
         return  accountDao.findAccountById(accountId);

    }

         // 需要的是读写型事务配置
    @Transactional(propagation= Propagation.REQUIRED,readOnly= false )
    @Override
     public  void  transfer(String sourceName, String targetName, Float money) {
        System.out.println("transfer...." );
             // 2.1根据名称查询转出账户
            Account source =  accountDao.findAccountByName(sourceName);
             // 2.2根据名称查询转入账户
            Account target =  accountDao.findAccountByName(targetName);
             // 2.3转出账户减钱
            source.setMoney(source.getMoney()- money);
             // 2.4转入账户加钱
            target.setMoney(target.getMoney()+ money);
             // 2.5更新转出账户
             accountDao.updateAccount(source);

//             int i=1/0;

             // 2.6更新转入账户
             accountDao.updateAccount(target);
    }
}

                   2.dao层

package  com.itheima.dao.impl;

import  com.itheima.dao.IAccountDao;
import  com.itheima.domain.Account;
import  org.springframework.beans.factory.annotation.Autowired;
import  org.springframework.jdbc.core.BeanPropertyRowMapper;
import  org.springframework.jdbc.core.JdbcTemplate;
import  org.springframework.stereotype.Repository;

import  java.util.List;

/**
* 账户的持久层实现类
  */

@Repository("accountDao" )
public  class AccountDaoImpl  implements  IAccountDao {

    @Autowired
     private  JdbcTemplate jdbcTemplate;

    @Override
     public  Account findAccountById(Integer accountId) {
        List<Account> accounts = jdbcTemplate.query("select * from account where id = ?", new BeanPropertyRowMapper<Account>(Account. class ),accountId);
         return accounts.isEmpty()? null:accounts.get(0 );
    }

    @Override
     public  Account findAccountByName(String accountName) {
        List<Account> accounts = jdbcTemplate.query("select * from account where name = ?", new BeanPropertyRowMapper<Account>(Account. class ),accountName);
         if (accounts.isEmpty()){
             return  null ;
        }
         if(accounts.size()>1 ){
             throw  new RuntimeException("结果集不唯一" );
        }
         return accounts.get(0 );
    }

    @Override
     public  void  updateAccount(Account account) {
        jdbcTemplate.update("update account set name=?,money=? where id=?" ,account.getName(),account.getMoney(),account.getId());
    }
}

                   3.bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation= "
        http: // www.springframework.org/schema/beans
        http: // www.springframework.org/schema/beans/spring-beans.xsd
        http: // www.springframework.org/schema/tx
        http: // www.springframework.org/schema/tx/spring-tx.xsd
        http: // www.springframework.org/schema/aop
        http: // www.springframework.org/schema/aop/spring-aop.xsd
        http: // www.springframework.org/schema/context
        http: // www.springframework.org/schema/context/spring-context.xsd">

    <!-- 配置spring创建容器时要扫描的包-->
    <context:component-scan base- package="com.itheima"></context:component-scan>

    <!-- 配置JdbcTemplate-->
    <bean id="jdbcTemplate"  class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

            <!-- 配置数据源-->
    <bean id="dataSource"  class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/eesy"></property>
        <property name="username" value="root"></property>
        <property name="password" value="1234"></property>
    </bean>

    <!--  spring中基于注解 的声明式事务控制配置步骤
        1 、配置事务管理器
        2 、开启spring对注解事务的支持
        3 、在需要事务支持的地方使用@Transactional注解

         -->
    <!-- 配置事务管理器 -->
    <bean id="transactionManager"  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

            <!-- 开启spring对注解事务的支持-->
    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

</beans>

                   4.测试类

                                      六、基于纯注解实现声明式事务控制

     1.业务层

package  com.itheima.service.impl;

import  com.itheima.dao.IAccountDao;
import  com.itheima.domain.Account;
import  com.itheima.service.IAccountService;
import  org.springframework.beans.factory.annotation.Autowired;
import  org.springframework.stereotype.Service;
import  org.springframework.transaction.annotation.Propagation;
import  org.springframework.transaction.annotation.Transactional;

/**
* 账户的业务层实现类
*
* 事务控制应该都是在业务层
  */

@Service("accountService" )
@Transactional(propagation= Propagation.SUPPORTS,readOnly= true) // 只读型事务的配置
public  class AccountServiceImpl  implements  IAccountService{

    @Autowired
     private  IAccountDao accountDao;

        @Override
     public  Account findAccountById(Integer accountId) {
         return  accountDao.findAccountById(accountId);

    }

         // 需要的是读写型事务配置
    @Transactional(propagation= Propagation.REQUIRED,readOnly= false )
    @Override
     public  void  transfer(String sourceName, String targetName, Float money) {
        System.out.println("transfer...." );
             // 2.1根据名称查询转出账户
            Account source =  accountDao.findAccountByName(sourceName);
             // 2.2根据名称查询转入账户
            Account target =  accountDao.findAccountByName(targetName);
             // 2.3转出账户减钱
            source.setMoney(source.getMoney()- money);
             // 2.4转入账户加钱
            target.setMoney(target.getMoney()+ money);
             // 2.5更新转出账户
             accountDao.updateAccount(source);

//             int i=1/0;

             // 2.6更新转入账户
             accountDao.updateAccount(target);
    }
}

     2.dao层

package  com.itheima.dao.impl;

import  com.itheima.dao.IAccountDao;
import  com.itheima.domain.Account;
import  org.springframework.beans.factory.annotation.Autowired;
import  org.springframework.jdbc.core.BeanPropertyRowMapper;
import  org.springframework.jdbc.core.JdbcTemplate;
import  org.springframework.stereotype.Repository;

import  java.util.List;

/**
* 账户的持久层实现类
  */

@Repository("accountDao" )
public  class AccountDaoImpl  implements  IAccountDao {

    @Autowired
     private  JdbcTemplate jdbcTemplate;

    @Override
     public  Account findAccountById(Integer accountId) {
        List<Account> accounts = jdbcTemplate.query("select * from account where id = ?", new BeanPropertyRowMapper<Account>(Account. class ),accountId);
         return accounts.isEmpty()? null:accounts.get(0 );
    }

    @Override
     public  Account findAccountByName(String accountName) {
        List<Account> accounts = jdbcTemplate.query("select * from account where name = ?", new BeanPropertyRowMapper<Account>(Account. class ),accountName);
         if (accounts.isEmpty()){
             return  null ;
        }
         if(accounts.size()>1 ){
             throw  new RuntimeException("结果集不唯一" );
        }
         return accounts.get(0 );
    }

    @Override
     public  void  updateAccount(Account account) {
        jdbcTemplate.update("update account set name=?,money=? where id=?" ,account.getName(),account.getMoney(),account.getId());
    }
}

   3.配置类

     3.1  SpringConfig

package  config;

import  org.springframework.context.annotation.ComponentScan;
import  org.springframework.context.annotation.Configuration;
import  org.springframework.context.annotation.Import;
import  org.springframework.context.annotation.PropertySource;
import  org.springframework.transaction.annotation.EnableTransactionManagement;

/**
* spring的配置类,相当于bean.xml
  */

@Configuration
@ComponentScan("com.itheima" )
@Import({JdbcConfig. class,TransactionConfig. class })
@PropertySource("jdbcConfig.properties" )
@EnableTransactionManagement
public  class  SpringConfiguration {
}

     3.2 TransactionManager

package  config;

import  org.springframework.context.annotation.Bean;
import  org.springframework.jdbc.datasource.DataSourceTransactionManager;
import  org.springframework.transaction.PlatformTransactionManager;

import  javax.sql.DataSource;

/**
* 和事务相关的配置类
  */

public  class  TransactionConfig {

     /**
     * 用于创建事务管理器对象
     *  @param  dataSource
     *  @return
      */

    @Bean(name="transactionManager" )
     public  PlatformTransactionManager createTransactionManager(DataSource dataSource){
         return  new  DataSourceTransactionManager(dataSource);
    }
}

     3.3 JdbcConfig

package  config;

import  org.springframework.beans.factory.annotation.Value;
import  org.springframework.context.annotation.Bean;
import  org.springframework.jdbc.core.JdbcTemplate;
import  org.springframework.jdbc.datasource.DriverManagerDataSource;

import  javax.sql.DataSource;

/**
* 和连接数据库相关的配置类
  */

public  class  JdbcConfig {

    @Value("${jdbc.driver}" )
     private  String driver;

    @Value("${jdbc.url}" )
     private  String url;

    @Value("${jdbc.username}" )
     private  String username;

    @Value("${jdbc.password}" )
     private  String password;

     /**
     * 创建JdbcTemplate
     *  @param  dataSource
     *  @return
      */

    @Bean(name="jdbcTemplate" )
     public  JdbcTemplate createJdbcTemplate(DataSource dataSource){
         return  new  JdbcTemplate(dataSource);
    }

     /**
     * 创建数据源对象
     *  @return
      */

    @Bean(name="dataSource" )
     public  DataSource createDataSource(){
        DriverManagerDataSource ds =  new  DriverManagerDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
         return  ds;
    }
}

     3.4 JdbcConfig.properties

jdbc.driver= com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql: // localhost:3306/eesy
jdbc.username= root
jdbc.password=1234

     3.5  测试类

package  com.itheima.test;

import  com.itheima.service.IAccountService;
import  config.SpringConfiguration;
import  org.junit.Test;
import  org.junit.runner.RunWith;
import  org.springframework.beans.factory.annotation.Autowired;
import  org.springframework.test.context.ContextConfiguration;
import  org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
* 使用Junit单元测试:测试我们的配置
  */

@RunWith(SpringJUnit4ClassRunner. class )
@ContextConfiguration(classes= SpringConfiguration. class )
public  class  AccountServiceTest {

    @Autowired
     private   IAccountService as;

    @Test
     public   void  testTransfer(){
        as.transfer("aaa","bbb" ,100f);

    }

}

        ----------------------------
原文链接:https://www.cnblogs.com/lsk-130602/p/12230411.html

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-01-29 11:44:40 重新编辑]
  Java面向对象编程-->Swing组件(上)
  JavaWeb开发-->自定义JSP标签(Ⅱ)
  JSP与Hibernate开发-->Java应用分层架构及软件模型
  Java网络编程-->Java网络编程入门
  精通Spring-->通过Axios访问服务器
  Vue3开发-->Vue CLI脚手架工具
  SSE(Server Sent Events) HTTP服务端推送详解 - hadoop_a9bb...
  微服务的拆分方式
  Spring MVC的拦截器的详细用法
  【项目实践】有了SpringBoot还有必要学SSM整合吗 - RudeCrab...
  回字有四种写法,那你知道单例有五种写法吗
  Spring Data JPA详解
  深入Redis客户端(redis客户端属性、redis缓冲区、关闭redis客...
  说说微服务的优缺点
  探讨通过Feign配合Hystrix进行调用时异常的处理
  理解 RESTful 风格的 API
  Spring Cloud 技术栈及架构一览
  另一种缓存,Spring Boot 整合 Ehcache
  Zabbix后端存储ES的优化实践
  微服务中的Kafka与Micronaut
  springmvc+ajax异步上传图片
  更多...
 IPIP: 已设置保密
楼主      
该用户目前不在线 nihaota 
  
威望: 0
级别: 新手上路
魅力: 1315
经验: 1315
现金: 2944
发文章数: 243
注册时间: 0001-01-01
 消息  查看  搜索  好友  邮件  复制  引用


讨债公司
发文章时间 2022-10-28 20:12:56
 IPIP: 已设置保密 1 楼     
1页 1条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。