Spring-Data-JPA入门--增删改查1
上一篇已经简单介绍了一下Spring-Data-JPA,也可以去查看官网
(1)jpa的dao只有接口没有实现类了。所以就不能用原先的扫描方式了。所以就不能用那4个注解了@Controller,@Service,@Component,@Repository。
(2)dao层只有接口没有实现类,那么如何创建对象。利用动态代理技术自动生成一个实现类,然后在创建对象。
首先创建一个项目
1、配置pom文件
pom文件的话就加一个关于Spring-Data-JPA的启动类,数据库的,德鲁伊的springweb的,其他的本次测试用不到
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency>
因为每个人用的数据库版本不一样 ,所以用自己的就行,就比之前的那些常用的多了一个data-jpa的启动类,这个加不加都行,为了好看我就加上了
2.配置yml文件
最下边的logging的那个是我的日志信息配置
3.接下来配置数据源
数据源大家肯定都配过,我就直接拿过来了
4.创建一个实体类
package com.lwy.pojo;import javax.persistence.*;
import java.util.Date;/*** @Author liwenyan* @Date 2021/7/28 14:12* @Version 1.0*/
@Entity
@Table(name = "tb_user")
public class TbUser {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;private String name;private String sex;private Date birthday;private Integer age;public TbUser() {}public TbUser(Integer id, String name) {this.id = id;this.name = name;}public Integer getId() {return id;}public TbUser(Integer id, String name, Integer age) {this.id = id;this.name = name;this.age = age;}public TbUser(Integer id, String name, String sex, Date birthday, Integer age) {this.id = id;this.name = name;this.sex = sex;this.birthday = birthday;this.age = age;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}
创建实体类的时候有几点注意事项:
(1)不需要创建数据表了,配置好配置文件会给我们自动创建
(2)在写 @Id 与 @GeneratedValue(strategy = GenerationType.IDENTITY)之前生成有参无参构造,因为我也不知道为啥,先写了这两个注解,再去生成有参的时候,就没有id这个字段了
(3)表名注意和数据库保持一致否则会有意外效果(如配置会自动创建新表)
(4)当表创建完成之后实体类的@Column注解中对应的表名就不要修改了,否则会重新创建新的字段
运行启动类,会在我们的数据库中自动生成一张空的数据表
Spring data jpa的常用注解
@Entity 声明一个实体类。
@Table 指定这个类对应数据库中的表名。如果这个类名的命名方式符合数据库的命名方式,可以省略这个注解。如FlowType类名对应表名flow_type。
@Id 指定这个字段为表的主键
@GeneratedValue(strategy=GenerationType.IDENTITY) 指定主键的生成方式,一般主键为自增的话,就采用GenerationType.IDENTITY的生成方式。
@Column() 声明实体类属性名对应的表字段名称。有很多参数,name表示对应数据表中的字段名。insertable 表示插入式是否更新。updateable,表示update的时候是否更新;columnDefinition表示字段类型,当使用jpa自动生成表的时候比较有用。
@MappedSuperclass 表示一个这是一个父类,不会被当成一个实体类。在这里定义一些表中的通用字段。然后其他实体类继承这个类就可以了,避免写重复代码。
JPA自带的几种主键生成策略
TABLE:JPA提供的一种机制,通过一张数据库表的形式帮助我们完成主键自增。
生成主键时,不在借助数据库,而是JPA程序来做,维护一张表,表中有主键的值。也就是说,当生成策略为TABLE时,会生成两张表,一张是用户表,一张为存放主键的表,存放的为下一个主键的值。
SEQUENCE:根据底层数据库的序列化来生成主键,条件是数据库支持序列(如oracle)。这个值要与generator一起使用,generator指定生成主键使用的生成器。
IDENTITY:主键由数据库自动生成(主要是支持自动增长的数据库,如mysql)
AUTO:主键由程序帮助选择,也是GenerationType的默认值。
TABLE和AUTO只要理解就可以了,mysql的话用IDENTITY,orcale用SEQUENCE。
5.创建dao层接口
接口:
在SpringData中目前为止最核心的是Repository接口,但是里面没有任何的方法:
Repository还有许多的子接口,在项目开发中最常用的是三种
CrudRepository:继承Repoitory接口 ,实现了CRUD的相关方法
PagingAndSortingRepository:继承CrudRepository接口,实现了分页排序的相关方法
JpaRepository:继承PagingAndSortingRepository,实现Jpa规范的相关方法
public interface UserDao extends JpaRepository<TbUser,Integer> {
}
6.增删改查测试
6.1 增加
调用自带的方法进行增加
注意事项:
(1)当id为null时为增加,id不为null时为修改
(2)如果前台传过来的是空,他还能增加进去,不过是空数据,可以在controller层判断一下,如果不为空就添加,为空就不添加
因为设置了主键自增,也可以不给传id
运行结果
6.2 修改
他没有修改方法,还是用save,
(1)当id为null时为增加,id不为null时为修改,
(2)如果数据库有这个id就是修改,没有这个id就是增加
(3)如果修改的时候给的数据不全,那么其他没给值的字段就是null
修改后的结果
6.3 批量增加
结果:
有的字段我没给
6.4 删除单条
根据id删除
6.5 批量删除
public void deleteUserMore() {List<TbUser> list = new ArrayList<>();list.add(new TbUser(3));list.add(new TbUser(4));userDao.deleteAll(list);}
查询结果:
6.6 查询
Optional的应用:
https://www.runoob.com/java/java8-optional-class.html
6.6.1 查询单条
controller:
//查询单条@RequestMapping("selectUserOne")public TbUser selectUserOne(){return userService.selectUserOne();}
service:
public TbUser selectUserOne() {//java8特性之一,一个容器判断是否为null//Optional的应用://https://www.runoob.com/java/java8-optional-class.htmlOptional<TbUser> byId = userDao.findById(2);TbUser user = byId.get();return user;}
运行查询:
6.6.2 查询所有
controller:
//查询所有@RequestMapping("selectUserAll")public List<TbUser> selectUserAll(){return userService.selectUserAll();}
service:
public List<TbUser> selectUserAll() {List<TbUser> all = userDao.findAll();return all;}
6.2.3 查询年龄为20的所有
修改了一下数据库
controller:
//查询所有年龄为20的@RequestMapping("selectUserAllByAge")public List<TbUser> selectUserAllByAge(){return userService.selectUserAllByAge();}
service:
public List<TbUser> selectUserAllByAge() {//创建实体类对象TbUser user = new TbUser();user.setAge(20);//创建example 把需要查询的条件放入Example<TbUser> example = Example.of(user);List<TbUser> all = userDao.findAll(example);return all;}
查询结果:
还有很多方法可以试试
第一种查询方式(方法名规则查询)
关键词 |
SQL符号 |
样例 |
对应JPQL 语句片段 |
And |
and |
findByLastnameAndFirstname |
where x.lastname = ?1 and x.firstname = ?2 |
Or |
or |
findByLastnameOrFirstname |
where x.lastname = ?1 or x.firstname = ?2 |
Is,Equals |
= |
findByFirstname,findByFirstnameIs,findByFirstnameEquals |
where x.firstname = ?1 |
Between |
between a and b |
findByStartDateBetween |
where x.startDate between ? 1 and ?2 |
LessThan |
< |
findByAgeLessThan |
where x.age < ?1 |
LessThanEqual |
<= |
findByAgeLessThanEqual |
where x.age <= ?1 |
GreaterThan |
> |
findByAgeGreaterThan |
where x.age > ?1 |
GreaterThanEqual |
>= |
findByAgeGreaterThanEqual |
where x.age >= ?1 |
After |
> |
findByStartDateAfter |
where x.startDate > ?1 |
Before |
< |
findByStartDateBefore |
where x.startDate < ?1 |
IsNull |
is null |
findByAgeIsNull |
where x.age is null |
IsNotNull,NotNull |
is not null |
findByAge(Is)NotNull |
where x.age not null |
Like |
like |
findByFirstnameLike |
where x.firstname like ?1 |
NotLike |
not like |
findByFirstnameNotLike |
where x.firstname not like ?1 |
StartingWith |
like 'xxx%' |
findByFirstnameStartingWith |
where name like ?(%xxx) |
EndingWith |
like 'xxx%' |
findByFirstnameEndingWith |
where name like ?( xxx%) |
Containing |
like '%xxx%' |
findByFirstnameContaining |
where name like ?(%xxx %) |
OrderBy |
order by |
findByAgeOrderByLastnameDesc |
where age = ?1 order by grade desc |
Not |
<> |
findByLastnameNot |
where x.lastname <> ?1 |
In |
in() |
findByAgeIn(Collection<Age> ages) |
where x.age in ?1 |
NotIn |
not in() |
findByAgeNotIn(Collection<Age> ages) |
where x.age not in ?1 |
TRUE |
=true |
findByActiveTrue() |
where x.active = true |
FALSE |
=false |
findByActiveFalse() |
where x.active = false |
IgnoreCase |
upper(xxx)=upper(yyyy) |
findByFirstnameIgnoreCase |
where UPPER(name) = UPPER(?1) |
我发现我整理的太多了,自定义接口查询等放到下一节吧
Spring-Data-JPA入门--增删改查1相关推荐
- Spring Boot (十五): Spring Boot + Jpa + Thymeleaf 增删改查示例
<p>这篇文章介绍如何使用 Jpa 和 Thymeleaf 做一个增删改查的示例.</p> 先和大家聊聊我为什么喜欢写这种脚手架的项目,在我学习一门新技术的时候,总是想快速的搭 ...
- (转)Spring Boot (十五): Spring Boot + Jpa + Thymeleaf 增删改查示例
http://www.ityouknow.com/springboot/2017/09/23/spring-boot-jpa-thymeleaf-curd.html 这篇文章介绍如何使用 Jpa 和 ...
- Spring Date JPA实现增删改查
1.新建一个Cart类 package com.entity;public class Cart {private int id;private int userId;private int medi ...
- Spring+SpringMVC+Mybatis实现增删改查--(五)SSM修改员工页面搭建
Spring+SpringMVC+Mybatis实现增删改查--(五)SSM修改员工页面搭建 修改员工: 1.在index.jsp页面点击"编辑"弹出编辑对话框 2.去数据库查询部 ...
- Spring JPA实现增删改查
1. 创建一个Spring工程 2.配置application文件 spring.datasource.driver-class-name= com.mysql.cj.jdbc.Driver spri ...
- JDBC+MySQL入门增删改查案例
目录 前言 案例分析 核心思路拆解 案例涉及知识点 第一关 创建数据库和项目 创建数据库 创建项目 第二关 JDBC插入和查询 预备工作 单个插入 批量插入 查询数据 JDBC修改和删除 修改数据 删 ...
- Spring Boot整合Mybatis-Plus 增删改查+ 分页基本使用完整示例
写在前面 MyBatis的增强方案确实有不少,甚至有种感觉是现在如果只用 "裸MyBatis",不来点增强插件都不好意思了.这不,在上一篇文章<Spring Boot项目利用 ...
- springboot集合MySQL删除_SpringBoot集成Spring JdbcTemplate并完成增删改查操作
JdbcTemplate是Spring用来简化JDBC操作的核心类,有助于与Spring集成,并且避免了过多冗长的JDBC代码.不过在实际使用中,我们通常使用NamedParameterJdbcTem ...
- solr系列三:solr和spring整合并实现增删改查功能
在这篇文章中将通过代码带大家一步步实现spring和solrj的整合,并实现solrj的增删改查功能. 1.solrj的spring配置如下: <beans xmlns="http:/ ...
最新文章
- Apache HttpClient库里的日志实现检测原理
- 高斯曲率求表面极值点
- 坦克大战系列6-API常用函数说明2
- 指针一维数组名的含义
- Google 的 “行星级” cron 系统
- Eplan 2.7 ”没有可用加密狗“问题
- BlueScreenView: 系统蓝屏分析工具
- Dbgview - 签名无效
- ssr的pac中加入学校图书馆数据库访问pac
- 台式计算机无线网卡,台式机无线网卡怎么选 台式机无线网卡选购指南
- 计算机excel实验结果分析,使用Excel2013分析管理表格数据实训演练——想象力电脑应用...
- Linux系统启动流程及服务管理控制
- YDOOK:Pytorch : AI : torch.tensor.size() 与 torch.tensor.shape 的区别
- java des 加密 单倍长_明明白白使用DES加密算法
- [字符串题-java]1189. “气球” 的最大数量
- 【git】Git版本控制
- 跑步听歌用哪种耳机更合适、适合跑步专业的耳机推荐
- STM32笔记 (十三)定时器输入捕获(利用定时器捕获高电平时间)
- mysql compact_在 MySQL InnoDB 中,COMPRESSED, COMPACT 和DYNAMIC 有什么区别?
- VTP、PVID、ACCESS、trunk