springdata
springdata(这玩意是spring家族成员)简介
现代的开发技术中,redis用于缓存热点数据,mongodb用于存储文档数据,elasticsearch用于支持强大的搜索功能。
在Java的访问技术中有针对关系型数据库的mybatis、jpa、针对redis的jedis等等。每个技术的api都不一样,springdata将这些不同的api统一起来,也就是说springdata支持关系型和非关系型数据库。
因此,spring data jpa(把jpa封装了一次)只是springdata中的一个模块。
springdata的主要模块
-
spring data jpa
对jpa的spring data存储库支持
-
spring data mongodb
对mongodb的基于spring对象文档的存储库支持
-
spring data common
spring data的核心模块,定义了spring data的核心功能
-
spring data jdbc
对jdbc的spring data存储库支持
-
spring data redis
封装jedis技术,访问redis
-
spring data elasticsearch
访问elasticsearch
spring data jpa
搭建环境
-
创建maven工程
-
添加springboot、spring data jpa、mysql的依赖
从
maven
开始<!--springboot--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.2.RELEASE</version> </parent> <dependencies> <!-- springBoot 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> <version>5.1.6</version> </dependency> <!--单元测试--> <!--springboot集成junit测试的起步依赖 junit-vintage-engine 是 JUnit 4 中使用的测试引擎。 junit-jupiter-engine 是 JUnit 5 中使用的测试引擎。--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--lombok插件--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!--热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <!--依赖不会被传递--> <scope>provided</scope><!--无需参与项目的编译--> </dependency> </dependencies>
ps:springboot2.1.6.RELEASE中
@SpringBootTest
注解不起作用,原因未知,改成springboot2.2.2.RELEASE,就ok了热部署:https://www.cnblogs.com/zhukf/p/12672180.html
热部署小问题:热部署之后,原先能访问的链接,都
Whitelabel Error Page
,暂时没找到解决办法 -
编写实体类
package com.yyh.domain; import lombok.Getter; import lombok.Setter; import lombok.ToString; import javax.persistence.*; import java.util.Date; @Entity//扫描该实体类 @Getter//Lombok的注解 @Setter//Lombok的注解 @ToString//Lombok的注解 public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; private Integer age; @Column(name = "hiredate") @Temporal(TemporalType.DATE) private Date hireDate; }
-
编写启动类
package com.yyh; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringbootUserCRUDApplication { public static void main(String[] args) { SpringApplication.run(SpringbootUserCRUDApplication.class,args); } }
-
编写dao类
package com.yyh.dao; import com.yyh.domain.User; import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository<User,Long> {//JpaRepository:jpa提供的接口,接口当中定义了实体的基本操作 //只是单表简单的增删改查的话,我啥都不用写,而且不用写实现类,因为动态代理已经生成了一个实现类。 }
-
编写controller类
package com.yyh.controller; import com.yyh.dao.UserRepository; import com.yyh.domain.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { @Autowired UserRepository userRepository; @GetMapping("/user/{id}") public User findById(@PathVariable("id") Long id){ //userRepository.findById(id)会返回一个Optional对象是java8的新特性,主要是为了避免空值 //也可以userRepository.findById(id).get() User user = userRepository.findById(id).orElse(null); return user; } @GetMapping("/user")//应该用post方式的,但为了测试方便,使用get public User saveUser(User user){ User saveUser = userRepository.save(user); //对于spring data jpa的save方法 //如果没有指定id字段,就是添加操作 //如果指定了id字段,就是修改操作(先查询记录是否存在,若存在,则更新,不存在就是添加操作) return saveUser; } @GetMapping("/user/delete/{id}") public void deleteById(@PathVariable("id") Long id){ userRepository.deleteById(id); } }
-
编写启动类
途中遇到个小问题,创建的表不是InnoDB引擎,解决办法:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect #指定mysql数据库版本5,且引擎是innodb
注意InnoDB字样
-
测试
-
增
http://localhost:8080/user?name=sansan&age=3&hireDate=2021/02/07
ps:日期一定要斜线分割,不然无法转换,报错
-
查
http://localhost:8080/user/1
-
改
http://localhost:8080/user?id=1&name=pangpang&age=6&hireDate=2021/02/08
ps:有帅得发光的同学要问了,日期没改掉啊,事实上日期改掉了,图中是标准时间,而我们是东八区,16+8=24,是不是对上了?有数据库图为证:
-
删
http://localhost:8080/user/delete/1
原来只有一个,删除了一个还剩一个,因为我在中途又加了一个,发现没,图中的id是2.
-