不惑之年的硬件牛人转到软件自学之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代码需求