第08章—整合Spring Data JPA
spring boot 系列学习记录:http://www.cnblogs.com/jinxiaohang/p/8111057.html
码云源码地址:https://gitee.com/jinxiaohang/springboot
一、引入依赖
如果是新建项目的,可以在这页添加依赖:
如果是原有项目,还可以在pom.xml 引入JPA和数据库驱动的依赖。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
二、添加数据源
在application.yml 添加数据源
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?useSSL=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
三、编写各层代码
// entity类如下: public class UserInfo { private String userId; private String userName; private String password; // Getters & Setters .. } // dao层代码如下: public interface UserInfoRepository extends JpaRepository<UserInfo,String> { } //service层 public interface UserService { /** * 获取所有UserInfo信息 * @return */ List<UserInfo> list(); /** * 获取单个UserInfo信息 * @param userId * @return */ UserInfo getOne(String userId); /** * 添加单个UserInfo * @param user * @return */ UserInfo save(UserInfo user); /** * 更新当个UserInfo信息 * @param user * @return */ UserInfo update(UserInfo user); /** * 删除单个UserInfo * @param userId * @return */ boolean delete(String userId); } //serviceimpl层 @Service public class UserServiceImpl implements UserService { @Autowired private UserInfoRepository userInfoRepository; @Override public List<UserInfo> list() { return userInfoRepository.findAll(); } @Override public UserInfo getOne(String userId) { return userInfoRepository.findOne(userId); } @Override public UserInfo save(UserInfo user) { return userInfoRepository.save(user); } @Override public UserInfo update(UserInfo user) { return userInfoRepository.save(user); } @Override public boolean delete(String userId) { userInfoRepository.delete(userId); return true; } } //controller层 @RestController @RequestMapping("/api/user/*") public class UserController { @Autowired private UserService userService; @GetMapping("list") public List userList() { return userService.list(); } /** * 使用@RequestParam时,URL是这样的:http://host:port/path?参数名=参数值 * 使用@PathVariable时,URL是这样的:http://host:port/path/参数值 */ @GetMapping("list/{userId}") public UserInfo getOne(@PathVariable String userId){ return userService.getOne(userId); } @PostMapping("save") public String save(@RequestBody UserInfo userInfo) {//请求中需要带Content-Type: application/json if (userService.save(userInfo)!=null) return userInfo.toString(); return "{\"msg\":\"error\"}"; } @PutMapping("update") public String update(@RequestBody UserInfo userInfo) {//请求中需要带Content-Type: application/json if(userService.update(userInfo)!=null) return userInfo.toString(); return "{\"msg\":\"error\"}"; } @DeleteMapping("delete/{userId}") public String delete(@PathVariable String userId) { if (userService.delete(userId)) return "{\"msg\":\"success\"}"; return "{\"msg\":\"error\"}"; } }
易错点:
1、在集成Mybatis时,通常设置表字段名和类属性一致,在集成JPA时实体类要与数据库表对应,不然会出错。
举个例子:类名UserInfo->表名user_info ,属性userId->字段user_id,属性password->字段password。
2、dao层通常继承JpaRepository<类名,主键类型>就能满足基本的数据库操作。
3、service层和往常一样,实现层需要调用父类中的一些方法,比如:findAll()、save()、findOne()根据主键查找。。。
4、controller层,遇到了些问题:
使用@RequestParam时,URL是这样的:http://host:port/path?参数名=参数值
使用@PathVariable时,URL是这样的:http://host:port/path/参数值
在集成Mybatis时使用的是@PathVariable,在写Swagger2时使用的是@RequestParam,使用另一种注解,测试时会失败。
使用@RequestBody,将json格式数据转化为实体对象。测试时,请求头中需要:Content-Type: application/json,否则会报415错误。
四、添加数据库记录
-- ---------------------------- -- Table structure for user_info -- ---------------------------- DROP TABLE IF EXISTS `user_info`; CREATE TABLE `user_info` ( `user_id` varchar(50) NOT NULL, `user_name` varchar(50) DEFAULT NULL, `password` varchar(50) DEFAULT NULL, PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- ---------------------------- -- Records of user_info -- ---------------------------- INSERT INTO `user_info` VALUES ('1', '3', '2'); INSERT INTO `user_info` VALUES ('2', '4', '3'); INSERT INTO `user_info` VALUES ('3', '6', '4');
五、启动测试
运用火狐浏览器或者postman进行测试,如果集成swagger2可以用它测试,但注意上面的易错点。