接着上期说,上期没写一条sql就把数据查询出来了,那如果要保存或者更新数据怎么办呢?能不能自己写sql呢?

保存数据

@GetMapping("save")//保存数据

public void save(@RequestBody User user){
userJpa.save(user);
}

在UserController里面添加上面的方法。使用@RequestBody接收数据,然后调用userJpa的save方法保存数据,接下来我们用postman试下。

执行之后到数据库去看下数据,数据已经加进来了。

ps:我们数据库表主键生成方式是自增,所以再在调用save方法的时候不需要手动指定主键。另外我可以看下控制台的输出:

Hibernate: insert into user (age, dpt_id, email, head_img, name) values (?, ?, ?, ?, ?)

可以看到后台其实是执行了sql的。

删除数据:

@GetMapping("delete")//按主键删除数据

public void delete(@RequestParam("id")Long id){
userJpa.deleteById(id);
}

postman执行:

localhost:8080/user/delete?id=6

小伙伴们再到数据库去看下,刚刚新增的那条数据被删除了,再看看控制台。

Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.dpt_id as dpt_id3_0_0_, user0_.email as email4_0_0_, user0_.head_img as head_img5_0_0_, user0_.name as name6_0_0_ from user user0_ where user0_.id=?
Hibernate: delete from user where id=?

为什么会有两条sql呢,其实jpa是先将数据查询出来判断是否存在,然后再执行的删除动作。如果数据不存在会怎么样呢?大家可以在执行一遍删除请求,后台是不是报错了?那如果在实际业务中需要删除那不是要判断,很麻烦。别急,我们可以自己写sql删除,怎么做呢?接着往下看。

按名称删除

UserController新增方法

@GetMapping("deleteByUserName")//按用户名删除数据
public void deleteByUserName(@RequestParam("name")String name){
this.userJpa.deleteByName(name);
}

UserJpa新增方法:

@Modifying//告诉jpa这个是update或delete方法,会对数据库中的数据产生变更

@Query(value = "delete from user where name=:name",nativeQuery = true)//jpa会将:name用参数@Param中的名字替换

public int deleteByName(@Param("name") String name);//参数变量

postman执行请求

localhost:8080/user/deleteByUserName?name=Jone

更新数据:

UserController新增方法

@GetMapping("update")//更新数据

public void update(@RequestParam("id")Long id,@RequestParam("name")String name){
User user = this.userJpa.findById(id).get();//先更加id将数据load出来
user.setName(name);//变更数据
this.userJpa.save(user);//保存数据
}

postman执行请求

localhost:8080/user/update?id=2&name=Jack123

自己偷偷的看下数据库,数据变了吗?

自定义查询

UserController中新增方法

@GetMapping("findByAge")//按年龄查找数据

public List<User> findByAge(@RequestParam("age")Integer age){
return this.userJpa.findByAge(age);
}

UserJpa中新增方法:

@Query(value = "select * from user where age>?1",nativeQuery = true)

public List<User> findByAge(Integer Age);

Postman执行请求:

localhost:8080/user/findByAge?age=20

查询出来的结果是不是符合预期?jpa就是这么强大。

下面我们来总结下jpa的常用用法:

    1. 首先需要定义一个接口,并继承自JpaRepository,并在该接口类上使用@Repository注解,告知springboot这是一个Repository类

    2. 在外部调用使用@Resource将该接口注入

    3. 可以使用该jpa接口类中很多自定义的方法,比如:其中加粗字体的是我们在UserJpa中自己定义的方法。

    4. 如果方法不够我们的业务使用,则可以在UserJpa中自己写方法,强大的jpa语法几乎不需要你自己写sql语句,当然如果你业务需要,也可以自己定义。

    5. 如果要自己写sql,则在UserJpa上自己定义方法,但是不需要自己实现。并使用@Query注解该方法,在@Query内使用value写sql或者hql,如果写的是sql,则需要使用nativeQuery=true

    6. 自己写的jpa方法,并使用了@Query注解,但是里面执行的是update或者delete的sql语句的话要使用@Modifying注解。
      怎么样,很简单吧。jpa就是这么强大,更多jpa语法和内容等待你去发掘,下期我们讲下事务Transaction。

    7. 更多原创阅读:https://javawu.com

如何优雅的实现Mysql 增删改查,看完你就会了的更多相关文章

  1. MySQL—增删改查,分组,连表,limit,union,alter,排序,去重

    MySQL增删改查 在表格的增删改查中,查的内容是最多的,包括group by ,join,limit,union,alter,排序都是服务于查的 #sql语句数据行操作补充 #增加: #insert ...

  2. PHP MySql增删改查

    mysql_connect()连接数据库 mysql_select_db选择数据库 mysql_fetch_assoc()获取结果集 mysql_query()执行sql语句 实例如下: <?p ...

  3. mysql增删改查练习

    Mysql增删改查sql语句练习 关于数据库的一些操作: 进入mysql 命令行: mysql -uroot –p 查看所有数据库: show databases; 创建数据库: create dat ...

  4. Django学习之mysql增删改查

    上节介绍了如何使用命令行操作mysql增删改查,现在介绍如何使用python管理mysql 使用pip 下载完mysql后,mysql会以pymysql模块的形式存储在pycharm的包文件里.我们通 ...

  5. mysql增删改查相关操作

    mysql增删改查相关操作 以前用mysql用的少,对于数据库相关的操作不熟悉,现在开始要接触数据库了,记录一下相关的基础操作吧. 1.数据库的授权操作 # mysql -u root -p Ente ...

  6. 基于gin的golang web开发:mysql增删改查

    Go语言访问mysql数据库需要用到标准库database/sql和mysql的驱动.标准库的Api使用比较繁琐这里再引入另一个库github.com/jmoiron/sqlx. go get git ...

  7. MySQL增删改查的常用语句汇总

    MySQL增删改查的常用语句汇总 以下是总结的mysql的常用语句,欢迎指正和补充~ 一.创建库,删除库,使用库 1.创建数据库:create database 库名; 2.删除数据库:drop da ...

  8. nodejs+express+mysql 增删改查

    之前,一直使用的是nodejs+thinkjs来完成自己所需的项目需求,而对于nodejs中另外一中应用框架express却了解的少之又少,这两天就简单的了解了一下如何使用express来做一些数据库 ...

  9. Node+Express+node-mysql 实战于演习 全套mysql(增删改查)

    最近这段时间研究Node感觉不错,自己做了一个增删改查,虽然有些简陋,但是思想是想通的,其实所有项目都是增删改查,有助于初学者快速掌握Node 首先 本实例展示的是基于Node+Express+nod ...

随机推荐

  1. 上手 WebRTC DTLS 遇到很多 BUG?浅谈 DTLS Fragment

    上一篇<详解 WebRTC 传输安全机制:一文读懂 DTLS 协议>详细阐述了 DTLS.本文将结合 DTLS 开发中遇到的问题,详细解读 DTLS 的一些基础概念以及 Fragment ...

  2. 大华摄像头报警接口中图片加密,python调用c++方式实现解密

    项目中,大华摄像头的报警信息,里面有图片地址,需要1天内取下来,保持留痕 可惜,图片下载后,加密了,大华提供了android,ios,c++例子,没有提供java解密例子 没办法,只好先用c++例子简 ...

  3. [敏杰开发]知识路书——图形化文献管理大师 Beta版发布喽!!!

    [敏杰开发]知识路书--图形化文献管理大师 Beta版发布喽!!! 一.总览 项目名称:知识路书 发布形式:网页应用 发布地址:http://roadmap.imcoming.top 二.运行环境与使 ...

  4. ACM基础板子

    新生赛以后就正式成为一名acmer啦 ~虽然没有打过比赛呜呜呜 要好好学算法,拿一个牌牌嘛~ 这里就记录算法学习情况,也怕自己偷懒,学一个就记录,看看长时间拖更就是在摸鱼,摸鱼和鸽子都是本质 ,加油! ...

  5. select 语句的基础语法

    授权语法sql 一.用户的创建与使用 在管理员登录后可创建用户 --创建qfplan用户-create user qfplan identified by qfplan; --用户基本权限授权gran ...

  6. 在Linux中通过Top运行进程查找最高内存和CPU使用率

    按内存使用情况查找前15个进程,在批处理模式下为"top" 使用top命令查看有关当前状态,系统使用情况的更详细信息:正常运行时间,负载平均值和进程总数. 分类:Linux命令操作 ...

  7. CentOS7中下载RPM及其所有的依赖包

    CentOS7中下载RPM及其所有的依赖包 转载beeworkshop 最后发布于2019-09-28 07:43:40 阅读数 1096  收藏 展开 利用 Downloadonly 插件下载 RP ...

  8. VIM 三种模式和常用命令

    引言 大数据开发工作中,周围的同事不是用 VIM 就是 Emacs,你要是用 UltraEdit 或 notepad++ 都不好意思跟人家打招呼...什么插件呀.语法高亮呀.拼写检查呀,能给它开的都给 ...

  9. linux 系统监控命令之 top-(转自 Howie的专栏)

    top命令经常用来监控linux的系统状况,比如cpu.内存的使用,程序员基本都知道这个命令,但比较奇怪的是能用好它的人却很少,例如top监控视图中内存数值的含义就有不少的曲解. 本文通过一个运行中的 ...

  10. 【三】Kubernetes学习笔记-Pod 生命周期与 Init C 介绍

    一.容器生命周期 Init C(初始化容器)只是用于 Pod 初始化的,不会一直随着 Pod 生命周期存在,Init C 在初始化完成之后就会死亡. 一个 Pod 可以有多个 Init C,也可以不需 ...