SpringBoot之Spring Data JPA入门学习2

news2024/11/28 14:07:15

我们继续使用上一章的环境。SpringBoot之Spring Data JPA入门学习

一、自动生成数据

我们修改一下实体 增加了几个注解:

@CreationTimestamp 自动生成创建时间。

@UpdateTimestamp 自动生成更新时间。

使用这两个注解我们还需要在类上加上两个注解@DynamicInsert和@DynamicUpdate

import lombok.Data;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.UpdateTimestamp;

import javax.persistence.*;
import java.math.BigDecimal;
import java.util.Date;

/**
 * @author qinxun
 * @date 2023-06-07
 * @Descripion: 用户实体
 */
@Entity
@Table(name = "t_user")
@Data
@DynamicInsert
@DynamicUpdate
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 姓名
     */
    @Column(name = "name")
    private String name;

    /**
     * 年龄
     */
    @Column(name = "age")
    private Integer age;

    /**
     * 余额
     */
    @Column(name = "money")
    private BigDecimal money;

    /**
     * 是否删除
     */
    @Column(columnDefinition = "bit default 0 COMMENT '是否删除'")
    private Boolean deleted;


    /**
     * 创建时间
     */
    @Column(name = "create_at")
    @CreationTimestamp
    private Date createAt;

    /**
     * 更新时间
     */
    @Column(name = "update_at")
    @UpdateTimestamp
    private Date updateAt;
}

测试:

import com.example.quartzdemo.entity.User;
import com.example.quartzdemo.repository.UserRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.math.BigDecimal;
import java.util.List;

/**
 * @author qinxun
 * @date 2023-06-07
 * @Descripion: JPA的使用
 */
@SpringBootTest
public class JpaTest {

    @Autowired
    private UserRepository userRepository;

    /**
     * 新增数据
     */
    @Test
    void test1() {
        User user = new User();
        user.setName("张三");
        user.setMoney(BigDecimal.TEN);
        user.setAge(20);
        userRepository.save(user);
    }
}

控制台显示sql执行语句

Hibernate: insert into t_user (age, create_at, money, name, update_at) values (?, ?, ?, ?, ?)

我们查看数据库,数据表自动生成了创建时间和更新时间,deleted字段使用了默认值。

我们修改数据,更新时间也相应的进行了修改

    /**
     * 修改数据
     */
    @Test
    void test4() {
        // 修改ID为1的数据
        User user = userRepository.findById(1L).get();
        user.setAge(21);
        userRepository.save(user);
    }
Hibernate: select user0_.id as id1_1_0_, user0_.age as age2_1_0_, user0_.create_at as create_a3_1_0_, user0_.deleted as deleted4_1_0_, user0_.money as money5_1_0_, user0_.name as name6_1_0_, user0_.update_at as update_a7_1_0_ from t_user user0_ where user0_.id=?
Hibernate: select user0_.id as id1_1_0_, user0_.age as age2_1_0_, user0_.create_at as create_a3_1_0_, user0_.deleted as deleted4_1_0_, user0_.money as money5_1_0_, user0_.name as name6_1_0_, user0_.update_at as update_a7_1_0_ from t_user user0_ where user0_.id=?
Hibernate: update t_user set age=?, update_at=? where id=?

二、数据修改

 如果我们不是通过先查询出数据,再修改对应值的情况,有可能会导致一些没有要修改的数据从有值变没有数值了,会导致出现想不到的结果。如果我们只想更新某个元素,而不是先查询数据再修改的情况,那么我们可以在数据层实现自定义的操作。

import com.example.quartzdemo.entity.User;
import com.example.quartzdemo.repository.UserRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.math.BigDecimal;
import java.util.List;

/**
 * @author qinxun
 * @date 2023-06-07
 * @Descripion: JPA的使用
 */
@SpringBootTest
public class JpaTest {

    @Autowired
    private UserRepository userRepository;

    /**
     * 修改数据
     */
    @Test
    void test4() {
        // 修改ID为1的数据
        User user =  new User();
        user.setId(1L);
        user.setName(null);
        user.setAge(21);
        userRepository.save(user);
    }
}

如果我们只更新其他的一些数据,执行后我们查看数据库,一些原来的数据被清空掉了,这不是我们想要的结果。

Hibernate: select user0_.id as id1_1_0_, user0_.age as age2_1_0_, user0_.create_at as create_a3_1_0_, user0_.deleted as deleted4_1_0_, user0_.money as money5_1_0_, user0_.name as name6_1_0_, user0_.update_at as update_a7_1_0_ from t_user user0_ where user0_.id=?
Hibernate: update t_user set age=?, create_at=?, deleted=?, money=?, name=?, update_at=? where id=?

 我们在数据层创建自定义的操作方法

import com.example.quartzdemo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;

/**
 * @author qinxun
 * @date 2023-06-07
 * @Descripion: 用户数据层
 */
public interface UserRepository extends JpaRepository<User, Long> {

    /**
     * 根据ID修改用户姓名和年龄
     *
     * @param name 姓名
     * @param age  年龄
     * @param id   ID
     */
    @Modifying
    @Query("update User u set u.name=?1,u.age=?2 where u.id=?3")
    void updateNameAndAgeById(String name, Integer age, Long id);

}

涉及到数据修改、删除操作,需要使用 @Modifying 注解。如果是查询就是要@Query注解书写语句就可以了。

  /**
     * 修改数据
     */
    @Test
    @Transactional
    @Rollback(value = false)
    void test4() {
        // 修改ID为1的数据
        userRepository.updateNameAndAgeById(null,21,1L);
    }
Hibernate: update t_user set name=?, age=? where id=?

 我们在数据库看到现在可以实现只更新某些元素了,其他元素没有受到影响。

三、多种查询方式

我们在使用查询的时候,批量插入多条测试数据

insert into t_user(id,name,age,money,deleted,create_at,update_at)
values
(1, '一qxblog',25,100, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40'),
	(2, '一qx2',22, 200, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40'),
	(3, '一qx3',23, 300, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40'),
	(4, '一qx4',24, 400, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40'),
	(5, '一qx5',28, 500, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40'),
	(6, 'Batch 一qxblog',29, 100, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40'),
	(7, 'Batch 一qxblog 2',30, 100, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40'),
	(8, 'Batch 一qx 3',35, 200, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40'),
	(9, 'Batch 一qx 4',45, 200, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40'),
	(10, 'batch 一qx5',29, 1498, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:58'),
	(11, 'batch 一qx6',31, 1498, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:58'),
	(12, 'batch 一qx7',32, 400, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40'),
	(13, 'batch 一qx8',34, 400, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40');

1.根据ID查询

import com.example.quartzdemo.entity.User;
import com.example.quartzdemo.repository.UserRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Optional;


/**
 * @author qinxun
 * @date 2023-06-07
 * @Descripion: JPA的使用
 */
@SpringBootTest
public class JpaTest {

    @Autowired
    private UserRepository userRepository;

    /**
     * 根据ID查询
     */
    @Test
    void test1(){
        Optional<User> userOptional = userRepository.findById(1L);
        // User(id=1, name=一qxblog, age=25, money=100.00, deleted=false, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0)
        System.out.println(userOptional.get());
    }

}

2.根据用户名查询

public interface UserRepository extends JpaRepository<User, Long> {

    /**
     * 根据用户名查询
     * @param name 用户名
     */
    User findByName(String name);

    /**
     * 根据用户名查询
     * @param name 用户名
     * @return
     */
    User queryByName(String name);

}
import com.example.quartzdemo.entity.User;
import com.example.quartzdemo.repository.UserRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Optional;


/**
 * @author qinxun
 * @date 2023-06-07
 * @Descripion: JPA的使用
 */
@SpringBootTest
public class JpaTest {

    @Autowired
    private UserRepository userRepository;

    /**
     * 根据ID查询
     */
    @Test
    void test1() {
        User user1 = userRepository.queryByName("一qx2");
        // 输出User(id=2, name=一qx2, age=22, money=200.00, deleted=false, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0)
        System.out.println(user1);

        User user2 = userRepository.findByName("一qx2");
        // 输出User(id=2, name=一qx2, age=22, money=200.00, deleted=false, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0)
        System.out.println(user2);
    }

}

3.like查询

import com.example.quartzdemo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

/**
 * @author qinxun
 * @date 2023-06-07
 * @Descripion: 用户数据层
 */
public interface UserRepository extends JpaRepository<User, Long> {

    /**
     * 根据用户名查询
     * @param name 用户名
     */
    User findByName(String name);

    /**
     * 根据用户名查询
     * @param name 用户名
     * @return
     */
    User queryByName(String name);

    /**
     * 根据用户名模糊查询
     * @param name 用户名
     */
    List<User> findByNameLike(String name);

}
import com.example.quartzdemo.entity.User;
import com.example.quartzdemo.repository.UserRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;


/**
 * @author qinxun
 * @date 2023-06-07
 * @Descripion: JPA的使用
 */
@SpringBootTest
public class JpaTest {

    @Autowired
    private UserRepository userRepository;

    /**
     * 根据ID查询
     */
    @Test
    void test1() {
        List<User> userList = userRepository.findByNameLike("%qx%");
        System.out.println(userList);
    }

}

查询后返回

Hibernate: select user0_.id as id1_1_, user0_.age as age2_1_, user0_.create_at as create_a3_1_, user0_.deleted as deleted4_1_, user0_.money as money5_1_, user0_.name as name6_1_, user0_.update_at as update_a7_1_ from t_user user0_ where user0_.name like ? escape ?
[User(id=1, name=一qxblog, age=25, money=100.00, deleted=false, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), User(id=2, name=一qx2, age=22, money=200.00, deleted=false, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), User(id=3, name=一qx3, age=23, money=300.00, deleted=false, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), User(id=4, name=一qx4, age=24, money=400.00, deleted=false, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), User(id=5, name=一qx5, age=28, money=500.00, deleted=false, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), User(id=6, name=Batch 一qxblog, age=29, money=100.00, deleted=false, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), User(id=7, name=Batch 一qxblog 2, age=30, money=100.00, deleted=false, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), User(id=8, name=Batch 一qx 3, age=35, money=200.00, deleted=false, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), User(id=9, name=Batch 一qx 4, age=45, money=200.00, deleted=false, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), User(id=10, name=batch 一qx5, age=29, money=1498.00, deleted=false, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:58.0), User(id=11, name=batch 一qx6, age=31, money=1498.00, deleted=false, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:58.0), User(id=12, name=batch 一qx7, age=32, money=400.00, deleted=false, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0), User(id=13, name=batch 一qx8, age=34, money=400.00, deleted=false, createAt=2019-04-18 17:01:40.0, updateAt=2019-04-18 17:01:40.0)]

其他的一些常用的JPA用法

方法名说明等效sql
findByXxx表示根据列Xxx等于传参构建sqlwhere xxx= ?
findByXxxAndYyy根据多个列进行查询where xxx=? and yyy=?
findByXxxOrYyy根据多个列实现or查询where xxx=? or yyy=?
findByXxxLikelike查询,需要注意查询条件中加%where xxx like
findByXxxInin查询where Xxx in ()
findByXxxGreaterThan大于where xxx > ?
findByXxxGreaterThanEqual大于等于where xxx >= ?
findByXxxLessThan小于where xxx < ?
findByXxxLessThanEqual小于等于where xxx <= ?
findByXxxNot不等于where xxx != ?
findByXxxIsBetweenbetween查询where xxx between ? and ?
OrderByXxxDesc排序order by xxx desc
topN分页,表示获取最前面的n条limit n

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/620115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【unity造轮子】排序排行榜的制作

List类中有一个【Sort方法】 可以非常快速的对【整数类】 或者【小数类】元素进行升序 public class TestCompare MonoBehaviour {public List<int>numbers;private void Start(){numbersnew List<int>(){20,10,30,70,60,40,50,90,80,100}:}private void Update()…

stable diffusion图片资源分享和模型推荐,好用的模型有哪些呢?

前言 这篇文章主要是分享我的图片和推荐一些好用的模型&#xff0c;模型不在多在于精&#xff0c;基于几个好的大模型适当下载一下LORA模型&#xff0c;就能画出非常好的图片&#xff0c;多话不说 图片分享 简单展示 详情请看&#xff1a;https://space.bilibili.com/109890…

Amazon Web Services (AWS)上的 OpenText 信息管理(IM) 解决方案

Amazon Web Services (AWS)上的 OpenText 信息管理(IM) 解决方案 OpenText 行业领先的信息管理(IM) 解决方案作为完全托管的服务提供&#xff0c;以 Amazon 公有云环境的安全性、可扩展性和性能为后盾&#xff0c;实现业务数字化转型并推动创新。 价值 降低运营成本30%以上&…

ldap服务安装,客户端安装,ldap用户登录验证测试

安装服务端 # 安装ldap服务 docker run -p 389:389 -p 636:636 \ --name openldap \-v /home/manager/testldap:/testldap \ --env LDAP_ORGANISATION"admin" \ --env LDAP_DOMAIN"hadoop.apache.org" \ --env LDAP_ADMIN_PASSWORD"Dmpxxx" \ -…

上周发布的Notes/Domino 12.0.2FP1以及REST API 1.0.4

大家好&#xff0c;才是真的好。 一段时间没见&#xff0c;有没有分外想念&#xff1f; 其实&#xff0c;我们每周都至少更新一篇&#xff0c;虽然今天是周日&#xff0c;可也是工作日啊&#xff0c;因此本周也算赶上发了一篇。 废话不多说&#xff0c;先上图&#xff1a; …

PMP证书含金量也太高了吧!在一线城市可享受多项福利~

近年来&#xff0c;企业与企业、城市与城市间的人才争夺变得更加激烈&#xff0c;各大城市为了泛集聚和培养重点领域紧缺专业人才均针对持有国际职业资格认证的人才出台了相关优惠政策&#xff0c;目前我了解到的已有以下5个城市针对PMP项目管理及相关行业和认证出台了鼓励政策…

2023-06-07:Redis 持久化方式有哪些?以及有什么区别?

2023-06-07&#xff1a;Redis 持久化方式有哪些&#xff1f;以及有什么区别&#xff1f; 答案2023-06-07&#xff1a; Redis提供了两种持久化机制&#xff1a;RDB和AOF。 RDB RDB持久化是将Redis当前进程中的数据生成快照并保存到硬盘的过程。快照指的是Redis在某一时刻的内…

2.5 TCP网络协议

一、TCP协议网络开发API 1、传输控制块&#xff08;TCB&#xff09; 传输控制块&#xff08;TCB&#xff09;是TCP协议的核心数据结构之一&#xff0c;它用于维护TCP连接状态和处理TCP数据传输。每个TCP连接都有一个对应的TCB&#xff0c;其中包含了该连接的相关信息&#xf…

地震勘探基础(十四)之地震反演

地震反演 反射波地震勘探主要是利用的是地下岩石的弹性差异特征&#xff0c;而弹性差异主要体现在波阻抗差异上。地震波垂直入射情况下&#xff0c;反射系数的公式告诉我们反射界面上下的波阻抗差异越大&#xff0c;反射系数越大&#xff0c;反射振幅也就相对较强。 利用反射波…

使用Hugo+Github从0开始免费搭建个人博客

环境搭建 一.安装git 以win11为例 1.注册git账号&#xff1a;https://github.com/并记住用户名和密码 2.下载地址&#xff1a;Git - Downloads (git-scm.com)鼠标右键显示Git Bash Here就表示安装Git成功了。 3.设置本地git用户 git config --global user.name "Your…

ROS 2 Humble 标定纠正畸变全景鱼眼展开网络摄像头

简介 本文使用 Ubuntu 系统,用 Python 开发 ROS 2 ,用 camera_calibration 功能包标定相机,用 OpenCV 读取视频帧和转换 ROS 2 图像话题,用 MediaMTX 搭建流媒体服务器, 用 FFmpeg 将视频帧输出为视频流。 最终效果: 环境准备 虚拟机 VMware Workstation 安装 Ubunt…

L9110S电机驱动模块demo

0.资料 项目工程文件夹 分文件原理 1.认识L9110S 1、概述&#xff1a; 一个L9110S驱动可以控制一个电机&#xff0c;图中左右两个黑色芯片就是L9110S驱动。当然如果会硬件也可以直接把它们设计到单片机开发板上。 一个电机由两个针脚控制&#xff0c;我们用杜邦线让L9110S…

MidJourney如何画出专业摄影师拍出的照片效果,附提示词

文 / 高扬&#xff08;微信公众号&#xff1a;量子论&#xff09; 最近沉迷于MidJourney作画&#xff0c;与ChatGPT相比&#xff0c;研究AI绘画&#xff0c;可以扩大自己的想像空间。 孩子的想像力更为丰富&#xff0c;如果家有宝宝&#xff0c;可以把孩子们的想法用AI绘画呈现…

面向对象的几大特性总结(适合秋招和小白学习的一篇文章)

前言&#xff1a; 本篇文章主要讲解面向对象的几大特性相关知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出&#xff0c;对大佬有帮助希望可以支持下哦~ 小威在此先感谢各位小伙伴儿了&#x1f601; 以下正文开始 …

Doo Prime 德璞资本:怎么买黄金期货?黄金期货交易特点有哪些?

黄金期货是一种衍生品,是指在期货交易所上交易的黄金合约。作为一种高风险高收益的投资工具,有哪些黄金期货交易特点&#xff1f;本文围绕这一内容展开说明。 黄金期货交易特点一、需要开立账户 黄金期货是期货&#xff0c;如同股票投资要到证券公司开户一样&#xff0c;黄金期…

JVM | Java内存区域

JVM | Java内存区域 1、运行时数据区域1.1、程序计数器(线程私有)1.2、虚拟机栈(线程私有)1.3、本地方法栈(线程私有)1.4、堆(线程共享)1.5、方法区(元空间)(线程共享)1.6、直接内存(线程共享)2、HotSpot 虚拟机对象分配、布局和访问2.1、对象创建流程2.2、对象的…

【高危】Apache Inlong 存在JDBC反序列化漏洞

漏洞描述 Apache InLong 是可用于构建基于流式的数据分析、建模等一站式的海量数据集成框架。 在Apache Inlong受影响版本&#xff0c;由于未对接收的jdbcUrl参数过滤空格字符&#xff0c;导致可以利用空格绕过jdbcUrl中autoDeserialize参数过滤限制&#xff0c;通过认证的攻…

LegalAI领域大规模预训练语言模型的整理、总结及介绍(持续更新ing…)

诸神缄默不语-个人CSDN博文目录 最近更新日期&#xff1a;2023.6.7 最早更新日期&#xff1a;2023.6.7 文章目录 1. 通用大规模预训练语言模型2. 对话模型3. 分句 1. 通用大规模预训练语言模型 英语&#xff1a; LegalBERT 原始论文&#xff1a;(2020 EMNLP) LEGAL-BERT: Th…

Django - 页面静态化基本使用(一)

一. 前言 一个网页会有很多数据是不需要经常变动的&#xff0c;比如说首页&#xff0c;变动频率低而访问量大&#xff0c;我们可以把它静态化&#xff0c;这样就不需要每次有请求都要查询数据库再返回&#xff0c;可以减少服务器压力 我们可以使用Django的模板渲染功能完成页面…

Linux | SFTP

SFTP 文章目录 SFTPSSH 文件传输协议连接获取SFTP帮助查看及切换路径遍历远程文件系统访问本地的文件系统 传输文件传输本地文件到远程服务器简单的文件操作图形界面程序Reference欢迎关注公众号【三戒纪元】 SSH 文件传输协议 FTP&#xff0c;即文件传输协议&#xff0c;是一…