springBoot+SpringData 整合入门

SpringData概述

SpringData :Spring的一个子项目。用于简化数据库访问,支持NoSQL和关系数据存储。其主要目标是使用数据库的访问变得方便快捷。

SpringData 项目所支持NoSQL存储:

  • MongoDB(文档数据库)
  • Neo4j(图形数据库)
  • Redis(键/值存储)
  • Hbase(列族数据库)

SpringData 项目所支持的关系数据存储技术:

  • JDBC
  • JPA

Spring Data : 致力于减少数据访问层 (DAO) 的开发量. 开发者唯一要做的,就只是声明持久层的接口,其他都交给 Spring Data JPA 来帮你完成!

框架怎么可能代替开发者实现业务逻辑呢?比如:当有一个 UserDao.findUserById() 这样一个方法声明,大致应该能判断出这是根据给定条件的 ID 查询出满足条件的 User 对象。Spring Data JPA 做的便是规范方法的名字,根据符合规范的名字来确定方法需要实现什么样的逻辑。

SpringBoot+SpringData 整合入门

第一步 添加依赖

springBoot相关

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

mysql驱动

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

springDataJPA相关

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

第二步 配置文件 (src/main/resources/application.yml)

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/springboot-springdata
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
  jpa:
    #指定数据库
    database: mysql
    #打印sql
    show-sql: true
    hibernate:
      #开启数据库更新表
      ddl-auto: update
      #指定命名策略
      naming:
        strategy: org.hibernate.cfg.ImprovedNamingStrategy
    properties:
      hibernate:
        #Hibernate方言
        dialect: org.hibernate.dialect.MySQL5Dialect

第三步 创建Repository接口、Entity

Repository接口

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

Entity(启动项目会自动创建表)

@DynamicInsert(true)
@DynamicUpdate(true)
@Table(name = "sys_user")
public class User implements Serializable{

    private static final long serialVersionUID = 6425411731900579688L;

    @Id
    @GeneratedValue
    @Column(columnDefinition = "bigint(20) comment '主键'", nullable = false)
    private long id;

    @Column(columnDefinition = "varchar(255) comment '用户姓名'",nullable = false, unique = true)
    private String username;

    @Column(columnDefinition = "varchar(255) comment '密码'", nullable = false)
    private String password;

    @Column(columnDefinition = "int(10) comment '年龄'", nullable = false)
    private int age;

}

这样就整合完成,可以创建接口进行单元测试了

Repository接口概述

Repository 接口是 Spring Data 的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法

public interface Repository<T, ID extends Serializable> { } 

Spring Data可以让我们只定义接口,只要遵循 Spring Data的规范,就无需写实现类。

与继承 Repository 等价的一种方式,就是在持久层接口上使用 @RepositoryDefinition 注解,并为其指定 domainClassidClass属性。如下两种方式是完全等价的

/**
 * 主键方式定义接口
 */
@RepositoryDefinition(domainClass=Person.class,idClass=Integer.class)
public interface PersonRepsotory{}

/**
 * 继承方式定义接口
 * 常用
 */
public interface PersonRepsotory extends JpaRepository<Person, Integer>{}

Repository的子接口

如图,基础的 Repository 提供了最基本的数据访问功能,其几个子接口则扩展了一些功能。它们的继承关系如下:
Repository: 仅仅是一个标识,表明任何继承它的均为仓库接口类
CrudRepository: 继承 Repository,实现了一组 CRUD 相关的方法
PagingAndSortingRepository: 继承 CrudRepository,实现了一组分页排序相关的方法
JpaRepository: 继承 PagingAndSortingRepository,实现一组 JPA 规范相关的方法
自定义的 XxxxRepository: 需要继承 JpaRepository,这样的 XxxxRepository接口就具备了通用的数据访问控制层的能力。
JpaSpecificationExecutor: 不属于Repository体系,实现一组 JPA Criteria 查询相关的方法

SpringData 查询方法命名规范

简单条件查询: 查询某一个实体类或者集合
按照 Spring Data 的规范,查询方法以 find | read | get开头, 涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性以首字母大写。
例如:定义一个 Entity 实体类

class User{
    private String firstName;
    private String lastName;
} 

使用And条件连接时,应这样写:findByLastNameAndFirstName(String lastName,String firstName);条件的属性名称与个数要与参数的位置与个数一一对应

支持的关键字

springData 查询方法解析原理

假如创建如下的查询:findByUserDeptUuid(),框架在解析该方法时,首先剔除 findBy,然后对剩下的属性进行解析,假设查询实体为UserInfo。

第一步:先判断 userDeptUuid (根据 POJO 规范,首字母变为小写)是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;

第二步:从右往左截取第一个大写字母开头的字符串(此处为Uuid),然后检查剩下的字符串是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设 user 为查询实体的一个属性;

第三步:接着处理剩下部分(DepUuid),先判断 user 所对应的类型是否有deptUuid属性,如果有,则表示该方法最终是根据 “ UserInfo.user.deptUuid” 的取值进行查询;否则继续按照步骤 二的规则从右往左截取,最终表示根据 “UserInfo.user.dept.uuid” 的值进行查询。可能会存在一种特殊情况,比如 UserInfo包含一个 user 的属性,也有一个 userDep 属性,此时会存在混淆。可以明确在属性之间加上 "_" 以显式表达意图,比如 "findByUser_DepUuid()" 或者 "findByUserDept_Uuid()"

springData 实战

命名方法查询

public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
    /**
     * 根据username来获取对应的user
     */
    User getByUsername(String username);

    /**
     * WHERE username LIKE %?
     */
    List<User> findByUsernameStartingWith(String username);

    /**
     * WHERE username LIKE ?%
     */
    List<User> findByUsernameEndingWith(String username);

    /**
     * WHERE username id < ?
     */
    List<User> findByIdLessThan(Long id);
}

注解查询

public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
    /**
     * 查询id 值最大的那个User 使用@Query 主键可以自定义JPQL语句以实现更灵活的查询
     */
    @Query("SELECT u FROM User u WHERE u.id = (SELECT MAX(p.id) FROM User p)")
    User getMaxIdUser();

    /**
     * @Query 注解传递参数的方式一:占位符方式
     */
    @Query("SELECT u FROM User u WHERE u.username = ?1 AND u.age = ?2")
    List<User> testQueryAnnotationUser1(String username , Integer age);

    /**
     * @Query 注解传递参数的方式二:命名参数方式
     */
    @Query("SELECT u FROM User u WHERE u.username = :username AND u.age = :age")
    List<User> testQueryAnnotationUser2(@Param("username") String username , @Param("age")Integer age);
}

可以通过自定义的 JPQL 完成 UPDATE 和 DELETE 操作,注意: JPQL 不支持使用 INSERT。

在 @Query 注解中编JPQL 语句, 但必须使用 @Modifying 进行修饰. 以通知 SpringData, 这是一个 UPDATE 或 DELETE 操作。

UPDATE 或 DELETE 操作需要使用事务,可以使用注解@Transactional声明,默认情况下, SpringData 的每个方法上有事务, 但都是一个只读事务. 他们不能完成修改操作!

public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
    /**
     * @Query 注解update、delete操作,不支持insert
     */
    @Modifying
    @Query("UPDATE User u SET u.age = :age")
    @Transactional
    void updateUserAge(@Param("age") Integer age);

}

还可以使用原生Sql查询,只需配置nativeQuery = true

public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
    /**
     * 设置 nativeQuery=true 即可以使用原生的 SQL 查询
     */
    @Query(value = "SELECT COUNT(id) FROM sys_user" , nativeQuery = true)
    long getTotalCount();
}

原文地址:https://www.cnblogs.com/yoci/p/10696708.html

时间: 2024-10-27 05:50:55

springBoot+SpringData 整合入门的相关文章

SpringBoot+Mybatis整合入门(一)

SpringBoot+Mybatis 四步整合 第一步 添加依赖 springBoot+Mybatis相关依赖 <!--springBoot相关--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</versi

带你搭一个SpringBoot+SpringData JPA的环境

前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 不知道大家对SpringBoot和Spring Data JPA了解多少,如果你已经学过Spring和Hibernate的话,那么SpringBoot和SpringData JPA可以分分钟上手的.SpringBoot和SpringData JPA的好处我就不说了,当时我学习的时候也粗略做过笔记,有兴趣的同学可以去看看 SpringBoot就是这么简

SpringBoot Kafka 整合使用

前提 假设你了解过 SpringBoot 和 Kafka. 1.SpringBoot 如果对 SpringBoot 不了解的话,建议去看看 DD 大佬 和 纯洁的微笑 的系列博客. 2.Kafka Kafka 的话可以看看我前两天写的博客 : Kafka 安装及快速入门 学习的话自己开台虚拟机自己手动搭建环境吧,有条件的买服务器. 注意:一定要亲自自己安装实践,接下来我们将这两个进行整合. 创建项目 项目整体架构: 使用 IDEA 创建 SpringBoot 项目,这个很简单了,这里不做过多的讲

[转]Struts2+Spring3+Hibernate4+Maven+EasyUI整合入门视频+视频教程源码

[转]Struts2+Spring3+Hibernate4+Maven+EasyUI整合入门视频+视频教程源码 点此立即下载 文件列表:视频教程源码Struts2+Spring3+Hibernate4+Maven+EasyUI整合入门视频008.avi下载地址:https://pan.baidu.com/s/1dcMxMq5xAriJONEpyA06pw Struts2+Spring3+Hibernate4+Maven+EasyUI整合入门视频005.avi Struts2+Spring3+Hi

SpringBoot Kafka 整合实例教程

1.使用IDEA新建工程引导方式,创建消息生产工程 springboot-kafka-producer. 工程POM文件代码如下: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instanc

ssm框架整合入门系列——修改-员工的修改

ssm框架整合入门系列--修改-员工的修改 修改操作的保存员工数据方法用了put提交方式, 这有一个有意思的问题,由于tomcat reqeust.java自身的问题,导致 request.getParameter("empNmae") 拿不到put方式提交请求体的数据. 解决办法,在web.xml中配置HttpPutFormContentFilter <!-- 解决更新员工 无法直接使用put提交方式--> <filter> <filter-name&g

【极简版】SpringBoot+SpringData JPA 管理系统

前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 在上一篇中已经讲解了如何从零搭建一个SpringBoot+SpringData JPA的环境,测试接口的时候也成功获取得到数据了. 带你搭一个SpringBoot+SpringData JPA的Demo 我的目的是做一个十分简易的管理系统,这就得有页面,下面我继续来讲讲我是怎么快速搭一个管理系统的. ps:由于是简易版,我的目的是能够快速搭建,而不在

springboot+security整合(1)

说明 springboot 版本 2.0.3源码地址:点击跳转 系列 springboot+security 整合(1) springboot+security 整合(2) springboot+security 整合(3) 一. 介绍 ??Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在 Spring 应用上下文中配置的 Bean,充分利用了 Spring IoC,DI(控制反转 Inversion o

SpringBoot与整合其他技术

SpringBoot与整合其他技术 5.1 SpringBoot整合Mybatis 5.1.1 添加Mybatis的起步依赖 <!--mybatis起步依赖--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.1.1</ver