zoukankan      html  css  js  c++  java
  • 解析Spring第四天(Spring中的事物、Spring框架来管理模板类)

    • JDBC模板技术:

      Spring框架中提供了很多持久层的模板类来简化编程,使用模板类编写程序会变的简单

      • template 模板
      • 都是Spring框架提供XxxTemplate

      提供了JDBC模板,Spring框架提供的

      • JdbcTemplate类,Connection 表示连接,管理事务 Statement ResultSet
    • 如何使用JDBC模板类?
    • 在数据库中新增表结构和数据
       1 DROP TABLE IF EXISTS `account`;
       2 CREATE TABLE `account` (
       3   `id` int(11) NOT NULL AUTO_INCREMENT,
       4   `name` varchar(40) DEFAULT NULL,
       5   `money` double DEFAULT NULL,
       6   PRIMARY KEY (`id`)
       7 ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
       8 
       9 -- ----------------------------
      10 -- Records of account
      11 -- ----------------------------
      12 INSERT INTO `account` VALUES ('1', 'aaa', '1000');
      13 INSERT INTO `account` VALUES ('2', 'bbb', '1000');
      14 INSERT INTO `account` VALUES ('3', 'ccc', '1000');
      15 INSERT INTO `account` VALUES ('4', '熊大', '700');
      16 INSERT INTO `account` VALUES ('5', '熊二', '1200');
      17 INSERT INTO `account` VALUES ('6', '熊三', '800');
    • 创建一个普通的Maven工程,引入坐标
     1 <dependencies>
     2     <dependency>
     3         <groupId>org.springframework</groupId>
     4         <artifactId>spring-context</artifactId>
     5         <version>5.0.2.RELEASE</version>
     6     </dependency>
     7     <dependency>
     8         <groupId>commons-logging</groupId>
     9         <artifactId>commons-logging</artifactId>
    10         <version>1.2</version>
    11     </dependency>
    12     <dependency>
    13         <groupId>log4j</groupId>
    14         <artifactId>log4j</artifactId>
    15         <version>1.2.12</version>
    16     </dependency>
    17     <dependency>
    18         <groupId>junit</groupId>
    19         <artifactId>junit</artifactId>
    20         <version>4.12</version>
    21     </dependency>
    22     <dependency>
    23         <groupId>org.springframework</groupId>
    24         <artifactId>spring-test</artifactId>
    25         <version>5.0.2.RELEASE</version>
    26     </dependency>
    27     
    28     <dependency>
    29         <groupId>aopalliance</groupId>
    30         <artifactId>aopalliance</artifactId>
    31         <version>1.0</version>
    32     </dependency>
    33     <dependency>
    34         <groupId>org.springframework</groupId>
    35         <artifactId>spring-aspects</artifactId>
    36         <version>5.0.2.RELEASE</version>
    37     </dependency>
    38     <dependency>
    39         <groupId>org.aspectj</groupId>
    40         <artifactId>aspectjweaver</artifactId>
    41         <version>1.8.13</version>
    42     </dependency>
    43     <dependency>
    44         <groupId>mysql</groupId>
    45         <artifactId>mysql-connector-java</artifactId>
    46         <version>5.1.6</version>
    47     </dependency>
    48     <dependency>
    49         <groupId>org.springframework</groupId>
    50         <artifactId>spring-jdbc</artifactId>
    51         <version>5.0.2.RELEASE</version>
    52     </dependency>
    53     <dependency>
    54         <groupId>org.springframework</groupId>
    55         <artifactId>spring-tx</artifactId>
    56         <version>5.0.2.RELEASE</version>
    57     </dependency>
    58   </dependencies>
    • 使用Spring框架来管理模板类,Spring管理内置的连接池
       1 <?xml version="1.0" encoding="UTF-8"?>
       2 <beans xmlns="http://www.springframework.org/schema/beans"
       3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       4        xmlns:context="http://www.springframework.org/schema/context"
       5        xmlns:aop="http://www.springframework.org/schema/aop"
       6        xsi:schemaLocation="
       7                 http://www.springframework.org/schema/beans
       8                 http://www.springframework.org/schema/beans/spring-beans.xsd
       9                 http://www.springframework.org/schema/context
      10                 http://www.springframework.org/schema/context/spring-context.xsd
      11                 http://www.springframework.org/schema/aop
      12                 http://www.springframework.org/schema/aop/spring-aop.xsd">
      13 14     <!--配置连接池-->
      15     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      16         <property name="driverClassName" value="com.mysql.jdbc.Driver" />
      17         <property name="url" value="jdbc:mysql:///spring_db" />
      18         <property name="username" value="root" />
      19         <property name="password" value="root" />
      20     </bean>
      21 22     <!--配置jdbc模板-->
      23     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
      24         <property name="dataSource" ref="dataSource" />
      25     </bean>
      26 27 </beans>
    • 测试jdbcTemplate
      package cn.tx.test;
      ​
      import org.junit.Test;
      import org.junit.runner.RunWith;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.jdbc.core.JdbcTemplate;
      import org.springframework.test.context.ContextConfiguration;
      import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
      ​
      
      @RunWith(SpringJUnit4ClassRunner.class)
      @ContextConfiguration(value = "classpath:applicationContext_jdbc.xml")
      public class Demo1_1 {
      ​
          @Autowired
          private JdbcTemplate jdbcTemplate;
      ​
          /**
           * 测试的方式
           */
          @Test
          public void run1(){
              jdbcTemplate.update("insert into account values (null,?,?)","熊二",500);
          }
      ​
      }
    • Spring框架管理开源的连接池

    • 配置开源的连接池,使用Druid的连接池,引入坐标
      <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid</artifactId>
          <version>1.1.10</version>
      </dependency>
    • 新建 一个属性文件后缀为.properties。配置连接数据库的基本信息
      1 jdbc.driverClassName=com.mysql.jdbc.Driver
      2     jdbc.url=jdbc:mysql:///spring_db
      3     jdbc.username=root
      4     jdbc.password=root
    • 在xml的文件中配置读取属性文件,连接数据库和配置jdbc模板
       1 <?xml version="1.0" encoding="UTF-8"?>
       2 <beans xmlns="http://www.springframework.org/schema/beans"
       3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       4        xmlns:context="http://www.springframework.org/schema/context"
       5        xmlns:aop="http://www.springframework.org/schema/aop"
       6        xsi:schemaLocation="
       7                 http://www.springframework.org/schema/beans
       8                 http://www.springframework.org/schema/beans/spring-beans.xsd
       9                 http://www.springframework.org/schema/context
      10                 http://www.springframework.org/schema/context/spring-context.xsd
      11                 http://www.springframework.org/schema/aop
      12                 http://www.springframework.org/schema/aop/spring-aop.xsd">
      13 14     <!--配置连接池,使用的是Spring框架内置的连接池
      15     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      16         <property name="driverClassName" value="com.mysql.jdbc.Driver" />
      17         <property name="url" value="jdbc:mysql:///spring_db" />
      18         <property name="username" value="root" />
      19         <property name="password" value="root" />
      20     </bean>
      21     -->
      22 23     <!--使用开源连接池
      24     <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
      25         <property name="driverClassName" value="com.mysql.jdbc.Driver" />
      26         <property name="url" value="jdbc:mysql:///spring_db" />
      27         <property name="username" value="root" />
      28         <property name="password" value="root" />
      29     </bean>
      30     -->
      31 32     <!--加载属性文件
      33     <bean id="placeholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
      34         <property name="location" value="classpath:jdbc.properties" />
      35     </bean>
      36     -->
      37 38     <!--第二种写法:使用提供标签的方式-->
      39     <context:property-placeholder location="classpath:jdbc.properties" />
      40 41     <!--加载属性的文件-->
      42     <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
      43         <property name="driverClassName" value="${jdbc.driverClassName}" />
      44         <property name="url" value="${jdbc.url}" />
      45         <property name="username" value="${jdbc.username}" />
      46         <property name="password" value="${jdbc.password}" />
      47     </bean>
      48 49     <!--配置jdbc模板-->
      50     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
      51         <property name="dataSource" ref="dataSource" />
      52     </bean>
      53 54 </beans>
    • 对数据的基本操作做测试,增删改查
      package cn.tx.test;
      ​
      import cn.tx.demo1.Account;
      import org.junit.Test;
      import org.junit.runner.RunWith;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.jdbc.core.JdbcTemplate;
      import org.springframework.jdbc.core.RowMapper;
      import org.springframework.test.context.ContextConfiguration;
      import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
      ​
      import java.sql.ResultSet;
      import java.sql.SQLException;
      import java.util.List;
      ​
      
      @RunWith(SpringJUnit4ClassRunner.class)
      @ContextConfiguration(value = "classpath:applicationContext_jdbc.xml")
      public class Demo1_1 {
      ​
          @Autowired
          private JdbcTemplate jdbcTemplate;
      ​
          /**
           * 测试的方式
           */
          @Test
          public void run1(){
              jdbcTemplate.update("insert into account values (null,?,?)","熊四",800);
          }
      ​
          /**
           * 修改
           */
          @Test
          public void run2(){
              jdbcTemplate.update("update account set name = ?,money = ? where id = ?","光头强",100,7);
          }
      ​
          /**
           * 删除
           */
          @Test
          public void run3(){
              jdbcTemplate.update("delete from account where id = ?",7);
          }
      ​
          /**
           * 通过id查询
           */
          @Test
          public void run4(){
              Account account = jdbcTemplate.queryForObject("select * from account where id = ?", new BeanMapper(), 6);
              System.out.println(account);
          }
      ​
          /**
           * 查询所有的数据
           */
          @Test
          public void run5(){
              List<Account> list = jdbcTemplate.query("select * from account", new BeanMapper());
              for (Account account : list) {
                  System.out.println(account);
              }
          }
      ​
      }
      ​
      /**
       * 实现类,用来进行数据封装的
       */
      class BeanMapper implements RowMapper<Account>{
      ​
          /**
           * 是一行一行进行数据封装的
           * @param resultSet
           * @param i
           * @return
           * @throws SQLException
           */
          @Override
          public Account mapRow(ResultSet resultSet, int i) throws SQLException {
              Account account = new Account();
              account.setId(resultSet.getInt("id"));
              account.setName(resultSet.getString("name"));
              account.setMoney(resultSet.getDouble("money"));
              return account;
          }
      ​
      }

      模拟转账

    • 编写service层代码
      package cn.tx.demo2;
      ​
      
      public interface AccountService {
      ​
          /**
           * 转账的方法
           * @param out       付款人
           * @param in        收款人
           * @param money     金额
           */
          public void pay(String out,String in,double money);
      ​
      }
    • 实现接口
      package cn.tx.demo2;
      ​
      
      public class AccountServiceImpl implements AccountService {
      ​
          private AccountDao accountDao;
          public void setAccountDao(AccountDao accountDao) {
              this.accountDao = accountDao;
          }
      ​
          /**
           * 转账方法
           * @param out       付款人
           * @param in        收款人
           * @param money     金额
           */
          @Override
          public void pay(String out, String in, double money) {
              // 调用dao方法
              accountDao.outMoney(out,money);
      ​
              accountDao.inMoney(in,money);
          }
      ​
      }
    • dao层的代码
      package cn.tx.demo2;
      ​
      
      public interface AccountDao {
      ​
          /**
           * 付款
           * @param out
           * @param money
           */
          public void outMoney(String out,double money);
      ​
          /**
           * 收款
           * @param in
           * @param money
           */
          public void inMoney(String in,double money);
      ​
      }
      ​
    • 实现dao层的接口
      package cn.tx.demo2;
      ​
      import org.springframework.jdbc.core.JdbcTemplate;
      ​
      
      public class AccountDaoImpl implements AccountDao {
      ​
          private JdbcTemplate jdbcTemplate;
          public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
              this.jdbcTemplate = jdbcTemplate;
          }
      ​
          /**
           * 付款
           * @param out
           * @param money
           */
          @Override
          public void outMoney(String out, double money) {
              jdbcTemplate.update("update account set money = money - ? where name = ?",money,out);
          }
      ​
          /**
           * 收款
           * @param in
           * @param money
           */
          @Override
          public void inMoney(String in, double money) {
              jdbcTemplate.update("update account set money = money + ? where name = ?",money,in);
          }
      ​
      }
    • 编写配置文件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:context="http://www.springframework.org/schema/context"
             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/context
                      http://www.springframework.org/schema/context/spring-context.xsd
                      http://www.springframework.org/schema/aop
                      http://www.springframework.org/schema/aop/spring-aop.xsd">
      <!--第二种写法:使用提供标签的方式-->
          <context:property-placeholder location="classpath:jdbc.properties" /><!--加载属性的文件-->
          <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
              <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><!--配置Jdbc模板类-->
          <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
              <property name="dataSource" ref="dataSource" />
          </bean><!--配置service-->
          <bean id="accountService" class="cn.tx.demo2.AccountServiceImpl">
              <property name="accountDao" ref="accountDao"/>
           </bean><!--配置service-->
          <bean id="accountDao" class="cn.tx.demo2.AccountDaoImpl">
              <property name="jdbcTemplate" ref="jdbcTemplate" />
          </bean></beans>
    • 测试转账和收款
       1 package cn.tx.test;
       2  3 import cn.tx.demo2.AccountService;
       4 import org.junit.Test;
       5 import org.junit.runner.RunWith;
       6 import org.springframework.beans.factory.annotation.Autowired;
       7 import org.springframework.test.context.ContextConfiguration;
       8 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
       9 10 
      11 
      12 @RunWith(SpringJUnit4ClassRunner.class)
      13 @ContextConfiguration(value = "classpath:applicationContext_dao1.xml")
      14 public class Demo2 {
      15 16     @Autowired
      17     private AccountService accountService;
      18 19     /**
      20      * 测试转账的方法
      21      */
      22     @Test
      23     public void testPay(){
      24         accountService.pay("熊大","熊二",100);
      25     }
      26 27 }

      在dao层使用JdbcDaoSupport 第二种方式,进行转账和收款的测试

    • 同样在service层实现接口
       1  
       2 package cn.tx.demo3;
       3  4 
       5 public class AccountServiceImpl implements AccountService {
       6  7     private AccountDao accountDao;
       8     public void setAccountDao(AccountDao accountDao) {
       9         this.accountDao = accountDao;
      10     }
      11 12     /**
      13      * 转账方法
      14      * @param out       付款人
      15      * @param in        收款人
      16      * @param money     金额
      17      */
      18     @Override
      19     public void pay(String out, String in, double money) {
      20         // 调用dao方法
      21         accountDao.outMoney(out,money);
      22 23         accountDao.inMoney(in,money);
      24     }
      25 26 }
    • 注意在dao层编写,继承JdbcDaoSupport 和实现接口AccountDao 
       1 package cn.tx.demo3;
       2  3 import org.springframework.jdbc.core.JdbcTemplate;
       4 import org.springframework.jdbc.core.support.JdbcDaoSupport;
       5  6 
       7 public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
       8  9     /**
      10      * 付款
      11      * @param out
      12      * @param money
      13      */
      14     @Override
      15     public void outMoney(String out, double money) {
      16         this.getJdbcTemplate().update("update account set money = money - ? where name = ?",money,out);
      17     }
      18 19     /**
      20      * 收款
      21      * @param in
      22      * @param money
      23      */
      24     @Override
      25     public void inMoney(String in, double money) {
      26         this.getJdbcTemplate().update("update account set money = money + ? where name = ?",money,in);
      27     }
      28 29 }
      30
    • 编写配置文件
      <?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:context="http://www.springframework.org/schema/context"
             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/context
                      http://www.springframework.org/schema/context/spring-context.xsd
                      http://www.springframework.org/schema/aop
                      http://www.springframework.org/schema/aop/spring-aop.xsd">
      <!--第二种写法:使用提供标签的方式-->
          <context:property-placeholder location="classpath:jdbc.properties" /><!--加载属性的文件-->
          <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
              <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><!--配置Jdbc模板类
          <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
              <property name="dataSource" ref="dataSource" />
          </bean>
          --><!--配置service-->
          <bean id="accountService" class="cn.tx.demo3.AccountServiceImpl">
              <property name="accountDao" ref="accountDao"/>
           </bean><!--配置dao
          <bean id="accountDao" class="cn.tx.demo3.AccountDaoImpl">
              <property name="jdbcTemplate" ref="jdbcTemplate" />
          </bean>
          --><bean id="accountDao" class="cn.tx.demo3.AccountDaoImpl">
              <property name="dataSource" ref="dataSource" />
          </bean></beans>
    • 测试使用JdbcDaoSupport 的方法进行转账和收款的测试
       1 package cn.tx.test;
       2  3 import cn.tx.demo3.AccountService;
       4 import org.junit.Test;
       5 import org.junit.runner.RunWith;
       6 import org.springframework.beans.factory.annotation.Autowired;
       7 import org.springframework.test.context.ContextConfiguration;
       8 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
       9 10 
      11 @RunWith(SpringJUnit4ClassRunner.class)
      12 @ContextConfiguration(value = "classpath:applicationContext_dao2.xml")
      13 public class Demo3 {
      14 15     @Autowired
      16     private AccountService accountService;
      17 18     /**
      19      * 测试转账的方法
      20      */
      21     @Test
      22     public void testPay(){
      23         accountService.pay("熊大","熊二",100);
      24     }
      25 26 }
      27
  • 相关阅读:
    Asp.Net Web API 2第八课——Web API 2中的属性路由
    Asp.Net Web API 2第七课——Web API异常处理
    Asp.Net Web API 2第六课——Web API路由和动作选择
    Asp.Net Web API 2第五课——Web API路由
    开始学习python
    BMI 小程序 购物车
    深浅copy 文件操作
    字典 dict 集合set
    基本数据类型 (str,int,bool,tuple,)
    python 运算符
  • 原文地址:https://www.cnblogs.com/LBJLAKERS/p/11752615.html
Copyright © 2011-2022 走看看