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);
    }

 

posted @ 2018-02-08 21:41  ---江北  阅读(1319)  评论(0编辑  收藏  举报
TOP