不惑之年的硬件牛人转到软件自学之spring cloud:(十三)微服务与数据库之JPA的增、删、查、改

 前言:笔者曾经有18年的硬件研发经验,从(1)51单片机到(2)FPGA到(3)嵌入式ARM(ARM9到CORTEX A9)全都研发设计过,产品从(1)B超的整机研发到(2)智能家居系统到(3)无线电监测机到(4)平板电脑研发到(5)路灯智能控制到(5)工业电脑均有涉及,从(1)普通的电子技术工程师到(2)副总工程师到(3)副总经理到(4)事业部总经理。。。目前已经步入不惑之年的我对于物联网技术的热衷,决定从硬件开始全面转到物联技术框架之一的spring cloud技术,把我的整个学习经历和大家一起分享,也期待在之后有更多机会和大家一起合作,探讨。

      今天是:2018年5月8日      研究主题:微服务与数据库之JPA的增、删、查、改

      学习spring cloud已经有半年多了,但写这个《不惑之年的硬件牛人转到软件自学之spring cloud》已经有一个月了,写的过程很辛苦但收获很多,感觉很多都已经能落地了,而不是停留在理论下的,后面我可能会继续写其他关于物联网方面的微博系列,也会牵涉到很多硬件方面的内容,也请各位能多多关注。

        好了,以上写了一些废话,下面我们学习微服务与数据库之JPA。首先,我们介绍一下Spring Data框架。这个框架的目标是为数据的访问提供一个通用的模型。下图是它与数据库的关系。

     

      Spring Data的主要功能如下:

      1、提供数据与对象映射的抽象层,同一个对象可以映射为不同数据库的数据;

      2、根据数据存储接口的方法名,自动实现数据查询;

      3、为各个领域模型提供最基本的实现,例如像普通的增、删、改、查功能;

      4、可在原有逻辑的基础上,实现自定义的数据库操作逻辑。

       JPA是Java Persistence API的简称,是Sun在早期推出的持久层规范,目前实现JPA规范的主流框架有Hibernate、OpenJPA等。

     一、建一个“cjb-jpa”的 工程项目,实现简单的数据库查询流程:

    1、修改“pom.xml”,增加依赖 

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-jpa</artifactId>
   <version>1.5.4.RELEASE</version>
</dependency>
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>5.1.42</version>
</dependency>

     注意:加入spring-boot-starter-data-jpa后,Maven会自动帮我们引入Hibernate5、Spring Data JPA等包。完整代码如下:

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.crazyit.cloud</groupId>
   <artifactId>cjb-jpa</artifactId>
   <version>0.0.1-SNAPSHOT</version>

   <dependencies>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
         <version>1.5.4.RELEASE</version>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-data-jpa</artifactId>
         <version>1.5.4.RELEASE</version>
      </dependency>
      <dependency>
         <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
         <version>5.1.42</version>
      </dependency>
   </dependencies>

</project>

2、在数据库表中新建cjb_jpa的数据库,并建一个表叫“cjb_person”,表的内容如下:


 3、更改“application.yml”的内容:

server:
  port: 8011
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/cjb-jpa
    username: root
    password: xxxxx(密码省略)

4、我们按照规范建立各个包,如下:

                                                    

      注解:controller用于存放控制器;entity用于存放映射实体;service用于存放业务层对象;dao用于存放数据库访问对象。

    5、在“entity”下面新建一个映射实体叫Person

    首先使用注解@Entity;

    其次使用@Table表示映射的数据库表名称为“cjb_person”;

    第三用@Id申明ID列;

    第四用@GeneratedValue申明组件策略;

    第五再用GET和SET

    完整代码如下:

package com.data.jpa.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "cjb_person")
public class Person {

    @Id
    @GeneratedValue
   private Integer id;
   
   private String name;
   
   private Integer age;
    
    private String message;

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

   public String getMessage() {
      return message;
   }

   public void setMessage(String message) {
      this.message = message;
   }
}

 6、新建“CjbDao”数据库访问类,只用继承“JpaRepository”即可

package com.data.jpa.dao;



import com.data.jpa.entity.Person;
import org.springframework.data.jpa.repository.JpaRepository;


public interface CjbDao extends JpaRepository<Person, Integer>{


}

7、新建“CjbService”类,提供获取数据库全部数据的服务,通过上面生成的CjbDao类可以获取findAll获取数据库表里面所有的数据

package com.data.jpa.service;

import java.util.List;

import com.data.jpa.entity.Person;
import com.data.jpa.dao.CjbDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class CjbService {

   @Autowired
   CjbDao cjbDao;
   
   public List<Person> getData() {
      List<Person> cjbdata = cjbDao.findAll();
      return cjbdata;
   }


}

8、当然必须建一个controller的类来通过访问路径的方式来获取“CjbService”里面的getData()函数

package com.data.jpa.controller;

import java.util.List;

import com.data.jpa.entity.Person;
import com.data.jpa.service.CjbService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class CjbController {
   
   @Autowired
   private CjbService cjbService;

   @RequestMapping(value = "/getalldata", method = RequestMethod.GET,
         produces = MediaType.APPLICATION_JSON_VALUE)
   public List<Person> getalldata() {
      return cjbService.getData();
   }
   

}

9、当然最重要的就还需要新建一个主类“CjbJpa”来启动程序

package com.data.jpa;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class CjbJpa {

   public static void main(String[] args) {
      SpringApplication.run(CjbJpa.class, args);
   }

}

10、总结以上流程就是:


11、最后运行主类,并在8011端口,输入网址:http://localhost:8011/getalldata

                           

 二、查询name=chenjb730的数据库内容

1、在“CjbDao”中增加name(String name),记住必须和Person里面的属性一致,所以必须是name,否则会报错:

List<Person> name(String name);

2、在“CjbService”中增加调用服务:

public List<Person> getcName(String name) {
   return cjbDao.name(name);
}

3、在“CjbController”中通过路径“/getname/{name}”访问

@RequestMapping(value = "/getname/{name}", method = RequestMethod.GET,
      produces = MediaType.APPLICATION_JSON_VALUE)
public List<Person> getcjbname(@PathVariable String name) {
   return cjbService.getcName(name);
  }

4、运行主程序“CjbJpa”,输入网址:http://localhost:8011/getname/chenjb730 ,已经实现通过姓名name=chenjb730查询到相关数据库内容。


三、通过findby...来查询,如下表:


四、我们以“findByLastnameAndFirstname”为例,查询:name=chenjb730 and age=41的数据库表

1、根据上面的表,我们在“CjbDao”里面新建一个findByNameAndAge(String name,Integer age)的函数

List<Person> findByNameAndAge(String name,Integer age);

2、在“CjbService”服务中提供获取name=chenjb730 and age=41的查询条件:

public List<Person> getNameAndAge(String name,Integer age) {
   return cjbDao.findByNameAndAge(name,age);
}

3、在“CjbController”中建立访问路径“/getnameandage”访问满足name=chenjb730 and age=41的数据库表的数据

@RequestMapping(value = "/getnameandage/{name}/{age}", method = RequestMethod.GET,
      produces = MediaType.APPLICATION_JSON_VALUE)
public List<Person> getnameage(@PathVariable String name,@PathVariable Integer age) {
   return cjbService.getNameAndAge(name,age);
}

4、运行主类,并输入网页:http://localhost:8011/getnameandage/chenjb730/41,就可以获取name=chenjb730 and age=41的数据库表的数据


五、我们以“findByAgeLessThanEqual”为例,查询:age<=33的数据库表数据

1、根据上面的表,我们在“CjbDao”里面新建一个findByAgeLessThanEqual(Integer age)的函数

List<Person> findByAgeLessThanEqual(Integer age);

2、在“CjbService”服务中提供获取age<=33的查询条件:

public List<Person> getAge(Integer age) {
   return cjbDao.findByAgeLessThanEqual(age);
}
3、在“CjbController”中建立访问路径“/getage/{age}”访问满足 age<=33的数据库表的数据
@RequestMapping(value = "/getage/{age}", method = RequestMethod.GET,
      produces = MediaType.APPLICATION_JSON_VALUE)
public List<Person> getnameage(@PathVariable Integer age) {
   return cjbService.getAge(age);
}

4、运行主类,并输入网页:http://localhost:8011/getage/33,就可以获取age<=33的数据库表的数据


六、使用原生的数据库查询方法,我们通过输入name=chenjb730来查询

1、首先在“CjbDao”创建一个“@Query”注解,并用nativeQuery表示原生查询方法

@Query(value="SELECT * FROM cjb_person WHERE NAME = ?1",nativeQuery = true)
List<Person> findMyName(String name);

2、在“CjbService”中增加一条方法“findMyNameOk”

public List<Person> findMyNameOk(String name){
   return cjbDao.findMyName(name);
}

3、紧接着在“CjbController”中增加访问路径:/getmyname/{name}

@RequestMapping(value = "/getmyname/{name}", method = RequestMethod.GET,
      produces = MediaType.APPLICATION_JSON_VALUE)
public List<Person> getmyname(@PathVariable String name) {
   return cjbService.findMyNameOk(name);
}

4、运行主程序“CjbJpa”,并输入网址:http://localhost:8011/getmyname/chenjb730,已经可以访问name=chenjb730的数据库数据了。怎么样,是不是很神奇奋斗


七、以上是查询,这节介绍一下删除

1、因为JpaRepository已经集成了delete删除功能,所以只用在cjbservice.java中增加删除函数deleteid即可

public void deleteid(Integer id) throws Exception{
   cjbDao.delete(id);

}

2、在“cjbcontroller”中增加删除路径“/deletid/{id}”

@RequestMapping(value = "/deletid/{id}", method = RequestMethod.GET,
      produces = MediaType.APPLICATION_JSON_VALUE)
public String delmyid(@PathVariable Integer id) throws Exception {
   cjbService.deleteid(id);
   return "delete is ok!";
}

3、访问网页,输入:http://localhost:8010/deletid/1,返回OK


4、查看数据库,已经删除了


八、以上是删除,这节介绍一下保存修改

1、因为JpaRepository已经集成了save功能,具备添加和修改的功能,我们将ID=2的name由“chenjb730”修改为“cjbxyf”;将age由“30”修改为“28”,所以只用在cjbservice.java中增加修改函数save即可

public void updateid(Integer id) throws Exception{
   Person person = new Person();
   person.setId(id);
   person.setName("cjbyxf");
   person.setAge(28);
   person.setMessage("yxf nihao!");
   cjbDao.save(person);

}

2、在“cjbcontroller”中增加修改路径“/updateid/{id}"

@RequestMapping(value = "/updateid/{id}", method = RequestMethod.GET,
      produces = MediaType.APPLICATION_JSON_VALUE)
public String updatemyid(@PathVariable Integer id) throws Exception {
   cjbService.updateid(id);
   return "update is ok!";
}

3、访问网页,输入:http://localhost:8010/updateid/2,返回OK


4、查看数据库,已经修改了


5、增加也是一样,只是目前需要把ID号加入才能用待研究中。。。

八、如果需要完整代码的朋友,可以加入作者QQ群:智物联的spring cloud,入群说明:spring cloud代码需求

                        


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值