前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >springdata入门(纯赶货)

springdata入门(纯赶货)

原创
作者头像
用户9744129
发布2023-01-12 14:07:09
6040
发布2023-01-12 14:07:09
举报
文章被收录于专栏:springdata

入门

初始化springboot

在这里插入图片描述
在这里插入图片描述

依赖引入

代码语言:html
复制
<!--        springdata-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
<!--        阿里巴巴数据库池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.16</version>
        </dependency>
<!--        mysql引擎-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
<!--        lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

配置文件

代码语言:java
复制
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/blog?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
    username: root
    password: xx
    type: com.alibaba.druid.pool.DruidDataSource
  #JPA配置
  jpa:
    database-platform: org.hibernate.dialect.MySQL5Dialect
    # 自动更新数据库表结构,也可以是 validate | update | create | create-drop
    properties:
      hibernate:
        hbm2ddl:
          auto: update
    # 显示sql语句
    show-sql: true

实体类

代码语言:java
复制

package com.learn.springdata.pojo;

import lombok.*;

import org.hibernate.Hibernate;

import javax.persistence.*;

import java.util.Date;

import java.util.Objects;

/**

  • 测试用户实体类
  • @author itdragon */ @Table(name = "itdragon_user") @Entity @Getter @Setter @ToString @NoArgsConstructor @AllArgsConstructor public class UserTest { @Id //GeneratedValue(生成的值) //strategy代表主键生成策略 @GeneratedValue(strategy = GenerationType.AUTO) private Long id; // 自增长主键 private String account; // 登录的账号 //Column对一个字段进行标注,nullable:是否可为NULL //unique:值是否不能重复 //name:数据库中的字段名 @Column(nullable = false,unique = false,name = "user_name") private String userName; // 注册的昵称 //transient(暂时的) 标注此注解后在创建数据表的时候将会忽略该属性 @Transient private String isTest; // Temporal(时间的) :向数据库映射日期(Date)属性时用来调整映射的精度。Date 类型的数据有 DATE, TIME, 和 TIMESTAMP 三种精度(即单纯的日期,时间,或者两者兼备). @Temporal(TemporalType.DATE) private Date birth; @Temporal(TemporalType.TIMESTAMP) private Date createTime;
代码语言:txt
复制
@Override
代码语言:txt
复制
public boolean equals(Object o) {
代码语言:txt
复制
    if (this == o) return true;
代码语言:txt
复制
    if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
代码语言:txt
复制
    UserTest userTest = (UserTest) o;
代码语言:txt
复制
    return id != null && Objects.equals(id, userTest.id);
代码语言:txt
复制
}
代码语言:txt
复制
@Override
代码语言:txt
复制
public int hashCode() {
代码语言:txt
复制
    return getClass().hashCode();
代码语言:txt
复制
}

}

代码语言:txt
复制
效果
在这里插入图片描述
在这里插入图片描述
接口的springdata的书写(重点)
知识点2
代码语言:txt
复制
  * 重点知识:SpringData 查询方法定义规范
 * 1. 查询方法名一般以 find | read | get 开头,建议用find
 * findByAccount : 通过account查询User
 * account是User的属性,拼接时首字母需大写
 * 2. 支持的关键词有很多比如 Or,Between,isNull,Like,In等
 * findByEmailEndingWithAndCreatedDateLessThan : 查询在指定时间前注册,并以xx邮箱结尾的用户
 * And : 并且
 * EndingWith : 以某某结尾
 * LessThan : 小于
 * 注意
 * 若有User(用户表) Platform(用户平台表) 存在一对一的关系,且User表中有platformId字段
 * SpringData 为了区分:
 * findByPlatFormId 	表示通过platformId字段查询
 * findByPlatForm_Id 	表示通过platform实体类中id字段查询
 * <p>
 * 开发建议
 * 表的设计,尽量做单表查询,以确保高并发场景减轻数据库的压力。
 
知识点3

重点知识:使用 @Query 注解

代码语言:txt
复制
 * <p>
 * 上面的方法虽然简单(不用写sql语句),但它有最为致命的问题-----不支持复杂查询,其次是命名太长
 * 1. 使用@Query 注解实现复杂查询,设置 nativeQuery=true 使查询支持原生sql
 * 2. 配合@Modifying 注解实现创建,修改,删除操作
 * 3. SpringData 默认查询事件为只读事务,若要修改数据则需手动添加事务注解
 * <p>
 * 注意
 * 若@Query 中有多个参数,SpringData 提供两种方法:
 * 第一种 ?1 ... ?2 		要求参数顺序一致
 * 第二种 :xxx ... :yyy 	xxx 和 yyy 必须是实体类对应的属性值,不要求参数顺序但参数前要加上@Param("xxx")
 * 模糊查询可使用 %xxx%
 * <p>
 * 开发建议
 * 1. 参数填写的顺序要保持一致,不要给自己添加麻烦
 * 2. 建议使用@Query,可读性较高接口清单  

CrudRepository接口提供的方法与说明:

方法 说明

\<S extends T> S save(S var1); 保存实体。当实体中包含主键时,JPA会进行更新操作。

\<S extends T> Iterable\<S> saveAll(Iterable\<S> var1); 保存所有实体。实体必须不为空。

Optional\<T> findById(ID var1); 根据主键ID检索实体。

boolean existsById(ID var1); 根据主键ID检索实体,返回是否存在。值为布尔类型。

Iterable\<T> findAll(); 返回所有实体。

Iterable\<T> findAllById(Iterable\<ID> var1); 根据给定的一组ID值返回一组实体。

long count(); 返回实体的数量

void deleteById(ID var1); 根据ID删除数据。

void delete(T var1); 删除给定的实体。

void deleteAll(Iterable\<? extends T> var1); 删除实体。

void deleteAll(); 删除所有实体。

开发建议

这里列出的是常用方法 CrudRepository 中的findAll() 方法要慎用。当数据库中数据量大,多线程脚本调用findAll方法,系统可能会宕机。 CrudRepository 中的deletAll()方法要慎用。这是物理删除,现在企业一般采用逻辑删除。

PagingAndSortingRepository 和 JpaSpecificationExecutor 能满足大部分业务需求。

简单的增删查改

接口
代码语言:java
复制
public interface UserRepository extends PagingAndSortingRepository<UserTest, Long>,
        JpaSpecificationExecutor<UserTest> {
}
测试代码
代码语言:java
复制
    @Autowired
    UserRepository us;

    //查找所有用户
    @Test
    public void findAllUser() {
        Iterable<UserTest> usAll = us.findAll();
        usAll.forEach(System.out::println);
    }

    // 新增用户
    @Test
    public void saveUser() {
        UserTest u=new UserTest();
        u.setUserName("张三四次");
        u.setAccount("你爹");
        UserTest byAccount = us.save(u);
        System.out.println(byAccount);
    }
    //删除用户
    @Test
    public void deleteUser(){
        //方法1
        Optional<UserTest> us1 = us.findById(1L);
        UserTest test;
        //Present为存在之意,isPresent表示us1中是否存在值
        if (us1.isPresent()) {
            //没有返回值奥,和mp不一样
            us.deleteById(1L);
            System.out.println("删除成功!");
        }
        else {
            System.out.println("删除失败!");
        }
        //方法2
        try
        {
            us.deleteById(1L);
            System.out.println("删除成功!");
        }
        catch(Exception ex)
        {
            System.out.println("删除失败!");
        }
    }
    //更新用户
    @Test
    public void updateUser(){
        UserTest u=new UserTest();
        u.setUserName("张fd三四次");
        u.setAccount("你df爹");
        u.setId(2L);
        //使用的方法和新增一样
        UserTest save = us.save(u);
        System.out.println(save);
    }

使用类SQL(注解开发)

适用于复杂的业务场景

使用JPQL语句(HQL)
代码语言:txt
复制
1 查询时使用的是实体类的字段,而不是数据库中的字段
代码语言:txt
复制
2 变量使用:变量名的形式,在方法参数中还有使用@Param("xx")
代码语言:txt
复制
3 更新操作需要加上 @Modifying

--接口代码--

代码语言:java
复制
代码语言:txt
复制
//查找用户id通过用户名
代码语言:txt
复制
@Query("select id from UserTest where userName=:name")
代码语言:txt
复制
List<Long> findUserIdByName(@Param("name") String name);
代码语言:txt
复制
//查找所有用户并排序(升)
代码语言:txt
复制
@Query("select userName from UserTest order by userName")
代码语言:txt
复制
List<String> findAllUserNameSort();
代码语言:txt
复制
//查找所有用户并排序(降)
代码语言:txt
复制
@Query("select userName from UserTest order by userName desc ")
代码语言:txt
复制
List<String> findAllUserNameSortDesc();
代码语言:txt
复制
 //模糊加分页查询
代码语言:txt
复制
@Query("select u from UserTest u where u.userName like %:name%")
代码语言:txt
复制
Page<UserTest> findUserByLikeName(String name, Pageable pageable);
代码语言:txt
复制

--测试代码--

代码语言:java
复制
    //查找用户id通过用户名
    @Test
    void findUserIdByName(){
        List<Long> ids = us.findUserIdByName("张fd三四次");
        System.out.println(ids);
    }
    //查找所有用户名并对用户名排序
    @Test
    void findAllUserName(){
        List<String> userSort = us.findAllUserNameSort();
        List<String> userSort2 = us.findAllUserNameSortDesc();
        System.out.println(userSort);
        System.out.println(userSort2);
    }
    //模糊加分页查询
    @Test
    void findTest(){
        //构建排序
        Sort sort= Sort.by(Sort.Direction.ASC,"id");
        //构建分页
        int pageIndex=0;
        int pageSize=2;
        PageRequest pageRequest = PageRequest.of(pageIndex, pageSize,sort);
        //执行分页+排序+模糊
        Page<UserTest> lists = us.findUserByLikeName("张",pageRequest);
        //获取结果
        List<UserTest> content = lists.getContent();
        System.out.println(content);
    }
使用SQL语句

提示:

代码语言:txt
复制
1这里的占位符使用的是?与jdbc相似,1表示第几个参数
代码语言:txt
复制
2使用sql查询是SQL语句中的字段必须要和数据库对应

--接口代码--

代码语言:java
复制
    //使用SQL
    @Query(value = "select id from itdragon_user where user_name=?1",nativeQuery = true)
    List<Long> findUserIdByNameUserSQL(String name);

--测试代码--

代码语言:java
复制
    //使用SQL语句
    @Test
    void UserSQLTest(){
        List<Long> sql = us.findUserIdByNameUserSQL("张fd三四次3");
        System.out.println(sql);
    }

使用接口查询语法

献上一张图,内容全在其中

在这里插入图片描述
在这里插入图片描述

--接口--

代码语言:java
复制
    //使用接口查询语法
    // 1 通过账号查用户信息
    List<UserTest> findByAccount(String account);

    //2 对用户名模糊查询
    List<UserTest> findByUserNameLike(String name);

    //3 批量查找特定id的用户
    List<UserTest> findByIdIn(List<Long> ids);

    //4 查找用户名为:张fd三四次1,昵称为你df爹的用户
    UserTest findByUserNameAndAccount(String userName, String account);

--测试--

代码语言:java
复制
    @Test
    void UserTSTest(){
        List<UserTest> a = us.findByAccount("你df爹");
        System.out.println(a);

        List<UserTest> a1 = us.findByUserNameLike("你");
        System.out.println(a1);

        UserTest b = us.findByUserNameAndAccount("张fd三四次3", "你df爹");
        System.out.println(b);

        List<Long> ids=new ArrayList<>();
        ids.add(2L);
        ids.add(3L);
        List<UserTest> c = us.findByIdIn(ids);
        System.out.println(c);
    }

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 入门
    • 初始化springboot
      • 依赖引入
        • 配置文件
          • 实体类
            • 接口的springdata的书写(重点)
          • 简单的增删查改
            • 接口
            • 测试代码
          • 使用类SQL(注解开发)
            • 使用JPQL语句(HQL)
            • 使用SQL语句
          • 使用接口查询语法
          相关产品与服务
          数据库
          云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档