返回顶部
首页 > 资讯 > 精选 >Spring JPA使用案例分析
  • 548
分享到

Spring JPA使用案例分析

2023-06-27 11:06:14 548人浏览 独家记忆
摘要

今天小编给大家分享一下spring JPA使用案例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.什么是JPAJPA

今天小编给大家分享一下spring JPA使用案例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

1.什么是JPA

JPA (Java Persistence api) 是 Sun 官方提出的 Java 持久化规范。它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术,结束现在 HibernateTopLinkJDO 等 ORM 框架各自为营的凌乱局面。JPA 在充分吸收了现有HibernateTopLinkJDOORM框架的基础上发展而来的,具有易于使用,伸缩性强等优点。从上面的解释中我们可以了解到JPA 是一套规范,而类似 HibernateTopLinkJDO这些产品是实现了 JPA 规范。

了解了什么是 JPA,我们来看看本文的主角——spring data jpa

2.spring data jpa

pring Data JPASpring 基于 ORM 框架、JPA规范的基础上封装的一套 JPA 应用框架,底层使用了 HibernateJPA 技术实现,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用 Spring Data JPA 可以极大提高开发效率。

什么意思呢?如果用过Hibernate 或者mybatis 的话,就会知道对象关系映射(ORM)框架有多么方便。但是Spring Data JPA框架功能更进一步,为我们做了 一个数据持久层框架几乎能做的任何事情。以SpringBoot整合MyBatis为例,比如我们要向数据库中插入一些用户的数据,那么我们需要先定义用户的实体类,然后我们要定义一个UserDao

@Repositorypublic class UserDao {    @Autowired    JdbcTemplate jdbcTemplate;    public int addUser(User user){    return jdbcTemplate.update("INSERT INTO t_user(username,jobs,phone) VALUE (?,?,?)",    user.getName,user.getJobs,user.getPhone);    }    public int updateUser(User user){    return jdbcTemplate.update("UPDATE t_user SET username=?,jobs=?,phone=? WHERE id=?",    user.getName,user.getJobs,user.getPhone,user.getId);    }    public int deleteUser(Integer id){    return jdbcTemplate.update("DELETE FROM t_user WHERE id=?",id);    }    public User getUserById(Integer id){    return jdbcTemplate.queryForObject("SELECT * FROM t_user WHERE id =?",new BeanPropertyRowMapper<>(User.class),id);    }    public List<User> getAllUser{    return jdbcTemplate.query("SELECT * FROM t_user",new BeanPropertyRowMapper<>(User.class));    }}

以及UserService

@Servicepublic class UserService {    @Autowired    UserDao userDao;    public int addUser(User user){    return userDao.addUser(user);    }    public int updateUser(User user){    return userDao.updateUser(user);    }    public int deleteUser(Integer id){    return userDao.deleteUser(id);    }    public User getUserById(Integer id){    return userDao.getUserById(id);    }    public List<User> getAllUser{    return userDao.getAllUser;    }}

最后,我们在去调用对应的service 中的方法。这是传统的方式,如果使用mapper,会稍微简单一些,比如我们要添加mapper

@Mapperpublic interface UserMapper {    int addUser(User user);    int deleteUser(int id);    int updateUser(User user);    User getUserById(Integer id);    List<User> getAllUsers;}

然后定义一个UserMapper.xml ,添加对应的CURD sql语句,做好映射,然后改造service,例如

@Servicepublic class UserService {    @Autowired    UserMapper userMapper;    public int addUser(User user){    return userMapper.addUser(user);    }    public int updateUser(User user){    return userMapper.updateUser(user);    }    public int deleteUser(Integer id){    return userMapper.deleteUser(id);    }    public User getUserById(Integer id){    return userMapper.getUserById(id);    }    public List<User> getAllUser{    return userMapper.getAllUsers;    }}

发现什么问题了吗?如果我们要去实现多个表的操作,我们需要定义不同的实体类,然后实现对应的mapper,然后写同样的增删改查方法,最后调用。这也太麻烦了些,而Spring data jpa 则可以轻松的帮我们实现这些繁琐重复且没有技术含量的操作。我们一起看下吧!

3.案例演示

首先,我们需要配置pom.xml

<dependency>        <groupId>mysql</groupId>        <artifactId>Mysql-connector-java</artifactId>    </dependency>     <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-data-jpa</artifactId>    </dependency>

然后是application.properties 的配置

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=truespring.datasource.username=rootspring.datasource.passWord=123456spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.jpa.properties.hibernate.hbm2ddl.auto=createspring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialectspring.jpa.show-sql=true

这里重点简单介绍下spring.jpa.properties.hibernate.hbm2ddl.auto有几种配置:

  • create:表示每次加载Hibernate时都会删除上一次生成的表(包括数据),然后重新生成新表,即使两次没有任何修改也会这样执行。适用于每次执行单测前清空数据库的场景。

  • create-drop:表示每次加载Hibernate时都会生成表,但当SessionFactory关闭时,所生成的表将自动删除。

  • update:最常用的属性值,第一次加载Hibernate时创建数据表(前提是需要先有数据库),以后加载Hibernate时不会删除上一次生成的表,会根据实体更新,只新增字段,不会删除字段(即使实体中已经删除)。

  • validate:每次加载Hibernate时都会验证数据表结构,只会和已经存在的数据表进行比较,根据model修改表结构,但不会创建新表。

  • 不配置此项,表示禁用自动建表功能

spring.jpa.show-sql=true 该配置当在执行数据库操作的时候会在控制台打印 sql 语句,方便我们检查排错等。

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect 这是数据库的方言配置。

接下来我们建立用户实体类

@Entitypublic class User {     @Id    @GeneratedValue    private long id;    @Column(nullable = false, unique = true)    private String userName;    @Column(nullable = false)    private String password;    @Column(nullable = false)    private int age;}

这里的一些注解解释如下:

  • @Entity 是一个类注解,用来注解该类是一个实体类用来进行和数据库中的表建立关联关系,首次启动项目的时候,默认会在数据中生成一个同实体类相同名字的表(table),也可以通过注解中的 name 属性来修改表(table)名称, 如@Entity(name=“user”) , 这样数据库中表的名称则是 user。该注解十分重要,如果没有该注解首次启动项目的时候你会发现数据库没有生成对应的表。

  • @Table 注解也是一个类注解,该注解可以用来修改表的名字,该注解完全可以忽略掉不用,@Entity 注解已具备该注解的功能。

  • @Id 类的属性注解,该注解表明该属性字段是一个主键,该属性必须具备,不可缺少。

  • @GeneratedValue 该注解通常和 @Id 主键注解一起使用,用来定义主键的呈现形式,该注解通常有多种使用策略,先总结如下:

  • @GeneratedValue(strategy= GenerationType.IDENTITY) 该注解由数据库自动生成,主键自增型,在 mysql 数据库中使用最频繁,oracle 不支持。

  • @GeneratedValue(strategy= GenerationType.AUTO)  主键由程序控制,默认的主键生成策略,oracle 默认是序列化的方式,mysql 默认是主键自增的方式。

  • @GeneratedValue(strategy= GenerationType.SEQUENCE) 根据底层数据库的序列来生成主键,条件是数据库支持序列,Oracle支持,Mysql不支持。

  • @GeneratedValue(strategy= GenerationType.TABLE) 使用一个特定的数据库表格来保存主键,较少使用。

上面这些主键生成策略中,以 mysql 为例,  IDENTITY  AUTO 用的较多,二者当中IDENTIT 用的多些,以下文章当中演示的 demo 主键均使用 @GeneratedValue(strategy= GenerationType.IDENTITY) 的生成策略。

@Column 是一个类的属性注解,该注解可以定义一个字段映射到数据库属性的具体特征,比如字段长度,映射到数据库时属性的具体名字等。

@Transient  是一个属性注解,该注解标注的字段不会被映射到数据库当中。

 声明 UserRepository接口,继承JpaRepository,如下所示

public interface UserRepository extends JpaRepository<User, Long> { }

这里的 JpaRepository继承了接口PagingAndSortingRepositoryQueryByExampleExecutor。而,PagingAndSortingRepository又继承CrudRepository

因此,JpaRepository接口同时拥有了基本CRUD功能以及分页功能。因此,这里我们可以继承JpaRepository,从而获得Spring为我们预先定义的多种基本数据操作方法。

然后我们定义一个测试类,  这里我们演示下添加操作, @Transactional 表示开启事务防止出现脏数据。

        ……        @Autowired    private UserRepository userRepository;     @Test    @Transactional    public void userAddTest() {        User user = new User();        user.setUserName("吴彦祖");        user.setAge(30);        user.setPassword("123456");        userRepository.save(user);        User item = userRepository.findByUserName("wyk");        log.info(JSONUtils.tojson(item));    }

接下来我们说下查询,查询可以分为基本查询和自定义查询,一种是 spring data 默认已经实现,只需要要继承JpaRepository,一种是根据查询的方法来自动解析成 SQL

@Testpublic void testQuery() throws Exception {    User user=new User();    userRepository.findAll();    userRepository.findOne(1l);    userRepository.save(user);    userRepository.delete(user);    userRepository.count();    userRepository.exists(1l);    ……}

自定义的简单查询就是根据方法名来自动生成SQL,主要的语法是findXXBy,readAXXBy,queryXXBy,countXXBy, getXXBy后面跟属性名称,举几个例子:

User findByUserName(String userName); User findByUserNameOrEmail(String username, String email); Long deleteById(Long id); Long countByUserName(String userName); List<User> findByEmailLike(String email); User findByUserNameIgnoreCase(String userName); List<User> findByUserNameOrderByEmailDesc(String email);

接下来,我们说下复杂的查询,在实际的开发中我们需要用到分页、删选、连表等查询的时候就需要特殊的方法或者自定义 SQL,以分页查询为例,分页查询在实际使用中非常普遍了,spring data jpa已经帮我们实现了分页的功能,在查询的方法中,需要传入参数Pageable,当查询中有多个参数的时候Pageable建议做为最后一个参数传入。Pageablespring 封装的分页实现类,使用的时候需要传入页数、每页条数和排序规则

Page<User> findALL(Pageable pageable); Page<User> findByUserName(String userName,Pageable pageable);

我们看下下面的测试用例

@Testpublic void testPageQuery() throws Exception {    int page=1,size=5;    Sort sort = new Sort(Direction.DESC, "id");    Pageable pageable = new PageRequest(page, size, sort);    userRepository.findALL(pageable);    userRepository.findByUserName("testName", pageable);}
  1. Spring data 大部分的SQL都可以根据方法名定义的方式来实现,但是由于某些原因我们想使用自定义的 SQL 来查询,spring data 也是完美支持的,如下所示:

@Modifying@Query("update User u set u.userName = ?1 where c.id = ?2")int modifyByIdAndUserId(String  userName, Long id); @Transactional@Modifying@Query("delete from User where id = ?1")void deleteByUserId(Long id); @Transactional(timeout = 10)@Query("select u from User u where u.emailAddress = ?1")User findByEmailAddress(String emailAddress);

以上就是“Spring JPA使用案例分析”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: Spring JPA使用案例分析

本文链接: https://lsjlt.com/news/309942.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Spring JPA使用案例分析
    今天小编给大家分享一下Spring JPA使用案例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.什么是JPAJPA ...
    99+
    2023-06-27
  • Spring Data Jpa复杂查询的示例分析
    小编给大家分享一下Spring Data Jpa复杂查询的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spring Data Jpa...
    99+
    2023-06-29
  • Scrapy使用案例分析
    这篇“Scrapy使用案例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Scrapy使用案例分析”文章吧。scrapy是...
    99+
    2023-06-28
  • Spring JPA find分页示例详解
    目录前言源码一、单纯分页查询查询结果结论二、排序分页查询查询结果三、方法整理总结:前言 在现实项目中,数据量一般都不小,如果一次性全部请求出来,肯定是影响性能,而且大量数据展示到页面...
    99+
    2023-05-18
    Spring JPA find分页 Spring JPA
  • 使用SQL的案例分析
    小编给大家分享一下使用SQL的案例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 需求 所有部门汇总的结果的打分。大部分...
    99+
    2024-04-02
  • 使用Vuex的案例分析
    这篇文章给大家分享的是有关使用Vuex的案例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是Vuex?vuex是专门为vue.js应用程序开发的一种状态管理模式,当多个视...
    99+
    2024-04-02
  • Spring Boot Starters使用实例分析
    本篇内容主要讲解“Spring Boot Starters使用实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Boot Starters使用...
    99+
    2024-04-02
  • Java之jpa的示例分析
    这篇文章给大家分享的是有关Java之jpa的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。JPA快速入门介绍一:什么是JPAJPA的英文全称是Java PersistenceAPI, 目的是给Java开发...
    99+
    2023-06-20
  • Android CheckBox 的使用案例分析
    代码如下:public class MainActivity extends Activity { TextView tv; CheckBox cb1;&...
    99+
    2022-06-06
    checkbox 案例分析 Android
  • Spring MVC注解式开发案例分析
    这篇文章主要讲解了“Spring MVC注解式开发案例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring MVC注解式开发案例分析”吧!项目案例用 Reque...
    99+
    2023-07-05
  • Spring Data JPA注解Entity使用示例详解
    目录1、JPA协议中关于Entity的相关规定需要注意的是:2、常用注解2.1 JPA支持的注解2.2 常用注解3、联合主键3.1 @IdClass3.2 @Embeddable与@...
    99+
    2024-04-02
  • 在Spring Boot中使用Spring-data-jpa实现分页查询
    在我们平时的工作中,查询列表在我们的系统中基本随处可见,那么我们如何使用jpa进行多条件查询以及查询列表分页呢?下面我将介绍两种多条件查询方式。1、引入起步依赖   <dependency> <gro...
    99+
    2023-05-31
    spring boot data
  • Spring Boot 发送邮件功能案例分析
    邮件服务简介邮件服务在互联网早期就已经出现,如今已成为人们互联网生活中必不可少的一项服务。那么邮件服务是怎么工作的呢?如下给出邮件发送与接收的典型过程:发件人使用SMTP协议传输邮件到邮件服务器A;邮件服务器A根据邮件中指定的接收者,投送邮...
    99+
    2023-05-30
    spring boot 发送邮件
  • Spring Data JPA怎么使用QueryDsl查询并分页
    小编给大家分享一下Spring Data JPA怎么使用QueryDsl查询并分页,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Spring Data JPA 使用QueryDsl查询并分页 QProblemPo...
    99+
    2023-06-25
  • Spring Data JPA 如何使用QueryDsl查询并分页
    目录SpringDataJPA使用QueryDsl查询并分页使用QueryDSLSpring Data JPA 使用QueryDsl查询并分页 QProblemPoint qP...
    99+
    2024-04-02
  • spring data jpa开启批量插入、批量更新的示例分析
    这篇文章给大家分享的是有关spring data jpa开启批量插入、批量更新的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。ORM框架,最早我用的是jdbcTemplate,后来用了Mybatis,唯独...
    99+
    2023-06-20
  • Redis使用lua脚本的案例分析
    这篇文章主要介绍了Redis使用lua脚本的案例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。版本:自2.6.0起可用。时间复杂度:取决...
    99+
    2024-04-02
  • module.exports和exports使用误区案例分析
    module.exports和exports使用误区 使用require()模块时,得到的永远都是module.exports指向的对象 1.误区一 exports.username...
    99+
    2023-05-14
    ES6 module.exports exports require node.js
  • SpringCloud-Spring Boot Starter使用测试实例分析
    这篇文章主要介绍了SpringCloud-Spring Boot Starter使用测试实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringCloud-Spring ...
    99+
    2023-07-02
  • 深入浅析JPA在Spring Boot中的使用方法
    深入浅析JPA在Spring Boot中的使用方法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。什么是JPA一说JavaWeb,很多小伙伴都知道SSH,这个H代表的就是hi...
    99+
    2023-05-31
    springboot jpa
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作