SpringBoot实践之---H2·连接数据库

原文地址:springboot整合H2内存数据库,实现单元测试与数据库无关性

一、新建spring boot工程

新建工程的时候,需要加入JPA,H2依赖

二、工程结构

pom文件依赖如下:

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  4.     <modelVersion>4.0.0</modelVersion>  
  5.   
  6.     <groupId>com.chhliu.springboot.h2</groupId>  
  7.     <artifactId>springboot-h2</artifactId>  
  8.     <version>0.0.1-SNAPSHOT</version>  
  9.     <packaging>jar</packaging>  
  10.   
  11.     <name>springboot-h2</name>  
  12.     <description>Demo project for Spring Boot H2</description>  
  13.   
  14.     <parent>  
  15.         <groupId>org.springframework.boot</groupId>  
  16.         <artifactId>spring-boot-starter-parent</artifactId>  
  17.         <version>1.4.3.RELEASE</version>  
  18.         <relativePath/> <!-- lookup parent from repository -->  
  19.     </parent>  
  20.   
  21.     <properties>  
  22.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  23.         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>  
  24.         <java.version>1.7</java.version>  
  25.     </properties>  
  26.   
  27.     <dependencies>  
  28.         <dependency>  
  29.             <groupId>org.springframework.boot</groupId>  
  30.             <artifactId>spring-boot-starter-data-jpa</artifactId>  
  31.         </dependency>  
  32.         <dependency>  
  33.             <groupId>org.springframework.boot</groupId>  
  34.             <artifactId>spring-boot-starter-web</artifactId>  
  35.         </dependency>  
  36.   
  37.         <dependency>  
  38.             <groupId>com.h2database</groupId>  
  39.             <artifactId>h2</artifactId>  
  40.             <scope>runtime</scope>  
  41.         </dependency>  
  42.         <dependency>  
  43.             <groupId>org.springframework.boot</groupId>  
  44.             <artifactId>spring-boot-starter-test</artifactId>  
  45.             <scope>test</scope>  
  46.         </dependency>  
  47.     </dependencies>  
  48.   
  49.     <build>  
  50.         <plugins>  
  51.             <plugin>  
  52.                 <groupId>org.springframework.boot</groupId>  
  53.                 <artifactId>spring-boot-maven-plugin</artifactId>  
  54.             </plugin>  
  55.         </plugins>  
  56.     </build>  
  57. </project>  
三、编写实体类

[java]  view plain  copy
  1. package com.chhliu.springboot.h2.entity;  
  2.   
  3. import java.math.BigDecimal;  
  4.   
  5. import javax.persistence.Column;  
  6. import javax.persistence.Entity;  
  7. import javax.persistence.GeneratedValue;  
  8. import javax.persistence.GenerationType;  
  9. import javax.persistence.Id;  
  10.   
  11. @Entity  
  12. public class User {  
  13.   @Id  
  14.   @GeneratedValue(strategy = GenerationType.AUTO)  
  15.   private Long id;  
  16.   
  17.   @Column  
  18.   private String username;  
  19.   
  20.   @Column  
  21.   private String name;  
  22.   
  23.   @Column  
  24.   private Short age;  
  25.   
  26.   @Column  
  27.   private BigDecimal balance;  
  28.   
  29.   ……省略gettter和setter方法  
  30. }  
四、编写dao

[java]  view plain  copy
  1. package com.chhliu.springboot.h2.repository;  
  2.   
  3. import org.springframework.data.jpa.repository.JpaRepository;  
  4. import org.springframework.stereotype.Repository;  
  5.   
  6. import com.chhliu.springboot.h2.entity.User;  
  7.   
  8. @Repository  
  9. public interface UserRepository extends JpaRepository<User, Long> {  
  10.   
  11. }  
五、编写controller

[java]  view plain  copy
  1. package com.chhliu.springboot.h2.controller;  
  2.   
  3. import org.springframework.beans.factory.annotation.Autowired;  
  4. import org.springframework.web.bind.annotation.GetMapping;  
  5. import org.springframework.web.bind.annotation.PathVariable;  
  6. import org.springframework.web.bind.annotation.RestController;  
  7.   
  8. import com.chhliu.springboot.h2.entity.User;  
  9. import com.chhliu.springboot.h2.repository.UserRepository;  
  10.   
  11. @RestController  
  12. public class UserController {  
  13.   
  14.   @Autowired  
  15.   private UserRepository userRepository;  
  16.   
  17.   @GetMapping("/user/{id}")// 注意,此处使用的是GetMapping注解,该注解的作用类似与@RequestMapping(value="/user/{id}" ,method=RequestMethod.GET),@PostMapping注解同理  
  18.   public User findById(@PathVariable Long id) {  
  19.     return this.userRepository.findOne(id);  
  20.   }  
  21. }  
六、配置文件

[java]  view plain  copy
  1. # 服务器端口号  
  2. server.port=7900  
  3. # 是否生成ddl语句  
  4. spring.jpa.generate-ddl=false  
  5. # 是否打印sql语句  
  6. spring.jpa.show-sql=true  
  7. # 自动生成ddl,由于指定了具体的ddl,此处设置为none  
  8. spring.jpa.hibernate.ddl-auto=none  
  9. # 使用H2数据库  
  10. spring.datasource.platform=h2  
  11. # 指定生成数据库的schema文件位置  
  12. spring.datasource.schema=classpath:schema.sql  
  13. # 指定插入数据库语句的脚本位置  
  14. spring.datasource.data=classpath:data.sql  
  15. # 配置日志打印信息  
  16. logging.level.root=INFO  
  17. logging.level.org.hibernate=INFO  
  18. logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE  
  19. logging.level.org.hibernate.type.descriptor.sql.BasicExtractor=TRACE  
  20. logging.level.com.itmuch=DEBUG  
七、启动程序

在浏览器中输入如下URL:

[java]  view plain  copy
  1. http://localhost:7900/user/4  
可以看到测试结果

[java]  view plain  copy
  1. {"id":4,"username":"user4","name":"马六","age":20,"balance":100.00}  
说明,我们的整合是OK的

八、测试dao层

[java]  view plain  copy
  1. package com.chhliu.springboot.h2;  
  2.   
  3. import org.junit.Assert;  
  4. import org.junit.Test;  
  5. import org.junit.runner.RunWith;  
  6. import org.springframework.beans.factory.annotation.Autowired;  
  7. import org.springframework.boot.test.context.SpringBootTest;  
  8. import org.springframework.test.context.junit4.SpringRunner;  
  9.   
  10. import com.chhliu.springboot.h2.entity.User;  
  11. import com.chhliu.springboot.h2.repository.UserRepository;  
  12.   
  13. @RunWith(SpringRunner.class)  
  14. @SpringBootTest  
  15. public class SpringbootH2ApplicationTests {  
  16.   
  17.     @Autowired  
  18.     private UserRepository repository;  
  19.       
  20.     @Test  
  21.     public void test(){  
  22.         User u = repository.findOne(1L);  
  23.         Assert.assertEquals("成功的测试用例""张三", u.getName());  
  24.     }  
  25. }  
发现测试是ok的!

九、总结

由于H2是关系内存数据库,当程序启动的时候,会在内存中创建表,并将数据存储在内存中,当重启程序后,会自动删除内存中的数据,从而可以很好的用来做dao层的单元测试和service层的单元测试,使整个程序不会依赖具体的数据库,同时也提高了单元测试的效率。


猜你喜欢

转载自blog.csdn.net/luckykapok918/article/details/79667051