javascript
在每个运行中运行多个查询_Spring Data JPA的运行原理及几种查询方式
Spring Data JPA的運(yùn)行原理:
@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 代理對(duì)象是基于JDK的動(dòng)態(tài)代理方式 創(chuàng)建的 //System.out.println(this.usersDao.getClass()); JpaRepositoryFactory factory = new JpaRepositoryFactory(em); //getRepository(UsersDao.class);可以幫助我們?yōu)榻涌谏蓪?shí)現(xiàn)類,而這個(gè)實(shí)現(xiàn)類是SimpleJpaRepository的對(duì)象 //要求:該接口必須要是繼承 Repository 接口 UsersDao ud = factory.getRepository(UsersDao.class); System.out.println(ud); System.out.println(ud.getClass()); }然后我們?cè)俅握f下Spring Data的介紹,這樣好帶入查詢:
Spring Data是什么?
Spring Data是一個(gè)用于簡(jiǎn)化數(shù)據(jù)庫(kù)訪問,并支持云服務(wù)的開源框架。其主要目標(biāo)是使得對(duì)數(shù)據(jù)的訪問變得方便快捷。
Spring Data JPA能干什么?
可以極大的簡(jiǎn)化JPA的寫法,可以在幾乎不用寫實(shí)現(xiàn)的情況下,實(shí)現(xiàn)對(duì)數(shù)據(jù)的訪問和操作,除了CRUD外,還包括如分頁、排序等一些常用的功能。
Spring Data JPA提供的接口,Spring Data JPA的核心概念:
1:Repository:最頂層的接口,是一個(gè)空的接口,目的是為了統(tǒng)一所有Repository的類型,且能讓組件掃描的時(shí)候自動(dòng)識(shí)別。
2:CrudRepository :是Repository的子接口,提供CRUD的功能
3:PagingAndSortingRepository:是CrudRepository的子接口,添加分頁和排序的功能
4:JpaRepository:是PagingAndSortingRepository的子接口,增加了一些實(shí)用的功能,比如:批量操作等。
5:JpaSpecificationExecutor:用來做負(fù)責(zé)查詢的接口
6:Specification:是Spring Data JPA提供的一個(gè)查詢規(guī)范,要做復(fù)雜的查詢,只需圍繞這個(gè)規(guī)范來設(shè)置查詢條件
Repository 接口:
Repository 接口是 Spring Data JPA 中為我我們提供的所有接口中的頂層接口。
Repository 提供了兩種查詢方式的支持
1)基于方法名稱命名規(guī)則查詢
2)基于@Query 注解查詢
一、方法名稱命名規(guī)則查詢
規(guī)則:findBy(關(guān)鍵字)+屬性名稱(屬性名稱的首字母大寫)+查詢條件(首字母大寫)
如果打錯(cuò)字了,還是啥的,評(píng)論修正下哈(手動(dòng)滑稽),其實(shí)還有很多的,只是我把一些常用的拿出來了。
結(jié)構(gòu):
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); }實(shí)體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 自增長(zhǎng)@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測(cè)試類:
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接口測(cè)試* @author Administrator**/ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class RepositoryTest {@Autowiredprivate UsersDao usersDao;/*** 需求:使用用戶名作為查詢條件*/@Testpublic void test1(){/*** 判斷相等的條件,有三種表示方式* 1,什么都不寫,默認(rèn)的就是做相等判斷* 2,Is* 3,Equal*/List<Users> list = this.usersDao.findByUsernameIs("莫名其妙");for (Users users : list) {System.out.println(users);}}/*** 需求:根據(jù)用戶姓名做Like處理* Like:條件關(guān)鍵字*/@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數(shù)據(jù)庫(kù)連接池 --><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相關(guān)的屬性的注入 --><!-- 配置數(shù)據(jù)庫(kù)類型 --><property name="database" value="MYSQL"/><!-- 正向工程 自動(dòng)創(chuàng)建表 --><property name="generateDdl" value="true"/><!-- 顯示執(zhí)行的SQL --><property name="showSql" value="true"/></bean></property><!-- 掃描實(shí)體的包 --><property name="packagesToScan"><list><value>com.msk.pojo</value></list></property></bean><!-- 配置Hibernate的事務(wù)管理器 --><bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="entityManagerFactory"/></bean><!-- 配置開啟注解事務(wù)處理 --><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); //參數(shù)名是隨意定義,如果你只是一個(gè)參數(shù),只要寫一個(gè)問號(hào),它直接會(huì)參數(shù)綁定,沒問題,如果你具有多個(gè)參數(shù)的話,它解析起來,是從左至右的去綁定@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);測(cè)試類:
/*** 測(cè)試@Query查詢 JPQL*/ @Test public void test4(){List<Users> list = this.usersDao.queryUserByNameUseJPQL("莫名其妙");for (Users users : list) {System.out.println(users);} }/*** 測(cè)試@Query查詢 JPQL*/ @Test public void test5(){List<Users> list = this.usersDao.queryUserByLikeNameUseJPQL("莫%");for (Users users : list) {System.out.println(users);} }/*** 測(cè)試@Query查詢 JPQL*/ @Test public void test6(){List<Users> list = this.usersDao.queryUserByNameAndAge("莫名其妙", 23);for (Users users : list) {System.out.println(users);} }總結(jié)
以上是生活随笔為你收集整理的在每个运行中运行多个查询_Spring Data JPA的运行原理及几种查询方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python工业自动化镜头_ELVIS
- 下一篇: 光遇安卓服务器维修,《光遇》渠道服更换手