zoukankan      html  css  js  c++  java
  • 第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可以用它测试,但注意上面的易错点。

  • 相关阅读:
    centos7查看系统版本,查看机器位数x86-64
    CentOS7下安装mysql5.6修改字符集为utf8并开放端口允许远程访问
    CentOS7下mysql5.6修改默认编码
    使用swagger作为restful api的doc文档生成
    在idea中maven项目jdk编译version总是跳到1.5
    国内maven镜像,快的飞起
    醒悟,珍惜时间,学会利用资源
    重定向Http status code 303 和 302
    jackson简单使用,对象转json,json转对象,json转list
    2017 年度码云新增项目排行榜 TOP 50,为它们打“call”
  • 原文地址:https://www.cnblogs.com/jinxiaohang/p/8290504.html
Copyright © 2011-2022 走看看