spring boot单元测试之五:用mybatis+H2数据库测试sql(spring boot 2.4.3)
2023-09-14 08:59:32 时间
一,关于H2数据库:
1,H2数据库的用途:
H2是一个用Java开发的嵌入式数据库,可以直接嵌入到应用项目中。
H2可以用于单元测试。它启动速度很快,而且可以关闭持久化功能,使每一个用例执行完后就还原到初始状态。
H2可以用于单元测试。它启动速度很快,而且可以关闭持久化功能,使每一个用例执行完后就还原到初始状态。
2,官方网站:
http://www.h2database.com/html/main.html
说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest
对应的源码可以访问这里获取: https://github.com/liuhongdi/
说明:作者:刘宏缔 邮箱: 371125307@qq.com
二,演示项目的相关信息
1,地址:
https://github.com/liuhongdi/h2test
2,功能:演示集成h2数据库用来做单元测试中对sql的测试:
3,项目结构:如图:
三,配置文件说明
1,pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--mybatis begin--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> </dependency> <!--mybatis end--> <!--mysql begin--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!--mysql end--> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>1.4.200</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
2,application.yml
spring:
profiles:
active: dev
3,application-prd.yml
#error server: error: include-stacktrace: always #errorlog logging: level: org.springframework.web: trace #mysql spring: datasource: url: jdbc:mysql://127.0.0.1:3306/store?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: lhddemo driver-class-name: com.mysql.cj.jdbc.Driver maximum-pool-size: 12 minimum-idle: 10 idle-timeout: 500000 max-lifetime: 540000 #mybatis mybatis: mapper-locations: classpath:/mapper/*Mapper.xml type-aliases-package: com.example.demo.mapper configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
4,application-dev.yml
#error server: error: include-stacktrace: always #errorlog logging: level: org.springframework.web: trace #mysql spring: h2: console: path: /h2-console #进入h2 web操作界面的路径 enabled: true #开启h2 web界面 datasource: driver-class-name: org.h2.Driver schema: classpath:db/schema-h2.sql data: classpath:db/data-h2.sql url: jdbc:h2:mem:test username: root password: test #mybatis mybatis: mapper-locations: classpath:/mapper/*Mapper.xml type-aliases-package: com.example.demo.mapper configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
5,db/schema-h2.sql
DROP TABLE IF EXISTS goods; CREATE TABLE goods ( goodsId BIGINT(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', goodsName varchar(500) NOT NULL DEFAULT '' COMMENT 'name', subject varchar(200) NOT NULL DEFAULT '' COMMENT '标题', price decimal(15,2) NOT NULL DEFAULT '0.00' COMMENT '价格', stock int(11) NOT NULL DEFAULT '0' COMMENT 'stock', PRIMARY KEY (`goodsId`), UNIQUE KEY `goodsName` (`goodsName`) )
6,db/data-h2.sql
INSERT INTO `goods` (`goodsId`, `goodsName`, `subject`, `price`, `stock`) VALUES (3, '100分电动牙刷', '好用到让你爱上刷牙', '59.00', 98), (4, '蜂蜜牛奶手工皂', '深入滋养,肌肤细腻嫩滑', '70.00', 33), (5, '紫光筷子筒', '紫光智护,干爽防潮更健康', '189.00', 20), (6, '野性mini便携式蓝牙音箱', '强悍机能,品味豪迈', '499.00', 3), (7, '乐穿梭茶具', '茶具+茶叶精美端午礼盒', '299.00', 8), (8, '香梅 昂 吟酿清酒', '入口清爽,回甘无穷', '260.00', 3), (9, '小风扇落地电扇', '四档风速调节,低噪音运行', '239.00', 6), (10, '梵高系列20英寸拉杆箱', '梵高名画复原,旅行的艺术', '799.00', 4), (11, '英国老牌城市系列剑桥包', '源自英伦 从经典到潮流', '1210.00', 9), (12, '正宗无锡阳山水蜜桃', '手捏可以榨汁', '78.00', 100), (13, '悬浮歌词透明蓝牙音箱1 in h2', '极简主义美学 HiFi音质 h2', '3499.00', 60);
四,java代码说明
1,result/RestResult.java
public class RestResult implements Serializable { //uuid,用作唯一标识符,供序列化和反序列化时检测是否一致 private static final long serialVersionUID = 7498483649536881777L; //标识代码,0表示成功,非0表示出错 private Integer code; //提示信息,通常供报错时使用 private String msg; //正常返回时返回的数据 private Object data; public RestResult(Integer status, String msg, Object data) { this.code = status; this.msg = msg; this.data = data; } //返回成功数据 public static RestResult success(Object data) { return new RestResult(ResponseCode.SUCCESS.getCode(), ResponseCode.SUCCESS.getMsg(), data); } public static RestResult success(Integer code,String msg) { return new RestResult(code, msg, null); } //返回出错数据 public static RestResult error(ResponseCode code) { return new RestResult(code.getCode(), code.getMsg(), null); } public static RestResult error(Integer code,String msg) { return new RestResult(code, msg, null); } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } }
2,service/GoodsService.java
@Service public class GoodsService { @Resource private GoodsMapper goodsMapper; //得到一件商品的信息 public Goods getOneGoodsById(Long goodsId) { System.out.println("get data from mysql"); Goods goodsOne = goodsMapper.selectOneGoods(goodsId); System.out.println(goodsOne); return goodsOne; } //添加一件商品到数据库 public Long addOneGoods(Goods goods) { int insNum = goodsMapper.insertOneGoods(goods); if (insNum == 0) { return 0L; } else { Long goodsId = goods.getGoodsId();//该对象的自增ID return goodsId; } } }
3,pojo/Goods.java
public class Goods { //商品id Long goodsId; public Long getGoodsId() { return this.goodsId; } public void setGoodsId(Long goodsId) { this.goodsId = goodsId; } //商品名称 private String goodsName; public String getGoodsName() { return this.goodsName; } public void setGoodsName(String goodsName) { this.goodsName = goodsName; } //商品标题 private String subject; public String getSubject() { return this.subject; } public void setSubject(String subject) { this.subject = subject; } //商品价格 private BigDecimal price; public BigDecimal getPrice() { return this.price; } public void setPrice(BigDecimal price) { this.price = price; } //库存 int stock; public int getStock() { return this.stock; } public void setStock(int stock) { this.stock = stock; } @Override public String toString(){ return " Goods:goodsId=" + goodsId +" goodsName=" + goodsName+" subject=" + subject+" price=" + price+" stock=" + stock; } }
4,mapper/GoodsMapper.java
@Repository @Mapper public interface GoodsMapper { Goods selectOneGoods(Long goodsId); int insertOneGoods(Goods goods); int updateOneGoods(Goods goods); }
5,mapper/GoodsMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.h2test.demo.mapper.GoodsMapper"> <select id="selectOneGoods" parameterType="long" resultType="com.h2test.demo.pojo.Goods"> select * from goods where goodsId=#{goodsId} </select> <update id="updateGoodsStock"> UPDATE goods SET stock = stock+#{changeAmount,jdbcType=INTEGER} WHERE goodsId = #{goodsId,jdbcType=BIGINT} </update> <insert id="insertOneGoods" parameterType="com.h2test.demo.pojo.Goods" useGeneratedKeys="true" keyProperty="goodsId" > insert into goods(goodsName,subject,price,stock) values( #{goodsName},#{subject},#{price},#{stock} ) </insert> </mapper>
6,service/GoodsServiceTest.java
@ActiveProfiles("dev") @SpringBootTest class GoodsServiceTest { @Autowired GoodsService goodsService; @Test @DisplayName("商品service:得到一件商品") void getOneGoodsById() { Goods goodsRet = goodsService.getOneGoodsById(13L); assertThat(goodsRet.getGoodsId(), equalTo(13L)); } @Test @DisplayName("商品service:测试添加一件商品") void addOneGoods() { Goods goodsOne = new Goods(); //goodsOne.setGoodsId(13L); goodsOne.setGoodsName("商品名称"); goodsOne.setSubject("商品描述"); goodsOne.setPrice(new BigDecimal(101)); goodsOne.setStock(13); Long goodsId = goodsService.addOneGoods(goodsOne); assertThat(goodsId, equalTo(14L)); Goods goodsRet = goodsService.getOneGoodsById(14L); assertThat(goodsRet.getGoodsId(), equalTo(14L)); } }
五,测试效果
1,执行测试:
2,访问h2的控制台:
地址:
http://127.0.0.1:8080/h2-console
登录:
返回:
六,查看spring boot版本:
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.4.3)
相关文章
- 当spring 容器初始化完成后执行某个方法
- JavaWeb_(SSH)三大框架整合struts+hibernate+spring_Demo
- 利用 Spring Boot 中的 @ConfigurationProperties,优雅绑定配置参数
- 【Spring Boot】Spring Boot之整合Sharding-JDBC(java config方式)实现分库分表(水平拆分)
- sh(Spring+Spring mvc+hibernate)——IDeptDao.java
- Spring Boot [使用 Druid 数据库连接池]
- spring boot: 中文显示乱码,在applicationContext里面配置
- Spring Batch Read from DB and Write to File
- spring boot下使用logback或log4j生成符合Logstash标准的JSON格式
- 深入浅出 spring-data-elasticsearch - 基本案例详解(三
- spring cloud:搭建基于consul的服务提供者集群(spring cloud hoxton sr8 / spring boot 2.3.4)
- spring boot: 通过filter过滤器实现中文的简体繁体字符集转换(spring boot 2.3.1)
- spring-boot 加载本地静态资源文件路径配置
- Spring Boot (七): Mybatis极简配置
- spring boot单元测试之五:用mybatis+H2数据库测试sql(spring boot 2.4.3)
- 学习Spring Boot:(二十二)使用 AOP
- 《Springboot极简教程》使用Spring Boot, JPA, Mysql, ThymeLeaf,gradle, Kotlin快速构建一个CRUD Web App
- Spring Boot 自定義 HttpMessageConverter 解決 String 類型返回JSON對象問題
- 毕业设计 Spring Boot的网上租车管理系统(含源码+论文)
- Spring之注解实现aop(面向切面编程)
- Quick Guide to Microservices with Spring Boot 2.0, Eureka and Spring Cloud
- 022-Spring Boot 构建微服务实战
- 009-Spring Boot 事件监听、监听器配置与方式、spring、Spring boot内置事件
- spring Annotation 组分注塑
- Spring Boot2 系列教程(二十八)Spring Boot 整合 Session 共享
- 【Spring Boot】Spring Boot项目中如何查看springBoot版本和Spring的版本