一、环境
- Idea 2020.1
- JDK 1.8
- maven
二、目的
spring boot整合jparepository。
三、步骤
3.1、点击File -> New Project -> Spring Initializer,点击next
3.2、在对应地方修改自己的项目信息
3.3、选择Web依赖,选中Spring Web、Spring Data JPA、MySQL Driver。可以选择Spring Boot版本,本次默认为2.2.6,点击Next
3.4、项目结构
四、添加文件
pom.xml文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.7.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>org.ouyushan</groupId> <artifactId>spring-boot-data-jparepository</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-boot-data-jparepository</name> <description>JPA project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- 解决json与hibernate懒加载引起的问题 --> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-hibernate5</artifactId> <version>2.11.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
application.properties文件
###### mysql ####### spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=root ###### JPA ####### spring.jpa.database=MYSQL spring.jpa.show-sql=true spring.jpa.generate-ddl=true spring.jpa.properties.hibernate.format-sql=true spring.jpa.hibernate.ddl-auto=update #spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl ###### log ####### logging.level.org.ouyushan.springboot.data.jparepository=debug
JpaConfig.java
package org.ouyushan.springboot.data.jparepository.config; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module; import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; /** * @Description: 需指定扫描japRepositories路径和entiry路径 * @Author: ouyushan * @Email: ouyushan@hotmail.com * @Date: 2020/5/8 10:00 */ @Configuration @EnableJpaRepositories("org.ouyushan.springboot.data.jparepository") @EntityScan("org.ouyushan.springboot.data.jparepository.entity") public class JPAConfig { /* <!-- 解决json与hibernate懒加载引起的问题 --> */ @Bean public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { Hibernate5Module hibernate5Module = new Hibernate5Module(); hibernate5Module.configure(Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION, false); MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter(); ObjectMapper objectMapper = jsonConverter.getObjectMapper(); objectMapper.registerModule(new Hibernate5Module()); return jsonConverter; } }
UserInfoRepository.java
package org.ouyushan.springboot.data.jparepository.repository; import org.ouyushan.springboot.data.jparepository.entity.UserInfo; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; /** * @Description: * @Author: ouyushan * @Email: ouyushan@hotmail.com * @Date: 2020/5/8 10:56 */ public interface UserInfoRepository extends JpaRepository<UserInfo, Long> { /* 更新 */ @Modifying @Query("update UserInfo u set u.userName = ?1, u.password = ?2, u.age = ?3 where u.id = ?4") int update(String userName, String password,int age,Long id); }
UserInfoService.java
package org.ouyushan.springboot.data.jparepository.service; import org.ouyushan.springboot.data.jparepository.entity.UserInfo; import java.util.List; /** * @Description: * @Author: ouyushan * @Email: ouyushan@hotmail.com * @Date: 2020/5/8 10:58 */ public interface UserInfoService { UserInfo add(UserInfo userInfo); int update(UserInfo userInfo); void delete(Long id); UserInfo findUserInfo(Long id); List<UserInfo> findUserInfoList(); }
UserInfoServiceImpl.java
package org.ouyushan.springboot.data.jparepository.service; import org.ouyushan.springboot.data.jparepository.entity.UserInfo; import org.ouyushan.springboot.data.jparepository.repository.UserInfoRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Optional; /** * @Description: * @Author: ouyushan * @Email: ouyushan@hotmail.com * @Date: 2020/5/8 10:58 */ @Service("userInfoService") @Transactional public class UserInfoServiceImpl implements UserInfoService { @Autowired private UserInfoRepository userInfoRepository; /* 增加 */ @Override public UserInfo add(UserInfo userInfo) { return this.userInfoRepository.save(userInfo); } /* 更新 */ @Override public int update(UserInfo userInfo) { return this.userInfoRepository.update(userInfo.getUserName(), userInfo.getPassword(), userInfo.getAge(), userInfo.getId()); } /* 删除 */ @Override public void delete(Long id) { this.userInfoRepository.deleteById(id); } /* 根据id查找 */ @Override public UserInfo findUserInfo(Long id) { Optional<UserInfo> optional = this.userInfoRepository.findById(id); return optional.orElse(new UserInfo()); } /* 获取列表 */ @Override public List<UserInfo> findUserInfoList() { return this.userInfoRepository.findAll(); } }
UserInfoController.java
package org.ouyushan.springboot.data.jparepository.controller; import org.ouyushan.springboot.data.jparepository.entity.UserInfo; import org.ouyushan.springboot.data.jparepository.service.UserInfoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; /** * @Description: * @Author: ouyushan * @Email: ouyushan@hotmail.com * @Date: 2020/5/8 11:03 */ @RestController @RequestMapping("/api/user") public class UserInfoController { @Autowired private UserInfoService userInfoService; /** * 查询个人信息 * * @param id * @return */ @GetMapping(value = "/getUser/{id}") public UserInfo getUserInfo(@PathVariable("id") Long id) { UserInfo userInfo = userInfoService.findUserInfo(id); if (userInfo == null) { throw new RuntimeException("查询为空"); } return userInfo; } /** * 查询用户列表 * * @return */ @GetMapping(value = "/getUsers") public List<UserInfo> getUserInfoList() { List<UserInfo> userInfoList = this.userInfoService.findUserInfoList(); if (userInfoList == null || userInfoList.size() == 0) { throw new RuntimeException("用户列表为空"); } return userInfoList; } /** * 新增用户 */ @PostMapping(value = "/addUser") public void addUser(@RequestBody UserInfo userInfo) { try { this.userInfoService.add(userInfo); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("新增用户失败"); } } /** * 更新用户 * * @param */ @PutMapping(value = "/updateUser") public void update(@RequestBody UserInfo userInfo) { try { this.userInfoService.update(userInfo); } catch (Exception e) { e.printStackTrace(); } } @DeleteMapping(value = "/delete/{id}") public void delete(@PathVariable("id") Long id) { try { this.userInfoService.delete(id); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("删除用户:" + id + " 失败"); } } }
五、测试
SpringBootDataJparepositoryApplicationTests.java
package org.ouyushan.springboot.data.jparepository; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.ouyushan.springboot.data.jparepository.entity.UserInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultHandlers; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @SpringBootTest @AutoConfigureMockMvc class SpringBootDataJparepositoryApplicationTests { private static Logger logger = LoggerFactory.getLogger(SpringBootDataJparepositoryApplicationTests.class); /** * 根据ID查询 */ @Test public void testSelectById(@Autowired MockMvc mockMvc) throws Exception { mockMvc.perform(MockMvcRequestBuilders.get("/api/user/getUser/{1}", 1)) .andDo(MockMvcResultHandlers.print()) //方法用于 打印请求、响应及其他相关信息 .andExpect(status().isOk()) .andExpect(content().json(("{"id":1,"userName":"admin","password":"123","age":28}"))); } /** * 查询用户列表 */ @Test public void testSelectAll(@Autowired MockMvc mockMvc) throws Exception { mockMvc.perform(MockMvcRequestBuilders.get("/api/user/getUsers")) .andDo(MockMvcResultHandlers.print()) //.andDo(print()) .andExpect(status().isOk()); } /** * 添加用户 * * @throws Exception */ @Test public void testAddUser(@Autowired MockMvc mockMvc) throws Exception { UserInfo userInfo = new UserInfo(); userInfo.setUserName("mockMvc"); userInfo.setPassword("mockmvc"); userInfo.setAge(24); ObjectMapper mapper = new ObjectMapper(); String userJson = mapper.writeValueAsString(userInfo); mockMvc.perform(MockMvcRequestBuilders.post("/api/user/addUser") .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON) .content(userJson)) .andDo(MockMvcResultHandlers.print()) // .andDo(print()) .andExpect(status().isOk()); } /** * 更新用户 * * @throws Exception */ @Test public void testUpdateUser(@Autowired MockMvc mockMvc) throws Exception { UserInfo userInfo = new UserInfo(); userInfo.setId(9L); userInfo.setUserName("mockMvc1"); userInfo.setPassword("mockmvc1"); userInfo.setAge(28); ObjectMapper mapper = new ObjectMapper(); String userJson = mapper.writeValueAsString(userInfo); mockMvc.perform(MockMvcRequestBuilders.put("/api/user/updateUser") .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON) .content(userJson)) .andDo(MockMvcResultHandlers.print()) // .andDo(print()) .andExpect(status().isOk()); } /** * 删除 * * @throws Exception */ @Test public void testDeleteUser(@Autowired MockMvc mockMvc) throws Exception { mockMvc.perform(MockMvcRequestBuilders.delete("/api/user/delete/{id}", 9)) .andDo(MockMvcResultHandlers.print()) .andExpect(status().isOk()); } }