SpringBoot-15-Spring-Data-Jpa的使用
Spring Data Jpa 介绍
什么是JPA?
JPA(Java Persistence API)是Java持久化API的意思,他是在JDK5.0后提出的Java持久化规范,具体可参考官网https://github.com/javaee/jpa-spec。
JPA的出现是为了简化持久层和整合ORM技术,Hibernate、TopLink、JDO等ORM框架各自为营的局面。JPA主要包含一下三个方面的技术:
ORM(object/relational metadata)元数据的映射:JPA支持xml和注解两种方式,元数据描述对象和表之间的映射关系,框架根据此将对象持久化到数据库表中。
对象查询语言(*Java Persistence Query Language JPQL):这个是持久化操作中重要的一环,通过面向对象数据库的查询语言,避免程序SQL语句的高耦合。
API: 操作实体对象来执行CRUD操作。
代码实现
创建springboot项目
- 在pom.xml中添加jpa依赖
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
- 在application.yml中的配置:包含数据库链接信息和自动创建表结构的设置
server: port: 8899 spring: datasource: url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf-8&useSSL=false username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: validate show-sql: true database: mysql
注:
spring.jpa.show-sql:为true时表示在日志中展示Sql语句
spring.jpa.hibernate.ddl-auto:hibernate的配置属性,会根据实体类去更新、创建、验证表结果使用的时候需要注意
create:hibernate的每次加载都会将上次生成的表进行删除,然后重新生成表,生成表的依据是我们的实体类。
create-drop:hibernate的每次加载都会根据根据实体类进行生成表,每一次sessionFactory关闭表就会被删除。
update: hibernate被第一次加载的时候会根据实体类进行创建表结构,以后hibernate加载时会根据实体类结构去自动更新表结构。‘
validate:hibernate每次加载,都会去验证表结构,但是不会去创建表(生成环境一般使用这个)
代码的实现
创建表
REATE TABLE `student` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID', `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '学生姓名', `sex` enum ('男', '女') DEFAULT '男' COMMENT '性别默认男', `age` tinyint unsigned default 1 comment '年龄', `mobile` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '注册手机号', `email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '注册邮箱', `create_date` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0), `update_date` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0), `is_enabled` int(2) NULL DEFAULT 1 COMMENT '帐户是否可用(1 可用,0 删除用户)', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `name`(`name`) USING BTREE, UNIQUE INDEX `mobile`(`mobile`) USING BTREE, UNIQUE INDEX `email`(`email`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '学生表' ROW_FORMAT = Dynamic;
创建实体类
@Table(name="student") @Entity @Data public class Student { @Id @GeneratedValue(strategy= GenerationType.IDENTITY) private Long id; private String name; private String sex; private int age; private String email; private String mobile; private int isEnabled; private Date createDate; private Date updateDate; }
注:
@Entity必须有,表示这个类是一个实体类
@Table:可选,用于指定数据库表名,类名和数据库表名符合驼峰及下划线规则,可以省略这个注解。
@Id:表示表的主键
@Generated:表示主键的生成方式
想要了解更多可以去官方文档进行查看:hibernate官方文档。
创建数据接口
public interface StudentService extends JpaRepository<Student, Long> { /** * 获取所有学生信息 * @return */ @Query("from Student s where s.isEnabled=1") List<Student> getAllSutdents(); }
JpaRepository为我们提供了各种针对单表的数据操作方法:增删改查。
创建Controller层
@Slf4j @RestController @RequestMapping("/student") public class StudentController { @Autowired private StudentService studentService; @GetMapping("getallstudents") public List<Student> getAllSutdents(){ List<Student> allSutdents = studentService.getAllSutdents(); return allSutdents; } /** * 保存数据 * @param student * @return */ @PostMapping("create") public Student saveStudent(@RequestBody Student student) { //保存一个对象到数据库,insert studentService.saveAndFlush(student); return student; } @GetMapping("/{id}") public Student getSutdentInfo(@PathVariable("id") Long id) { Optional<Student> optional = studentService.findById(id); return optional.orElseGet(Student::new); } @GetMapping("/delete/{id}") public void deleteSutdent(@PathVariable("id") Long id) { //根据id删除1条数据库记录 studentService.deleteById(id); } @PostMapping("update") public @ResponseBody Student updatSutdent(@RequestBody Student student) { Optional<Student> optional = studentService.findById(student.getId()); Student stu = optional.orElseGet(Student::new); stu.setEmail(student.getEmail()); stu.setMobile(student.getEmail()); stu.setAge(student.getAge()); stu.setSex(student.getSex()); stu.setName(student.getName()); stu.setUpdateDate(new Date()); //保存一个对象到数据库,insert Student save = studentService.save(student); return save; } @GetMapping("getall") public List<Student> getAll() { List<Student> studentList = studentService.findAll(); //查询article表的所有数据 return studentList; } }
测试
启动项目打开postman,测试http://localhost:8899/student/getallstudents:结果为:
[ { "id": 11, "name": "小芳", "sex": "女", "age": 23, "email": "825505212@qq.com", "mobile": "13333835900", "isEnabled": 1, "createDate": "2022-02-26T14:40:30.000+00:00", "updateDate": "2022-02-26T14:40:30.000+00:00" }, { "id": 24, "name": "李四", "sex": "男", "age": 23, "email": "825505242@qq.com", "mobile": "133338359345", "isEnabled": 1, "createDate": "2022-02-28T11:42:04.000+00:00", "updateDate": "2022-02-28T11:42:04.000+00:00" } ]
其他
JPA的功能不止有有这些,这只是作为spring boot系列教程,并不能将spring data jpa的全面讲到,相应全面了解还要到官方文档进行深度了解。
如果您觉得本文不错,欢迎关注支持,您的关注是我坚持的动力!