Spring框架对SQL数据库提供了广泛的支持。本文介绍如何在Spring Boot中使用Spring Data Jpa来访问MySQL数据库。
准备工作
我们从国家统计局网站找来了《最新县及县以上行政区划代码》(截止2015年9月30日),并将其录入数据库。SQL文件见本文例子程序中的region.sql文件。
开始编码
1、添加依赖
在上文的例子的基础上,我们在工程的pom.xml
文件中添加spring-boot-starter-data-jpa
和mysql-connector-java
的依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
同时添加常用的第三方库apache-commons-lang3
和google-guava
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
2、在application.properties
文件中添加数据库连接信息
#MySQL Configuration
spring.datasource.url=jdbc:mysql://localhost/quickstart
spring.datasource.username=root
spring.datasource.password=fuyongde
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
3、在src\main\java\com\jason\entity
目录下编写Region.java
实体类,代码冗余,详见本文例子程序。
4、在src\main\java\com\jason\repository
目录下编写Dao层的接口。由于Spring Data JPA实现了大量的方法,我们按如下方式写即可。
package com.jason.repository;
import com.jason.entity.Region;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
public interface RegionDao extends PagingAndSortingRepository<Region, Integer>, JpaSpecificationExecutor<Region> {
}
5、在src\main\java\com\jason\service
目录项编写Service层的接口及其实现类。此处只贴实现类相关的代码,详见本文例子程序。
package com.jason.service.impl;
import com.jason.entity.Region;
import com.jason.repository.RegionDao;
import com.jason.service.RegionService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class RegionServiceImpl implements RegionService {
@Resource
private RegionDao regionDao;
@Override
public Region getById(Integer id) {
return regionDao.findOne(id);
}
}
6、在src\main\java\com\jason\rest
目录编写Controller层代码。此处我们遵循Restful风格的编码,Restful风格的编码详见Oracle网站以及Rest API Tutorial。
package com.jason.rest;
import com.jason.entity.Region;
import com.jason.service.RegionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping(value = "/api/regions")
public class RegionRestController {
@Autowired
private RegionService regionService;
@GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public Region getRegionById(@PathVariable("id") Integer id) {
Region result = regionService.getById(id);
return result;
}
}
7、运行该程序,访问http://localhost:8080/black/api/regions/110000
,即可看到北京的地区信息。
{
"id": 110000,
"parentId": 0,
"name": "北京市",
"level": 1
}
编写单元测试
不同于之前文章所写的测试方法,本文的单元测试需要配置WebApplicationContext
,测试类如下。
package com.jason.rest;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@RunWith(SpringRunner.class)
@SpringBootTest
public class RegionRestControllerTest {
private MockMvc mvc;
@Autowired
private WebApplicationContext context;
@Before
public void before() {
this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build();
}
@Test
public void testGetRegionById() throws Exception {
this.mvc.perform(get("/api/regions/110000").accept(MediaType.APPLICATION_JSON_UTF8_VALUE))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE))
.andExpect(jsonPath("$.name").value("北京市"));
}
}
本文示例程序请点此获取。
详细资料请参考Spring Boot官网。