spring data(暂时写下jpa的部分,后续继续更新,jpa的多对多之类的就不再玩了,可以回看之前的jpa部分)

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

搭建环境
  1. 创建maven工程

  2. 添加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,暂时没找到解决办法

  3. 编写实体类

    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;
    }
    
  4. 编写启动类

    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);
        }
    }
    
  5. 编写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提供的接口,接口当中定义了实体的基本操作
     //只是单表简单的增删改查的话,我啥都不用写,而且不用写实现类,因为动态代理已经生成了一个实现类。
    }
    
  6. 编写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);
        }
    }
    
  7. 编写启动类

    途中遇到个小问题,创建的表不是InnoDB引擎,解决办法:

    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect #指定mysql数据库版本5,且引擎是innodb
    

    注意InnoDB字样

  8. 测试

    • 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.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值