如何优雅的实现Mysql 增删改查,看完你就会了
接着上期说,上期没写一条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的常用用法:
首先需要定义一个接口,并继承自JpaRepository,并在该接口类上使用@Repository注解,告知springboot这是一个Repository类
在外部调用使用@Resource将该接口注入
可以使用该jpa接口类中很多自定义的方法,比如:其中加粗字体的是我们在UserJpa中自己定义的方法。

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

如果要自己写sql,则在UserJpa上自己定义方法,但是不需要自己实现。并使用@Query注解该方法,在@Query内使用value写sql或者hql,如果写的是sql,则需要使用nativeQuery=true
自己写的jpa方法,并使用了@Query注解,但是里面执行的是update或者delete的sql语句的话要使用@Modifying注解。
怎么样,很简单吧。jpa就是这么强大,更多jpa语法和内容等待你去发掘,下期我们讲下事务Transaction。- 更多原创阅读:https://javawu.com
如何优雅的实现Mysql 增删改查,看完你就会了的更多相关文章
- MySQL—增删改查,分组,连表,limit,union,alter,排序,去重
MySQL增删改查 在表格的增删改查中,查的内容是最多的,包括group by ,join,limit,union,alter,排序都是服务于查的 #sql语句数据行操作补充 #增加: #insert ...
- PHP MySql增删改查
mysql_connect()连接数据库 mysql_select_db选择数据库 mysql_fetch_assoc()获取结果集 mysql_query()执行sql语句 实例如下: <?p ...
- mysql增删改查练习
Mysql增删改查sql语句练习 关于数据库的一些操作: 进入mysql 命令行: mysql -uroot –p 查看所有数据库: show databases; 创建数据库: create dat ...
- Django学习之mysql增删改查
上节介绍了如何使用命令行操作mysql增删改查,现在介绍如何使用python管理mysql 使用pip 下载完mysql后,mysql会以pymysql模块的形式存储在pycharm的包文件里.我们通 ...
- mysql增删改查相关操作
mysql增删改查相关操作 以前用mysql用的少,对于数据库相关的操作不熟悉,现在开始要接触数据库了,记录一下相关的基础操作吧. 1.数据库的授权操作 # mysql -u root -p Ente ...
- 基于gin的golang web开发:mysql增删改查
Go语言访问mysql数据库需要用到标准库database/sql和mysql的驱动.标准库的Api使用比较繁琐这里再引入另一个库github.com/jmoiron/sqlx. go get git ...
- MySQL增删改查的常用语句汇总
MySQL增删改查的常用语句汇总 以下是总结的mysql的常用语句,欢迎指正和补充~ 一.创建库,删除库,使用库 1.创建数据库:create database 库名; 2.删除数据库:drop da ...
- nodejs+express+mysql 增删改查
之前,一直使用的是nodejs+thinkjs来完成自己所需的项目需求,而对于nodejs中另外一中应用框架express却了解的少之又少,这两天就简单的了解了一下如何使用express来做一些数据库 ...
- Node+Express+node-mysql 实战于演习 全套mysql(增删改查)
最近这段时间研究Node感觉不错,自己做了一个增删改查,虽然有些简陋,但是思想是想通的,其实所有项目都是增删改查,有助于初学者快速掌握Node 首先 本实例展示的是基于Node+Express+nod ...
随机推荐
- C++ primer plus读书笔记——第16章 string类和标准模板库
第16章 string类和标准模板库 1. string容易被忽略的构造函数: string(size_type n, char c)长度为n,每个字母都为c string(const string ...
- SE_Work1_阅读构建之法&项目管理实践
项目 内容 课程:北航-2020-春-软件工程 博客园班级博客 要求:阅读<构建之法>并回答问题 个人博客作业 我在这个课程的目标是 提升团队管理及合作能力,开发一项满意的工程项目 这个作 ...
- [DB] Spark Core (2)
RDD WordCount处理流程 sc.textFile("/root/temp/data.txt").flatMap(_.split(" ")).map(( ...
- 实战-加密grub防止黑客通过单用户系统破解root密码
基于Centos8进行grub加密 加密grub 实战场景:给grub加密,不让别人通过grub进入单用户. 使用grub2-mkpasswd-pbkdf2创建密文 [root@localhost ~ ...
- Linux_WEB访问控制示例(使用IPADDR类型)
前言: WEB服务使用访问控制,可以控制IP.主机名.以及某个网段的IP去访问我们的WEB服务,从而加减少流量的访问 一.使用IP控制访问 1.在/var/www/html下创建一个可访问的测试页面 ...
- Java设计模式(2:单一职责原则和依赖倒置原则详解)
一.单一职责原则 不要存在多于一个导致类变更的原因.简单来说,就是一个Class/Interface/Method只负责一项职责. 这句话最为重要的就是这一段:一个Class/Interface/Me ...
- 策略模式干掉if-else,switch
1.传统if -else 写法 String nodeModelStr = ""; if (nodeType == NodeType.START){ StartModel star ...
- npm ERR! Error: tunneling socket could not be established的解决问题
一般是代理问题 可以通过在命令行运行下列命令解决: npm run server npm run webdriver-update
- 华为MDC软件架构
华为MDC软件架构 平台软件零层逻辑架构如下图,由基础层.功能层.应用层和服务层组成. 零层逻辑架构 从平台软件一层逻辑架构可以看出,MDC用了华为自研的越影操作系统.兼容Autosar标准的软件中间 ...
- TVM自动调度器
TVM自动调度器 随着模型大小,算子多样性和硬件异构性的不断增长,优化深度神经网络的执行速度非常困难.从计算的角度来看,深度神经网络只是张量计算的一层又一层.这些张量计算(例如matmul和conv2 ...