spring jpa集成依赖的环境准备及实体类仓库编写教程

目录
  • 一、SpringBoot集成Hibernate JPA的依赖
  • 二、环境准备
    • 1.配置文件
    • 2.创建data.sql和schema.sql
  • 三、实体类
  • 四、编写仓库
    • 1.代码编写
    • 2.CRUD基础操作
    • 3.稍微复杂操作
    • 4.更复杂一点的操作

一、SpringBoot集成Hibernate JPA的依赖

    compile(
            //hibernate
            'org.springframework.boot:spring-boot-starter-data-jpa',
            'org.hibernate:hibernate-java8',
            'mysql:mysql-connector-java',
            //springmvc
            'org.springframework.boot:spring-boot-starter-web',
            "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
            "com.kingboy:common:$commonVersion"
    )

二、环境准备

1.配置文件

server:
  port: 8080
spring:
  application:
    name: kingboy-springboot-data
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql:///jpa?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: 123456
    schema: classpath:shema.sql
    data: classpath:data.sql
  jpa:
    hibernate:
      ddl-auto: none

2.创建data.sql和schema.sql

scheme.sql:建表语句,我没有使用hibernate的建表

CREATE TABLE IF NOT EXISTS `user` (
  `id` bigint(20) NOT NULL,
  `age` int(11) DEFAULT NULL,
  `birth` datetime DEFAULT NULL,
  `password` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `realname` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `username` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

data.sql:一些假数据,每次重启清空重新插入

DELETE FROM `user`;
INSERT INTO `user`
VALUES
        ('1', '56', '2016-09-12 12:12:00', 'king123', '小明', 'boy'),
        ('2', '12', '1993-08-12 07:12:00', 'king123', '小南', 'kingboy'),
        ('3', '11', '1992-05-12 23:12:00', 'king123', '小孩', 'boyking'),
        ('4', '2', '2006-12-13 20:12:00', 'king123', '金子', 'kiboy'),
        ('5', '66', '2012-09-12 05:12:00', 'king123', '哈喽小金', 'baby'),
        ('6', '12', '2000-02-13 06:12:00', 'king123', 'Baby', 'xiaohong'),
        ('7', '24', '2017-12-12 11:12:00', 'king123', '小金', 'king');

三、实体类

@Entity
public class User {
    @Id
    private Long id;
    private String username;
    private String realname;
    private String password;
    private Integer age;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
    private LocalDateTime birth;
    //Setter Getter ...
}

四、编写仓库

1.代码编写

写一个类继承JpaRepository<T, ID>,需要写两个泛型,第一个代表要存储的实体类型,第二个代表主键类型,例如写一个User类的仓储如下:

public interface UserRepository extends JpaRepository<User, Long> {

}

我们来看一下JpaRepository的继承结构(如下),其实就可以发现仍然是JPA的一套Reposiroty,那我们其实就可以用JPA的一套接口操作进行数据的增删改查,
spring会自动根据方法名为我们生成对应的代理类去实现这些方法。

2.CRUD基础操作

先来看看JpaRepository已经实现的一些基础方法,这些方法的名称已经具有很好的说明解释了,那么大家自己看看,很容易就能理解

3.稍微复杂操作

jpa自带的这些方法肯定是不能满足我们的业务需求的,那么我们如何自定义方法呢?我们只要使用特定的单词对方法名进行定义,那么Spring就会对我们写的方法名进行解析,
生成对应的实例进行数据处理,有木有很简单?那么接下来就使用Spring官方文档中的实例进行演示。

先来看下官方关键字的说明

逻辑操作 在定义方法时使用的关键词
AND And
OR Or
AFTER After , IsAfter
BEFORE Before , IsBefore
CONTAINING Containing , IsContaining , Contains
BETWEEN Between , IsBetween
ENDING_WITH EndingWith , IsEndingWith , EndsWith
EXISTS Exists
FALSE False , IsFalse
GREATER_THAN GreaterThan , IsGreaterThan
GREATER_THAN_EQUALS GreaterThanEqual , IsGreaterThanEqual
IN In , IsIn
IS Is , Equals , (or no keyword)
IS_EMPTY IsEmpty , Empty
IS_NOT_EMPTY IsNotEmpty , NotEmpty
IS_NOT_NULL NotNull , IsNotNull
IS_NULL Null , IsNull
LESS_THAN LessThan , IsLessThan
LESS_THAN_EQUAL LessThanEqual , IsLessThanEqual
LIKE Like , IsLike
NEAR Near , IsNear
NOT Not , IsNot
NOT_IN NotIn , IsNotIn
NOT_LIKE NotLike , IsNotLike
REGEX Regex , MatchesRegex , Matches
STARTING_WITH StartingWith , IsStartingWith , StartsWith
TRUE True , IsTrue
WITHIN Within , IsWithin

举几个方法的栗子:

使用示例 说明
findByNameAndPrice(String name,Double price) 根据用户名和价格进行查询
findByNameOrPrice(String name,Double price) 根据用户名或者价格进行查询
findByName(String name) 根据用户名进行查找
findByNameNot(String name) 查找用户名!=name的用户
findByPriceBetween(Double a, Double b) 查询价格区间
findByPriceLessThan(Double price) 查询价格小于price,不包含price
findByPriceGreaterThan(Double price) 查询价格大于price,不包含price
findByPriceBefore(Double price) 查询价格小于price,包含price
findByPriceAfterDouble price 查询价格大于price,包含price
findByNameLike(String name) 根据用户名查询??????这个我实验了下,是完全匹配查询,并没有模糊查询
findByNameStartingWith(String name) 用户名以name开头的用户
findByNameEndingWith(String name) 用户名以name结尾的用户
findByNameContaining(String name) 用户名包含name的用户,相当于sql中的like %name%
findByNameIn(Collectionnames) 查询用户名在名称列表的用户
findByNameNotIn(Collectionnames) 查询用户名不在名称列表的用户
findByAvailableTrue 查询avaliable属性为true的用户
findByAvailableFalse 查询avaliable属性为false的用户
findByAvailableTrueOrderByNameDesc() 查询avaliable属性为true的用户,并按用户名排序

如果需要分页功能的话,只需要在方法的最后一个参数加上Pageable就可以了,下面的示例中有演示

下面写几个示例进行演示,只把仓储层的列出来了,整体运行是测试过的,没问题,如果需要整体代码请到本文顶部的github仓库查看。

public interface UserRepository extends JpaRepository<User, Long> {
    /**
     * 查询用户名为username的用户
     * @param username
     * @return
     */
    List<User> findByUsername(String username);
    /**
     * 查询用户名为username的用户,带分页
     * @param username
     * @return
     */
    List<User> findByUsername(String username, Pageable pageable);
    /**
     * 查询用户名为username并且真实姓名为realname的用户
     * @param username
     * @param realname
     */
    List<User> findByUsernameAndRealname(String username, String realname);
    /**
     * 查询用户名为username或者姓名为realname的用户
     */
    List<User> findByUsernameOrRealname(String username, String realname);
    /**
     * 查询用户名不是username的所有用户
     * @param username
     * @return
     */
    List<User> findByUsernameNot(String username);
    /**
     * 查询年龄段为ageFrom到ageTo的用户
     * @param ageFrom
     * @param ageTo
     * @return
     */
    List<User> findByAgeBetween(Integer ageFrom, Integer ageTo);
    /**
     * 查询生日小于birthTo的用户
     */
    List<User> findByBirthLessThan(LocalDateTime birthTo);
    /**
     * 查询生日段大于birthFrom的用户
     * @param birthFrom
     * @return
     */
    List<User> findByBirthGreaterThan(LocalDateTime birthFrom);
    /**
     * 查询年龄小于或等于ageTo的用户
     */
    List<User> findByAgeBefore(Integer ageTo);
    /**
     * 查询年龄大于或等于ageFrom的用户
     * @param ageFrom
     * @return
     */
    List<User> findByAgeAfter(Integer ageFrom);
    /**
     * 用户名模糊查询
     * @param username
     * @return
     */
    List<User> findByUsernameLike(String username);
    /**
     * 查询以start开头的用户
     * @param start
     * @return
     */
    List<User> findByUsernameStartingWith(String start);
    /**
     * 查询以end结尾的用户
     * @return
     */
    List<User> findByUsernameEndingWith(String end);
    /**
     * 查询用户名包含word的用户
     * @param word
     * @return
     */
    List<User> findByUsernameContaining(String word);
    /**
     * 查询名字属于usernames中的用户
     * @param usernames
     * @return
     */
    List<User> findByUsernameIn(Collection<String> usernames);
    /**
     * 查询名字不属于usernames中的用户
     * @param usernames
     * @return
     */
    List<User> findByUsernameNotIn(Collection<String> usernames);
    /**
     *最后来个复杂点的:查询年龄小于ageTo,姓名以start开头,id大于idTo的用户,并且按照年龄倒序
     * @return
     */
    List<User> findByAgeBeforeAndUsernameStartingWithAndIdGreaterThanOrderByAgeDesc(Integer ageTo, String start, Long idTo);
}

4.更复杂一点的操作

我们可以使用@Query注解进行查询,这样要求我们自己写查询语句,需要会hqlS查询才可以,其实也很简单,不会写查就是了。

注意:hql的方式仍然可以在参数最后一个加Pageable进行分页,但是nativeQuery不可以。

public interface BookRepository extends ElasticsearchRepository<Book, String> {
       /**
        * 使用@Query和hql进行查询
        * @param name
        * @return
        */
       @Query("from User where username = :name")
       List<User> findByNameHQL(@Param(value = "name") String name, Pageable pageable);

       /**
        * 使用原生sql进行查询
        * @param name
        * @return
        */
       @Query(value = "select * from user where username = :name", nativeQuery = true)
       List<User> findByNameNative(@Param(value = "name") String name);
}

5.这种通过接口方法的方式也可以进行联表查询,以后有机会再补充

以上就是spring jpa集成依赖的环境准备及实体类仓库编写教程的详细内容,更多关于spring jpa集成环境实体类仓库编写教程的资料请关注我们其它相关文章!

(0)

相关推荐

  • 详解在Spring Boot中使用JPA

    前面关于spring Boot的文章已经介绍了很多了,但是一直都没有涉及到数据库的操作问题,数据库操作当然也是我们在开发中无法回避的问题,那么今天我们就来看看Spring Boot给我们提供了哪些疯狂的方式来解决数据库的操作问题. OK,废话不多说,让我们愉快的开启今天的数据库操作之旅吧! 什么是JPA 一说JavaWeb,很多小伙伴都知道SSH,这个H代表的就是hibernate框架,这个小伙伴们都知道,可是什么又是JPA呢?相信许多刚入门的小伙伴听说过但不是特别清楚,首先JPA的全称叫做Ja

  • spring data jpa使用详解(推荐)

    使用Spring data JPA开发已经有一段时间了,这期间学习了一些东西,也遇到了一些问题,在这里和大家分享一下. 前言: Spring data简介: Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务. Spring Data 包含多个子项目: Commons - 提供共享的基础框架,适合各个子项目使用,支持跨数据库持久化 JPA - 简化创建 JPA 数据访问层和跨存储的持久层

  • 轻松搞定SpringBoot JPA使用配置过程详解

    SpringBoot整合JPA 使用数据库是开发基本应用的基础,借助于开发框架,我们已经不用编写原始的访问数据库的代码,也不用调用JDBC(Java Data Base Connectivity)或者连接池等诸如此类的被称作底层的代码,我们将从更高的层次上访问数据库,这在Springboot中更是如此,本章我们将详细介绍在Springboot中使用 Spring Data JPA 来实现对数据库的操作. JPA & Spring Data JPA JPA是Java Persistence API

  • SpringBoot系列教程JPA之基础环境搭建的方法

    JPA(Java Persistence API)Java持久化API,是 Java 持久化的标准规范,Hibernate是持久化规范的技术实现,而Spring Data JPA是在 Hibernate 基础上封装的一款框架.JPA作为标准,实际上并没有说局限于某个固定的数据源,事实上mysql,mongo, solr都是ok的.接下来我们将介绍下springboot结合jpa 来实现mysql的curd以及更加复杂一点的sql支持 jpa系列教程将包含以下几块 环境搭建 基础的插入.修改.删除

  • Spring data jpa的使用与详解(复杂动态查询及分页,排序)

    一. 使用Specification实现复杂查询 (1) 什么是Specification Specification是springDateJpa中的一个接口,他是用于当jpa的一些基本CRUD操作的扩展,可以把他理解成一个spring jpa的复杂查询接口.其次我们需要了解Criteria 查询,这是是一种类型安全和更面向对象的查询.而Spring Data JPA支持JPA2.0的Criteria查询,相应的接口是JpaSpecificationExecutor. 而JpaSpecifica

  • spring jpa集成依赖的环境准备及实体类仓库编写教程

    目录 一.SpringBoot集成Hibernate JPA的依赖 二.环境准备 1.配置文件 2.创建data.sql和schema.sql 三.实体类 四.编写仓库 1.代码编写 2.CRUD基础操作 3.稍微复杂操作 4.更复杂一点的操作 一.SpringBoot集成Hibernate JPA的依赖 compile( //hibernate 'org.springframework.boot:spring-boot-starter-data-jpa', 'org.hibernate:hib

  • Spring Boot 集成Shiro的多realm实现以及shiro基本入门教程

    情景 我的项目中有六个用户角色(学校管理员,学生等),需要进行分别登陆.如果在一个realm中,对controller封装好的Token进行Service验证,需要在此realm中注入六个数据库操作对象,然后写一堆if语句来判断应该使用那个Service服务,然后再在验证方法(doGetAuthorizationInfo)中写一堆if来进行分别授权,这样写不仅会让代码可读性会非常低而且很难后期维护修改(刚写完的时候只有上帝和你能看懂你写的是什么,一个月之后你写的是什么就只有上帝能看懂了). 所以

  • IDEA 自动生成 JPA 实体类的图文教程

    目录 1.连接数据库(mysql) 1.1 打开 MySQL 1.2 配置 DataSource 和 Driver 1.3 结果展示 2.生成实体类的设置 2.1 File → Project Structure,给项目添加JPA 2.2 打开persistence视图 2.3 配置 Database Scheme 2.4 生成的实体类,是这样的 2.5 解决生成类报错问题(消除红色波浪线) idea连接oracle使用jpa自动生成实体类 1.连接数据库(mysql) 1.1 打开 MySQL

  • JPA配置方式+逆向工程映射到Entity实体类

    目录 将已有项目转换成JPAproject.. 此时会显示警告 准备:wildfly/tomcat或者其他服务器 你的数据库的Driver,(此处用的mysql-connecter-java-5.1.39-bin.jar) 将已有项目转换成JPA project.. Step1:[选中项目,右键] -> [Configure] -> [Conver to JPA project] Step2.1:Configuration有custom(用户定制)\default默认等选项,选择custom,

  • Spring Boot集成Redis实现缓存机制(从零开始学Spring Boot)

    本文章牵涉到的技术点比较多:spring Data JPA.Redis.Spring MVC,Spirng Cache,所以在看这篇文章的时候,需要对以上这些技术点有一定的了解或者也可以先看看这篇文章,针对文章中实际的技术点在进一步了解(注意,您需要自己下载Redis Server到您的本地,所以确保您本地的Redis可用,这里还使用了MySQL数据库,当然你也可以内存数据库进行测试).这篇文章会提供对应的Eclipse代码示例,具体大体的分如下几个步骤: (1)新建Java Maven Pro

  • 详解spring boot集成ehcache 2.x 用于hibernate二级缓存

    本文将介绍如何在spring boot中集成ehcache作为hibernate的二级缓存.各个框架版本如下 spring boot:1.4.3.RELEASE spring framework: 4.3.5.RELEASE hibernate:5.0.1.Final(spring-boot-starter-data-jpa默认依赖) ehcache:2.10.3 项目依赖 <dependency> <groupId>org.springframework.boot</gro

  • Spring boot集成Kafka+Storm的示例代码

    前言 由于业务需求需要把Strom与kafka整合到spring boot项目里,实现其他服务输出日志至kafka订阅话题,storm实时处理该话题完成数据监控及其他数据统计,但是网上教程较少,今天想写的就是如何整合storm+kafka 到spring boot,顺带说一说我遇到的坑. 使用工具及环境配置 ​ 1. java 版本jdk-1.8 ​ 2. 编译工具使用IDEA-2017 ​ 3. maven作为项目管理 ​ 4.spring boot-1.5.8.RELEASE 需求体现 1.

  • Spring boot 集成Dubbox的方法示例

    前言 因为工作原因,需要在项目中集成dubbo,所以去查询dubbo相关文档,发现dubbo目前已经不更新了,所以把目光投向了dubbox,dubbox是当当网基于dubbo二次开发的一个项目,dubbox,因为公司项目中一个是基于spring mvc 3.0的,一个是基于spring boot的,而spring boot相对来说文档少一点,所以此文记录下spring boot下如何继承dubbox 一.安装zookeeper 1.zookeeper简介 ZooKeeper是一个分布式的,开放源

  • Spring Boot集成Shiro实现动态加载权限的完整步骤

    一.前言 本文小编将基于 SpringBoot 集成 Shiro 实现动态uri权限,由前端vue在页面配置uri,Java后端动态刷新权限,不用重启项目,以及在页面分配给用户 角色 . 按钮 .uri 权限后,后端动态分配权限,用户无需在页面重新登录才能获取最新权限,一切权限动态加载,灵活配置 基本环境 spring-boot 2.1.7 mybatis-plus 2.1.0 mysql 5.7.24 redis 5.0.5 温馨小提示:案例demo源码附文章末尾,有需要的小伙伴们可参考哦 ~

  • Spring JPA整合QueryDSL的示例代码

    前言 Spring JPA是目前比较常用的ORM解决方案,但是其对于某些场景并不是特别的方便,例如查询部分字段,联表查询,子查询等. 而接下来我会介绍与JPA形成互补,同时也是与JPA兼容得很好的框架QueryDSL. 同时由于目前主流使用Spring Boot,所以本文也会基于Spring Boot来进行演示 如果对于长文无感,但是又希望了解QueryDSL可以直接查看文章最后的总结 环境信息 以下为示例的关键环境信息 JDK 1.8 maven 3.6.1 SpringBoot 2.2.0.

随机推荐