第5章Spring 事务(测试)–在这个笔记中记录的是没有添加事务,数据库返回的效果。

1. 首先搞两张表,商品表和订单表

举例:购买商品 trans_sale 项目 本例要实现购买商品,模拟用户下订单,向订单表添加销售记录,从商品表减少库存。

实现步骤:

  • Step0:创建数据库表

    sale 销售表

    goods 商品表

  • Step1: maven 依赖 pom.xml

    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.5.RELEASE</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.2.5.RELEASE</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.5.RELEASE</version>
    </dependency>
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.1</version>
    </dependency>
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.1</version>
    </dependency>
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.9</version>
    </dependency>
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.12</version>
    </dependency>
    插件
    <build>
     <resources>
     <resource>
     <directory>src/main/java</directory><!--所在的目录-->
     <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
     <include>**/*.properties</include>
     <include>**/*.xml</include>
     </includes>
     <filtering>false</filtering>
     </resource>
      </resources>
     <plugins>
     <plugin>
     <artifactId>maven-compiler-plugin</artifactId>
     <version>3.1</version>
     <configuration>
     <source>1.8</source>
     <target>1.8</target>
     </configuration>
     </plugin>
     </plugins>
    </build>
    

    项目的结构

  • Step2:创建实体类

    创建实体类 Sale 与 Goods

  • Step3:定义 dao 接口

  • Step4:定义 dao 接口对应的 sql 映射文件

  • Step5:定义异常类

    定义 service 层可能会抛出的异常类 NotEnoughException

    package com.bjpowernode.excep;
    
    //自定义的运行时异常
    public class NotEnoughException extends RuntimeException {
        public NotEnoughException() {
            super();
        }
    
        public NotEnoughException(String message) {
            super(message);
        }
    }
    
  • Step6:定义 Service 接口

    package com.bjpowernode.service;
    
    public interface BuyGoodsService {
    
        //购买商品的方法, goodsId:购买商品的编号, nums:购买的数量
        void buy(Integer goodsId,Integer nums);
    }
    
  • Step7:定义 service 的实现类

    package com.bjpowernode.service.impl;
    
    import com.bjpowernode.dao.GoodsDao;
    import com.bjpowernode.dao.SaleDao;
    import com.bjpowernode.domain.Goods;
    import com.bjpowernode.domain.Sale;
    import com.bjpowernode.excep.NotEnoughException;
    import com.bjpowernode.service.BuyGoodsService;
    
    public class BuyGoodsServiceImpl implements BuyGoodsService {
    
        private SaleDao saleDao;
        private GoodsDao goodsDao;
        @Override
        public void buy(Integer goodsId, Integer nums) {
            System.out.println("=====buy方法的开始====");
            //记录销售信息,向sale表添加记录
            Sale sale  = new Sale();
            sale.setGid(goodsId);
            sale.setNums(nums);
            saleDao.insertSale(sale);
    
            //更新库存
            Goods goods  = goodsDao.selectGoods(goodsId);
            if( goods == null){
                //商品不存在
                throw  new  NullPointerException("编号是:"+goodsId+",商品不存在");
            } else if( goods.getAmount() < nums){
                //商品库存不足
                throw new NotEnoughException("编号是:"+goodsId+",商品库存不足");
            }
            //修改库存了
            Goods buyGoods = new Goods();
            buyGoods.setId( goodsId);
            buyGoods.setAmount(nums);
            goodsDao.updateGoods(buyGoods);
            System.out.println("=====buy方法的完成====");
        }
    
    
        public void setSaleDao(SaleDao saleDao) {
            this.saleDao = saleDao;
        }
    
        public void setGoodsDao(GoodsDao goodsDao) {
            this.goodsDao = goodsDao;
        }
    }
    
  • Step8:修改 Spring 配置文件内容

    <?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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    
        <!--
           把数据库的配置信息,写在一个独立的文件,编译修改数据库的配置内容
           spring知道jdbc.properties文件的位置
        -->
        <context:property-placeholder location="classpath:jdbc.properties" />
    
        <!--声明数据源DataSource, 作用是连接数据库的-->
        <bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource"
              init-method="init" destroy-method="close">
            <!--set注入给DruidDataSource提供连接数据库信息 -->
            <!--    使用属性配置文件中的数据,语法 ${key} -->
            <property name="url" value="${jdbc.url}" /><!--setUrl()-->
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.passwd}" />
            <property name="maxActive" value="${jdbc.max}" />
        </bean>
    
        <!--声明的是mybatis中提供的SqlSessionFactoryBean类,这个类内部创建SqlSessionFactory的
            SqlSessionFactory  sqlSessionFactory = new ..
        -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!--set注入,把数据库连接池付给了dataSource属性-->
            <property name="dataSource" ref="myDataSource" />
            <!--mybatis主配置文件的位置
               configLocation属性是Resource类型,读取配置文件
               它的赋值,使用value,指定文件的路径,使用classpath:表示文件的位置
            -->
            <property name="configLocation" value="classpath:mybatis.xml" />
        </bean>
    
        <!--创建dao对象,使用SqlSession的getMapper(StudentDao.class)
            MapperScannerConfigurer:在内部调用getMapper()生成每个dao接口的代理对象。
    
        -->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <!--指定SqlSessionFactory对象的id-->
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
            <!--指定包名, 包名是dao接口所在的包名。
                MapperScannerConfigurer会扫描这个包中的所有接口,把每个接口都执行
                一次getMapper()方法,得到每个接口的dao对象。
                创建好的dao对象放入到spring的容器中的。 dao对象的默认名称是 接口名首字母小写
            -->
            <property name="basePackage" value="com.bjpowernode.dao"/>
        </bean>
    
        <!--声明service-->
        <bean id="buyService" class="com.bjpowernode.service.impl.BuyGoodsServiceImpl">
            <property name="goodsDao" ref="goodsDao" />
            <property name="saleDao" ref="saleDao" />
        </bean>
    
    </beans>
    
  • 其中mybatis的主配置文件和jdbc连接的配置文件如下:

  • Step9:定义测试类

    package com.bjpowernode;
    
    import com.bjpowernode.service.BuyGoodsService;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class MyTest {
    
        @Test
        public void test01(){
            String config="applicationContext.xml";
            ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
            //从容器获取service
            BuyGoodsService service = (BuyGoodsService) ctx.getBean("buyService");
    
            //调用方法
            service.buy(1001,200);
        }
    
    }
    
  • 当正常执行时候。

  • 商品不存在时

  • 商品数量不足时候

原文地址:http://www.cnblogs.com/atao-BigData/p/16884892.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性