上一篇已经简单介绍了一下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相关推荐

  1. Spring Boot (十五): Spring Boot + Jpa + Thymeleaf 增删改查示例

    <p>这篇文章介绍如何使用 Jpa 和 Thymeleaf 做一个增删改查的示例.</p> 先和大家聊聊我为什么喜欢写这种脚手架的项目,在我学习一门新技术的时候,总是想快速的搭 ...

  2. (转)Spring Boot (十五): Spring Boot + Jpa + Thymeleaf 增删改查示例

    http://www.ityouknow.com/springboot/2017/09/23/spring-boot-jpa-thymeleaf-curd.html 这篇文章介绍如何使用 Jpa 和 ...

  3. Spring Date JPA实现增删改查

    1.新建一个Cart类 package com.entity;public class Cart {private int id;private int userId;private int medi ...

  4. Spring+SpringMVC+Mybatis实现增删改查--(五)SSM修改员工页面搭建

    Spring+SpringMVC+Mybatis实现增删改查--(五)SSM修改员工页面搭建 修改员工: 1.在index.jsp页面点击"编辑"弹出编辑对话框 2.去数据库查询部 ...

  5. Spring JPA实现增删改查

    1. 创建一个Spring工程 2.配置application文件 spring.datasource.driver-class-name= com.mysql.cj.jdbc.Driver spri ...

  6. JDBC+MySQL入门增删改查案例

    目录 前言 案例分析 核心思路拆解 案例涉及知识点 第一关 创建数据库和项目 创建数据库 创建项目 第二关 JDBC插入和查询 预备工作 单个插入 批量插入 查询数据 JDBC修改和删除 修改数据 删 ...

  7. Spring Boot整合Mybatis-Plus 增删改查+ 分页基本使用完整示例

    写在前面 MyBatis的增强方案确实有不少,甚至有种感觉是现在如果只用 "裸MyBatis",不来点增强插件都不好意思了.这不,在上一篇文章<Spring Boot项目利用 ...

  8. springboot集合MySQL删除_SpringBoot集成Spring JdbcTemplate并完成增删改查操作

    JdbcTemplate是Spring用来简化JDBC操作的核心类,有助于与Spring集成,并且避免了过多冗长的JDBC代码.不过在实际使用中,我们通常使用NamedParameterJdbcTem ...

  9. solr系列三:solr和spring整合并实现增删改查功能

    在这篇文章中将通过代码带大家一步步实现spring和solrj的整合,并实现solrj的增删改查功能. 1.solrj的spring配置如下: <beans xmlns="http:/ ...

最新文章

  1. Apache HttpClient库里的日志实现检测原理
  2. 高斯曲率求表面极值点
  3. 坦克大战系列6-API常用函数说明2
  4. 指针一维数组名的含义
  5. Google 的 “行星级” cron 系统
  6. Eplan 2.7 ”没有可用加密狗“问题
  7. BlueScreenView: 系统蓝屏分析工具
  8. Dbgview - 签名无效
  9. ssr的pac中加入学校图书馆数据库访问pac
  10. 台式计算机无线网卡,台式机无线网卡怎么选 台式机无线网卡选购指南
  11. 计算机excel实验结果分析,使用Excel2013分析管理表格数据实训演练——想象力电脑应用...
  12. Linux系统启动流程及服务管理控制
  13. YDOOK:Pytorch : AI : torch.tensor.size() 与 torch.tensor.shape 的区别
  14. java des 加密 单倍长_明明白白使用DES加密算法
  15. [字符串题-java]1189. “气球” 的最大数量
  16. 【git】Git版本控制
  17. 跑步听歌用哪种耳机更合适、适合跑步专业的耳机推荐
  18. STM32笔记 (十三)定时器输入捕获(利用定时器捕获高电平时间)
  19. mysql compact_在 MySQL InnoDB 中,COMPRESSED, COMPACT 和DYNAMIC 有什么区别?
  20. VTP、PVID、ACCESS、trunk

热门文章

  1. 原反补移码的概念应用以及异或的作用
  2. 复习:稀疏链表的十字链表
  3. python统计汉字字数_Python 统计字数的思路详解
  4. 云和恩墨:2020是国产数据库崛起的发轫之年
  5. 实战课堂:数据库高Library Cache Lock导致Hang的故障分析
  6. 论文解读:ACL2021 NER | 基于模板的BART命名实体识别
  7. DCI架构是如何解决DDD战术建模缺点的?
  8. 案例分享丨红外自动感应门设计与实现详解
  9. 【ModelArts-Lab AI实战营】使用Postman测试Modelarts在线服务(图像分类、物体检测)
  10. 细数MQ那些不得不说的8大好处