zoukankan      html  css  js  c++  java
  • springboot快速入门(四)——数据库操作

    一、Spring-Data-Jpa的引入

      先给出官方文档https://docs.spring.io/spring-data/jpa/docs/current/reference/html/

      IBM的相关教程https://www.ibm.com/developerworks/cn/opensource/os-cn-spring-jpa/index.html

      springboot整合实战https://www.jianshu.com/p/9d5bf0e4943f

      JPA(Java Persistence API)是Sun官方提出的Java持久化规范。

      SpringDataJPA是Spring Data的一个子项目,通过提供基于JPA的Repository极大的减少了JPA作为数据访问方案的代码量,你仅仅需要编写一个接口集成下SpringDataJPA内部定义的接口即可完成简单的CRUD操作

      理论的介绍暂不展开,同样,JPA有机会将会单独开博文介绍!

      已补充Spring-Data-Jpa快速入门博文http://www.cnblogs.com/jiangbei/p/8440675.html

    二、起步

      1.引入依赖

     <!--spring-boot-starter-data-jpa包含spring-data-jpa、spring-orm 和 Hibernate 来支持 JPA-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <!-- mysql连接-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>

      2.配置数据源

        在yml文件中配置信息:  

    spring:
      datasource:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/sakila
        username: root
        password: root
      jpa:
        hibernate:
          ddl-auto: create
        show-sql: true

      3.添加bean

        注意各个注解

    package com.example.demo.bean;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    /**
     * 员工bean
     *
     * @author zcc ON 2018/2/8
     **/
    @Entity
    public class Emp {
        /**
         * 设置主键和自增
         */
        @Id
        @GeneratedValue
        private Integer id;
        private String name;
        private Integer age;
    
        /**
         * 必选无参构造器
         */
        public Emp() {
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    }

      4.启动测试

        启动程序,可以看到数据库创建了一个emp对应的表:

        

      特别注意:!  

        由于yml中配置的是ddl-auto: create,故程序每次跑的时候都会创建一个空表!如果原来存在同名表,则删除重建

      可以修改为update,这样原先存在的表以及表中的数据就不会消失了:

    jpa:
        hibernate:
          ddl-auto: update
        show-sql: true

     三、Restful API示例

      1.需求

      

        这几个请求请正确使用!下面列出HTTP规范的示例:

    get对应的是查询
    post对应的是保存/增加
    delete对应的是删除
    put对应的是更新

      2.实现

        注意,上面的ddl-auto请改为 update!(否则就要删库跑路了...)

        1.GET

          bean:

    package com.example.demo.bean;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    /**
     * girl的bean
     *
     * @author zcc ON 2018/2/9
     **/
    @Entity
    public class Girl {
        @Id
        @GeneratedValue
        private Integer id;
        private String name;
        private Integer age;
    
        public Girl() {
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    }
    Girl

          controller:

    package com.example.demo;
    
    import com.example.demo.bean.Girl;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.List;
    
    /**
     * controller
     *
     * @author zcc ON 2018/2/9
     **/
    @RestController
    public class GirlController {
        /**
         * 简单的逻辑,这里就暂时省略service了
         */
        @Autowired
        private GirlRepository girlRepository;
    
        @GetMapping(value = "/girls")
        public List<Girl> getList() {
            // 直接调用findAll()即可,已经封装了!
            return girlRepository.findAll();
        }
    }

          dao:

    package com.example.demo;
    
    import com.example.demo.bean.Girl;
    import org.springframework.data.jpa.repository.JpaRepository;
    
    /**
     * girl持久层
     * 简单的CRUD等操作无需实现!
     * @author zcc
     **/
    public interface GirlRepository extends JpaRepository<Girl, Integer>{
    }

        由于我们配置了show-sql,我们是可以在日志看到sql的:

        

        

        使用postman测试结果:

        

        2.POST

    package com.example.demo;
    
    import com.example.demo.bean.Girl;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.List;
    
    /**
     * controller
     *
     * @author zcc ON 2018/2/9
     **/
    @RestController
    public class GirlController {
        /**
         * 简单的逻辑,这里就暂时省略service了
         */
        @Autowired
        private GirlRepository girlRepository;
    
        @GetMapping(value = "/girls")
        public List<Girl> getList() {
            // 直接调用findAll()即可,已经封装了!
            return girlRepository.findAll();
        }
    
        /**
         * 可以使用此方式进行参数绑定
         */
        /*@PostMapping(value = "/girls")
        public String addGirl(@RequestParam("age") Integer age, String name) {
            return null;
        }*/
    
        /**
         * 更推荐bean进行绑定(这里规则和springMVC是一样的)
         * @param girl 实体
         * @return
         */
        @PostMapping(value = "/girls")
        public Girl addGirl(Girl girl) {
            // 直接返回这个实体类也可以
            return girlRepository.save(girl);
        }
    }

        测试结果:

        

         3.其他PUT GET DELETE

    package com.example.demo;
    
    import com.example.demo.bean.Girl;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.List;
    
    /**
     * controller
     *
     * @author zcc ON 2018/2/9
     **/
    @RestController
    public class GirlController {
        /**
         * 简单的逻辑,这里就暂时省略service了
         */
        @Autowired
        private GirlRepository girlRepository;
    
        @GetMapping(value = "/girls")
        public List<Girl> getList() {
            // 直接调用findAll()即可,已经封装了!
            return girlRepository.findAll();
        }
    
        /**
         * 可以使用此方式进行参数绑定
         */
        /*@PostMapping(value = "/girls")
        public String addGirl(@RequestParam("age") Integer age, String name) {
            return null;
        }*/
    
        /**
         * 更推荐bean进行绑定(这里规则和springMVC是一样的)
         * @param girl 实体
         * @return
         */
        @PostMapping(value = "/girls")
        public Girl addGirl(Girl girl) {
            // 直接返回这个实体类也可以
            return girlRepository.save(girl);
        }
        @GetMapping(value = "/girls/{id}")
        public Girl getGirlById(@PathVariable("id") Integer id) {
            // 推荐使用更加通用的findOne()!
            return girlRepository.findOne(id);
        }
        @PutMapping(value = "/girls/{id}")
        public Girl updateGirlById(@PathVariable("id") Integer id, String name) {
            Girl girl = new Girl();
            girl.setId(id);
            girl.setName(name);
            return girlRepository.save(girl);
        }
        @DeleteMapping(value = "/girls/{id}")
        public String deleteGirlById(@PathVariable("id") Integer id) {
            girlRepository.delete(id);
            return "删除ID为:" + id + " 的女生成功!";
        }
    }

        相关结果:

        

         

    设置请求头:
        Content-Type:application/x-www-form-urlencoded

        

        如果需要自定义查询(例如按照年龄查询),需要在repository中先进行声明(很多都有现成的,直接声明即可,无需实现!)

    public interface GirlRepository extends JpaRepository<Girl, Integer>{
        // 新增自定义查询方法
        List<Girl> findByAge(Integer age);
    }
     @GetMapping(value = "/girls/age/{age}")
        public List<Girl> getListByAge(@PathVariable("age") Integer age) {
            return girlRepository.findByAge(age);
        }
  • 相关阅读:
    Asp.Net Core 轻松学-被低估的过滤器
    Asp.Net Core 轻松学-利用文件监视进行快速测试开发
    Asp.Net Core 轻松学-利用xUnit进行主机级别的网络集成测试
    Asp.Net Core 轻松学-HttpClient的演进和避坑
    Asp.Net Core 轻松学-基于微服务的后台任务调度管理器
    Asp.Net Core 轻松学-一行代码搞定文件上传
    .NET Core 2.2 新增部分功能使用尝鲜
    Asp.NetCore轻松学-业务重点-实现一个简单的手机号码验证
    Asp.Net Core 轻松学-实现跨平台的自定义Json数据包
    Asp.Net Core 轻松学-利用 Swagger 自动生成接口文档
  • 原文地址:https://www.cnblogs.com/jiangbei/p/8433308.html
Copyright © 2011-2022 走看看