在每个运行中运行多个查询_Spring Data JPA的运行原理及几种查询方式

fa8aaa5af95e2f9bf0d6230ca5ab828d.png

Spring Data JPA的运行原理:

@PersistenceContext(name="entityManagerFactory") 
private EntityManager em; 
@Test 
public void test1(){ 
//org.springframework.data.jpa.repository.support.SimpleJpaRepositor 
y@fba8bf 
//System.out.println(this.usersDao); 
//class com.sun.proxy.$Proxy29 代理对象是基于JDK的动态代理方式 
创建的 
//System.out.println(this.usersDao.getClass()); 
JpaRepositoryFactory factory = new JpaRepositoryFactory(em); 
//getRepository(UsersDao.class);可以帮助我们为接口生成实现类,而这个实现类是SimpleJpaRepository的对象 
//要求:该接口必须要是继承 Repository 接口 
UsersDao ud = factory.getRepository(UsersDao.class); 
System.out.println(ud); 
System.out.println(ud.getClass()); 
}

然后我们再次说下Spring Data的介绍,这样好带入查询:

Spring Data是什么?

Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷。

Spring Data JPA能干什么?

可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作,除了CRUD外,还包括如分页、排序等一些常用的功能。

Spring Data JPA提供的接口,Spring Data JPA的核心概念:

1:Repository:最顶层的接口,是一个空的接口,目的是为了统一所有Repository的类型,且能让组件扫描的时候自动识别。

2:CrudRepository :是Repository的子接口,提供CRUD的功能

3:PagingAndSortingRepository:是CrudRepository的子接口,添加分页和排序的功能

4:JpaRepository:是PagingAndSortingRepository的子接口,增加了一些实用的功能,比如:批量操作等。

5:JpaSpecificationExecutor:用来做负责查询的接口

6:Specification:是Spring Data JPA提供的一个查询规范,要做复杂的查询,只需围绕这个规范来设置查询条件

Repository 接口:

Repository 接口是 Spring Data JPA 中为我我们提供的所有接口中的顶层接口。

Repository 提供了两种查询方式的支持

1)基于方法名称命名规则查询

2)基于@Query 注解查询

一、方法名称命名规则查询

规则:findBy(关键字)+属性名称(属性名称的首字母大写)+查询条件(首字母大写)

57075a353da437c0553860a20949fbc1.png

如果打错字了,还是啥的,评论修正下哈(手动滑稽),其实还有很多的,只是我把一些常用的拿出来了。

结构:

8f60b327448f8b1729b603c519f85604.png

Dao层的UsersDao 接口:

import com.msk.pojo.Users;
import org.springframework.data.repository.Repository;import java.util.List;/** Repository接口* @author Administrator**/
public interface UsersDao extends Repository<Users, Integer> {List<Users> findByUsernameIs(String string);List<Users> findByUsernameLike(String string);List<Users> findByUsernameAndUserageGreaterThanEqual(String name, Integer age);
}

实体bean Users:

package com.msk.pojo;import java.io.Serializable;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;@Entity
@Table(name="t_users")
public class Users implements Serializable{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)//strategy=GenerationType.IDENTITY 自增长@Column(name="userid")private Integer userid;@Column(name="username")private String username;@Column(name="userage")private Integer userage;public Integer getUserid() {return userid;}public void setUserid(Integer userid) {this.userid = userid;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Integer getUserage() {return userage;}public void setUserage(Integer userage) {this.userage = userage;}@Overridepublic String toString() {return "Users [userid=" + userid + ", username=" + username + ", userage=" + userage + "]";}}

Test测试类:

package com.msk.test;import com.msk.dao.UsersDao;
import com.msk.pojo.Users;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.util.List;/*** Repository接口测试* @author Administrator**/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class RepositoryTest {@Autowiredprivate UsersDao usersDao;/*** 需求:使用用户名作为查询条件*/@Testpublic void test1(){/*** 判断相等的条件,有三种表示方式* 1,什么都不写,默认的就是做相等判断* 2,Is* 3,Equal*/List<Users> list = this.usersDao.findByUsernameIs("莫名其妙");for (Users users : list) {System.out.println(users);}}/*** 需求:根据用户姓名做Like处理* Like:条件关键字*/@Testpublic void test2(){List<Users> list = this.usersDao.findByUsernameLike("莫%");for (Users users : list) {System.out.println(users);}}/*** 需求:查询名称为莫淞凯,并且他的年龄大于等于22岁*/@Testpublic void test3(){List<Users> list = this.usersDao.findByUsernameAndUserageGreaterThanEqual("莫名其妙", 23);for (Users users : list) {System.out.println(users);}}
}

配置文件:

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:jpa="http://www.springframework.org/schema/data/jpa"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 配置读取properties文件的工具类 --><context:property-placeholder location="classpath:jdbc.properties"/><!-- 配置c3p0数据库连接池 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="jdbcUrl" value="${jdbc.url}"/><property name="driverClass" value="${jdbc.driver.class}"/><property name="user" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></bean><!-- Spring整合JPA  配置EntityManagerFactory--><bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><property name="dataSource" ref="dataSource"/><property name="jpaVendorAdapter"><bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"><!-- hibernate相关的属性的注入 --><!-- 配置数据库类型 --><property name="database" value="MYSQL"/><!-- 正向工程 自动创建表 --><property name="generateDdl" value="true"/><!-- 显示执行的SQL --><property name="showSql" value="true"/></bean></property><!-- 扫描实体的包 --><property name="packagesToScan"><list><value>com.msk.pojo</value></list></property></bean><!-- 配置Hibernate的事务管理器 --><bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="entityManagerFactory"/></bean><!-- 配置开启注解事务处理 --><tx:annotation-driven transaction-manager="transactionManager"/><!-- 配置springIOC的注解扫描 --><context:component-scan base-package="com.msk"/><!-- Spring Data JPA 的配置 --><!-- base-package:扫描dao接口所在的包 --><jpa:repositories base-package="com.msk.dao"/>
</beans>

jdbc.properties:

jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.driver.class=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=root

二、基于@Query 注解的查询

通过 JPQL 语句查询

JPQL:通过Hibernate的HQL演变过来的,它和HQL语法及其相似。

接口中:

//使用@Query注解查询
@Query(value="from Users where username = ?")
List<Users> queryUserByNameUseJPQL(String name);
//参数名是随意定义,如果你只是一个参数,只要写一个问号,它直接会参数绑定,没问题,如果你具有多个参数的话,它解析起来,是从左至右的去绑定@Query("from Users where username like ?")
List<Users> queryUserByLikeNameUseJPQL(String name);@Query("from Users where username = ? and userage >= ?")
List<Users> queryUserByNameAndAge(String name,Integer age);

测试类:

/*** 测试@Query查询 JPQL*/
@Test
public void test4(){List<Users> list = this.usersDao.queryUserByNameUseJPQL("莫名其妙");for (Users users : list) {System.out.println(users);}
}/*** 测试@Query查询 JPQL*/
@Test
public void test5(){List<Users> list = this.usersDao.queryUserByLikeNameUseJPQL("莫%");for (Users users : list) {System.out.println(users);}
}/*** 测试@Query查询 JPQL*/
@Test
public void test6(){List<Users> list = this.usersDao.queryUserByNameAndAge("莫名其妙", 23);for (Users users : list) {System.out.println(users);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

467python教程_Magnus Lie Hetland的《Python基础教程(第3版)》自学笔记(持续更新中)...

转载请注明原创出处&#xff0c;谢谢&#xff01;如果读完觉得有收获的话&#xff0c;欢迎点赞加关注。Python基础教程.jpg快速上手&#xff1a;基础知识交互式解释器在Python交互式解释器的提示符>>>后面输入help()可以获取指南&#xff0c;在IDLE中&#xff0c;还可…

java 获取所有带指定注解的类名_SXT DAY023 反射和注解

1. 反射机制介绍_Class对象获取反射机制是 Java 的动态性之一 动态语言:在程序运行时&#xff0c;可以改变程序的结构或变量的 类型。反射机制的常见作用动态的加载类、动态的获取类的信息(属性&#xff0c;方法&#xff0c;构造 器) 动态构造对象 动态调用类和对象的任意方法、…

tomcat勾连mysql_tomcat9.0启动脚本startup.bat的分析

1、 Apache Tomcat的下载和安装从Apache官网https://tomcat.apache.org/可以下载各种版本的tomcat软件&#xff0c;下载的文件格式可以是zip/tar.gz/exe形式的。如下图所示&#xff0c;在64位windows中使用tomcat&#xff0c;我们可以下载"64-bit Windows.zip",直接解…

安卓能硬改的手机机型_【每日新闻】小米11部分镜头参数爆料;华为重新采购手机零部件 重启4G手机生产...

数据铸造影响力关注每日行业热点资讯&#xff0c;掌握业界动态趋势&#xff0c;以下是今天的精彩内容&#xff1a;1、小米11部分镜头参数爆料&#xff1a;超大底50MP主摄&#xff0c;长焦达12MP或48MP2、华为重新采购手机零部件 重启4G手机生产1、小米11部分镜头参数爆料&#…

kafka集群为什么需要三个节点_大白话带你认识 Kafka

前言应大部分的小伙伴的要求&#xff0c;在Yarn之前先来一个kafka的小插曲&#xff0c;轻松愉快。一、Kafka基础消息系统的作用应该大部份小伙伴都清楚&#xff0c;用机油装箱举个例子所以消息系统就是如上图我们所说的仓库&#xff0c;能在中间过程作为缓存&#xff0c;并且实…

mysql对日期的操作_MySql对日期的操作

1、计算俩个日期之间所差的天数select datediff(2018-09-18,2018-09-01)2、计算日期是这周的星期几select dayofweek(2018-09-18)1.因为外国一般都是把星期天认为是一周的开始&#xff0c;所以用这种方法一般都得减去一天才是这周的星期几select date_format(2018-09-17,"…

sql移动加权计算利润_计算机视觉中的半监督学习

作者&#xff1a;Amit Chaudhary编译&#xff1a;ronghuaiyang导读图解半监督的各种方法的关键思想。计算机视觉的半监督学习方法在过去几年得到了快速发展。目前最先进的方法是在结构和损失函数方面对之前的工作进行了简化&#xff0c;以及引入了通过混合不同方案的混合方法。…

.net 启动mysql数据库连接_[ASP.net教程]mysql数据库连接方式(.net)

[ASP.net教程]mysql数据库连接方式(.net)0 2014-07-17 18:01:001.通过ado.net连接(数据库连接串中为中文貌似无法使用)需要添加MySql.Data.dll(可通过安装mysql-connector-net-6.8.3.mis获得)引用MySql.Data.dll调用方式string connectionString “serverlocalhost;port3306;da…

overflowhidden把内容遮住了怎么办_图片有水印怎么办?不用PS,有这4招就够了!...

图片是我们在做 PPT 时经常会使用到的高频元素。往往会在搜索引擎中搜到很多带有水印的图片&#xff0c;怎么办呢&#xff1f;固然 PS 等软件去水印很给力&#xff0c;但是对于连 PPT 都还没有用得很熟悉的同学&#xff0c;让他们再去下载安装 Photoshop 软件&#xff0c;仅仅只…

mysql开窗函数over_oracle分析函数技术详解(配上开窗函数over())

一、Oracle分析函数入门 分析函数是什么&#xff1f; 分析函数是Oracle专门用于 解决复杂报表统计需求 的功能强大的函数&#xff0c; 它可以在数据中进行分组然后计算基于组的某种统计 &#xff0c;并且每一组的每一行都可以返回一个统计。 分析函数和聚合函数的不同之处是什么…

传递给系统调用的数据区域太小怎么解决_一口气说出“分布式追踪系统”原理!...

“ 在微服务架构中&#xff0c;一次请求往往涉及到多个模块&#xff0c;多个中间件&#xff0c;多台机器的相互协作才能完成。图片来自 Pexels这一系列调用请求中&#xff0c;有些是串行的&#xff0c;有些是并行的&#xff0c;那么如何确定这个请求背后调用了哪些应用&#xf…

语义分割和实例分割_一文读懂语义分割与实例分割

以人工智能为导向的现代计算机视觉技术&#xff0c;在过去的十年中发生了巨大的变化。今天&#xff0c;它被广泛用于图像分类、人脸识别、物体检测、视频分析以及机器人及自动驾驶汽车中的图像处理等领域。图像分割技术是目前预测图像领域最热门的一项技术&#xff0c;原因在于…

游戏自审自查报告_开发的射箭小游戏上线了,分享一下我在开发过程中遇到的问题...

利用业余时间开发的微信小游戏-射箭救人质上线了&#xff0c;主要玩法就是操作弓箭射断绳子把人救下来就可以了。图片资源是我找一个朋友做的。开发过程不算太顺利。磕磕绊绊做了12关。希望大家支持下。谢谢。分享一下我在开发中遇到的问题和部分解决方案、希望对大家有所帮助。…

java 抛出异常的目的_Java实验八,异常

一.实验目的1. 掌握自定义异常类的编写&#xff1b;2. 掌握使用try-catch语句来处理异常。二.实验内容及要求车站检查危险品的设备&#xff0c;如果发现危险品会发出警告。编程模拟设备发现危险品&#xff1a;1. 编写一个Exception的子类DangerException&#xff0c;该子类可以…

postmapping注解_Swagger常用注解

在使用swagger时候如果掌握一些注解的使用&#xff0c;则在开发过程中测试的时候可以事半功倍&#xff0c;尤其在与前端技术进行联调&#xff0c;前端技术在访问swagger中的每个api时&#xff0c;可以很清楚的知道每个url对应的请求类型、参数类型、参数是否非必输、参数个数等…

java map 多个值_java 一个函数EnumMap返回多个值

在开发过程中&#xff0c;经常会有这种情况&#xff0c;就是一个函数需要返回多个值&#xff0c;这是一个问题&#xff01;&#xff01;网上这个问题的解决方法&#xff1a;1、使用map返回值&#xff1b;这个方法问题是&#xff0c;你并不知道如何返回值的key是什么&#xff0c…

调用别的方法的返回值_Spring boot如何实现异步调用

Spring boot如何实现异步调用异步调用:一个可以无需等待被调用函数的返回值就让操作继续进行的方法举个例子异步调用就是你 喊 你朋友吃饭 &#xff0c;你朋友说知道了 &#xff0c;待会忙完去找你 &#xff0c;你就去做别的了。同步调用就是你 喊 你朋友吃饭 &#xff0c;你朋…

照片识别出错_AI跨年龄人脸识别技术在跨年龄寻亲的应用简析

9月3日&#xff0c;央视财经《经济半小时》栏目播出了一段有关失踪儿童找回的视频新闻。在这则新闻中&#xff0c;跨年龄人脸识别技术是最为核心的功臣&#xff0c;深圳警方利用跨年龄人脸识别技术&#xff0c;根据一张3岁孩童的儿童照片找回了失踪了十几年的孩子&#xff0c;让…

分段线性判别法 java_线性判别分析(Linear Discriminant Analysis)(二)

4. 实例将3维空间上的球体样本点投影到二维上&#xff0c;W1相比W2能够获得更好的分离效果。PCA与LDA的降维对比&#xff1a;PCA选择样本点投影具有最大方差的方向&#xff0c;LDA选择分类性能最好的方向。LDA既然叫做线性判别分析&#xff0c;应该具有一定的预测功能&#xff…

软件测试用例_大话软件测试用例要素

我们经常都知道一个测试用例里面包含以下几个要素&#xff1a;1&#xff0c;用例编号2&#xff0c;模块3&#xff0c;场景4&#xff0c;用例名称5&#xff0c;前置条件6&#xff0c;测试等级7&#xff0c;操作步骤8&#xff0c;预期结果(需求要求的结果)9&#xff0c;实际结果1…