1. Repository接口
1.1. Repository接口是Spring Data JPA中为我我们提供的所有接口中的顶层接口。
1.2. Repository提供了两种查询方式的支持
1.2.1. 基于方法名称命名规则查询。
1.2.2. 基于@Query注解查询。
2. 方法名称命名规则查询
2.1. 规则: findBy(关键字)+属性名称(属性名称的首字母大写)+查询条件(首字母大写)。
2.2. 方法名称命名规则查询列表
关键字 | 方法命名 | sql语句 |
findByName(String name) | where name=? | |
Is | findByNameIs(String name) | where name=? |
Equals | findByNameEquals(String name) | where name=? |
And | findByNameAndSex(String name, String sex) | where name=? and sex=? |
Or | findByIdOrName(Integer id, String name) | where id=? or name=? |
Between | findByIdBetween(Integer x, Integer y) | where id between ? and ? |
LessThan | findByIdLessThan(Integer x) | where id<? |
LessThanEqual | findByIdLessThanEqual(Integer x) | where id<=? |
GreaterThan | findByIdGreaterThan(Integer x) | where id>? |
GreaterThanEqual | findByIdGreaterThanEqual(Integer x) | where id>=? |
After | findByIdAfter(Integer x) | where id>? |
Before | findByIdBefore(Integer x) | where id<? |
IsNull | findByNameIsNull() | where name is null |
IsNotNull | findByNameIsNotNull() | where name is not null |
NotNull | findByNameNotNull() | where name is not null |
Like | findByNameLike(String name) | where name like ? |
NotLike | findByNameNotLike(String name) | where name not like ? |
StartingWith | findByNameStartingWith(String name) | where name like ?% |
EndingWith | findByNameEndingWith(String name) | where name like %? |
Containing | findByNameContaining(String name) | where name like %?% |
OrderBy | findBySexOrderByIdDesc(String sex) | where sex=? order by id desc |
Not | findByNameNot(String name) | where name <> ? |
In | findByIdIn(Collection<Integer> c) | where id in (?) |
NotIn | findByIdNotIn(Collection<Integer> c) | where id not in (?) |
3. 方法名称命名规则查询例子
3.1. 创建一个名为spring-data-jpa-naming的Java项目, 同时添加相关jar包, 并添加JUnit能力。
3.2. 新建User.java
package com.bjbs.pojo;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import org.springframework.format.annotation.DateTimeFormat;
@Entity // 指定该类是实体类
@Table(name = "user") // 指定数据库表名(表名和实体类对应)
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id // 指定为主键
@GeneratedValue(strategy = GenerationType.IDENTITY) // 指定主键生成策略
@Column(name = "id") // 指定表中列名(列名和属性名对应)
private Integer id;
@Column(name = "name")
private String name;
@Column(name = "sex")
private String sex;
@Column(name = "birthday")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date birthday;
@Column(name = "address")
private String address;
public User() {
}
public User(String name, String sex, Date birthday, String address) {
this.name = name;
this.sex = sex;
this.birthday = birthday;
this.address = address;
}
public User(Integer id, String name, String sex, Date birthday, String address) {
this.id = id;
this.name = name;
this.sex = sex;
this.birthday = birthday;
this.address = address;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", sex=" + sex + ", birthday=" + birthday + ", address=" + address
+ "]";
}
}
3.3. 新建UserRepository.java, 实现Repository
package com.bjbs.dao;
import java.util.Collection;
import java.util.List;
import org.springframework.data.repository.Repository;
import com.bjbs.pojo.User;
/**
* 参数一T: 当前需要映射的实体; 参数二 T: 当前映射的实体中的id的类型
*/
public interface UserRepository extends Repository<User, Integer> {
/**
* 判断相等
*/
User findByName(String name);
User findByNameIs(String name);
User findByNameEquals(String name);
/**
* And语句
*/
User findByNameAndSex(String name, String sex);
/**
* Or语句
*/
List<User> findByIdOrName(Integer id, String name);
/**
* Between语句
*/
List<User> findByIdBetween(Integer x, Integer y);
/**
* < x
*/
List<User> findByIdLessThan(Integer x);
/**
* <= x
*/
List<User> findByIdLessThanEqual(Integer x);
/**
* > x
*/
List<User> findByIdGreaterThan(Integer x);
/**
* >= x
*/
List<User> findByIdGreaterThanEqual(Integer x);
/**
* > x
*/
List<User> findByIdAfter(Integer x);
/**
* < x
*/
List<User> findByIdBefore(Integer x);
/**
* IsNull语句
*/
List<User> findByNameIsNull();
/**
* IsNotNull语句
*/
List<User> findByNameIsNotNull();
/**
* NotNull语句
*/
List<User> findByNameNotNull();
/**
* Like语句
*/
List<User> findByNameLike(String name);
/**
* NotLike语句
*/
List<User> findByNameNotLike(String name);
/**
* Like name%
*/
List<User> findByNameStartingWith(String name);
/**
* Like %name
*/
List<User> findByNameEndingWith(String name);
/**
* Like %name%
*/
List<User> findByNameContaining(String name);
/**
* OrderBy语句
*/
List<User> findBySexOrderByIdDesc(String sex);
/**
* Not语句
*/
List<User> findByNameNot(String name);
/**
* In语句
*/
List<User> findByIdIn(Collection<Integer> c);
/**
* NotIn语句
*/
List<User> findByIdNotIn(Collection<Integer> c);
}
3.4. 新建UserService.java
package com.bjbs.service;
import java.util.Collection;
import java.util.List;
import com.bjbs.pojo.User;
public interface UserService {
User findByName(String name);
User findByNameIs(String name);
User findByNameEquals(String name);
User findByNameAndSex(String name, String sex);
List<User> findByIdOrName(Integer id, String name);
List<User> findByIdBetween(Integer x, Integer y);
List<User> findByIdLessThan(Integer x);
List<User> findByIdLessThanEqual(Integer x);
List<User> findByIdGreaterThan(Integer x);
List<User> findByIdGreaterThanEqual(Integer x);
List<User> findByIdAfter(Integer x);
List<User> findByIdBefore(Integer x);
List<User> findByNameIsNull();
List<User> findByNameIsNotNull();
List<User> findByNameNotNull();
List<User> findByNameLike(String name);
List<User> findByNameNotLike(String name);
List<User> findByNameStartingWith(String name);
List<User> findByNameEndingWith(String name);
List<User> findByNameContaining(String name);
List<User> findBySexOrderByIdDesc(String sex);
List<User> findByNameNot(String name);
List<User> findByIdIn(Collection<Integer> c);
List<User> findByIdNotIn(Collection<Integer> c);
}
3.5. 新建UserServiceImpl.java
package com.bjbs.service.impl;
import java.util.Collection;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.bjbs.dao.UserRepository;
import com.bjbs.pojo.User;
import com.bjbs.service.UserService;
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public User findByName(String name) {
return userRepository.findByName(name);
}
@Override
public User findByNameIs(String name) {
return userRepository.findByNameIs(name);
}
@Override
public User findByNameEquals(String name) {
return userRepository.findByNameEquals(name);
}
@Override
public User findByNameAndSex(String name, String sex) {
return userRepository.findByNameAndSex(name, sex);
}
@Override
public List<User> findByIdOrName(Integer id, String name) {
return userRepository.findByIdOrName(id, name);
}
@Override
public List<User> findByIdBetween(Integer x, Integer y) {
return userRepository.findByIdBetween(x, y);
}
@Override
public List<User> findByIdLessThan(Integer x) {
return userRepository.findByIdLessThan(x);
}
@Override
public List<User> findByIdLessThanEqual(Integer x) {
return userRepository.findByIdLessThanEqual(x);
}
@Override
public List<User> findByIdGreaterThan(Integer x) {
return userRepository.findByIdGreaterThan(x);
}
@Override
public List<User> findByIdGreaterThanEqual(Integer x) {
return userRepository.findByIdGreaterThanEqual(x);
}
@Override
public List<User> findByIdAfter(Integer x) {
return userRepository.findByIdAfter(x);
}
@Override
public List<User> findByIdBefore(Integer x) {
return userRepository.findByIdBefore(x);
}
@Override
public List<User> findByNameIsNull() {
return userRepository.findByNameIsNull();
}
@Override
public List<User> findByNameIsNotNull() {
return userRepository.findByNameIsNotNull();
}
@Override
public List<User> findByNameNotNull() {
return userRepository.findByNameIsNotNull();
}
@Override
public List<User> findByNameLike(String name) {
return userRepository.findByNameLike(name);
}
@Override
public List<User> findByNameNotLike(String name) {
return userRepository.findByNameNotLike(name);
}
@Override
public List<User> findByNameStartingWith(String name) {
return userRepository.findByNameStartingWith(name);
}
@Override
public List<User> findByNameEndingWith(String name) {
return userRepository.findByNameEndingWith(name);
}
@Override
public List<User> findByNameContaining(String name) {
return userRepository.findByNameContaining(name);
}
@Override
public List<User> findBySexOrderByIdDesc(String sex) {
return userRepository.findBySexOrderByIdDesc(sex);
}
@Override
public List<User> findByNameNot(String name) {
return userRepository.findByNameNot(name);
}
@Override
public List<User> findByIdIn(Collection<Integer> c) {
return userRepository.findByIdIn(c);
}
@Override
public List<User> findByIdNotIn(Collection<Integer> c) {
return userRepository.findByIdNotIn(c);
}
}
3.6. 新建TestUserRepository.java
package com.bjbs.test;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
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 com.bjbs.pojo.User;
import com.bjbs.service.UserService;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestUserRepository {
@Autowired
private UserService userService;
/**
* 查询姓名等于'曹操'的用户
*/
@Test
public void findByName() {
User user = userService.findByName("曹操");
System.out.println(user);
}
/**
* 查询姓名等于'曹操'的用户
*/
@Test
public void findByNameIs() {
User user = userService.findByNameIs("曹操");
System.out.println(user);
}
/**
* 查询姓名等于'曹操'的用户
*/
@Test
public void findByNameEquals() {
User user = userService.findByNameEquals("曹操");
System.out.println(user);
}
/**
* 查询姓名等于'曹操'并且性别等于'男'的用户
*/
@Test
public void findByNameAndSex() {
User user = userService.findByNameAndSex("曹操", "男");
System.out.println(user);
}
/**
* 查询id等于37或的姓名等于'曹操'所有用户
*/
@Test
public void findByIdOrName() {
List<User> list = userService.findByIdOrName(37, "曹操");
for (User user : list) {
System.out.println(user);
}
}
/**
* 查询id在30-35之间的所有用户(包括id是30和35的用户)
*/
@Test
public void findByIdBetween() {
List<User> list = userService.findByIdBetween(30, 35);
for (User user : list) {
System.out.println(user);
}
}
/**
* 查询id<33的所有用户
*/
@Test
public void findByIdLessThan() {
List<User> list = userService.findByIdLessThan(33);
for (User user : list) {
System.out.println(user);
}
}
/**
* 查询id<=33的所有用户
*/
@Test
public void findByIdLessThanEqual() {
List<User> list = userService.findByIdLessThanEqual(33);
for (User user : list) {
System.out.println(user);
}
}
/**
* 查询id>55的所有用户
*/
@Test
public void findByIdGreaterThan() {
List<User> list = userService.findByIdGreaterThan(55);
for (User user : list) {
System.out.println(user);
}
}
/**
* 查询id>=55的所有用户
*/
@Test
public void findByIdGreaterThanEqual() {
List<User> list = userService.findByIdGreaterThanEqual(55);
for (User user : list) {
System.out.println(user);
}
}
/**
* 查询id>55的所有用户
*/
@Test
public void findByIdAfter() {
List<User> list = userService.findByIdAfter(55);
for (User user : list) {
System.out.println(user);
}
}
/**
* 查询id<33的所有用户
*/
@Test
public void findByIdBefore() {
List<User> list = userService.findByIdBefore(33);
for (User user : list) {
System.out.println(user);
}
}
/**
* 查询姓名为Null的所有用户
*/
@Test
public void findByNameIsNull() {
List<User> list = userService.findByNameIsNull();
for (User user : list) {
System.out.println(user);
}
}
/**
* 查询姓名不是空的所有用户
*/
@Test
public void findByNameIsNotNull() {
List<User> list = userService.findByNameIsNotNull();
for (User user : list) {
System.out.println(user);
}
}
/**
* 查询姓名不是空的所有用户
*/
@Test
public void findByNameNotNull() {
List<User> list = userService.findByNameNotNull();
for (User user : list) {
System.out.println(user);
}
}
/**
* 查询姓名包含'河公'的所有用户
*/
@Test
public void findByNameLike() {
List<User> list = userService.findByNameLike("%河公%");
for (User user : list) {
System.out.println(user);
}
}
/**
* 查询姓名不是以'操'结尾的所有用户
*/
@Test
public void findByNameNotLike() {
List<User> list = userService.findByNameNotLike("%操");
for (User user : list) {
System.out.println(user);
}
}
/**
* 查询姓名以'李'开头的所有用户
*/
@Test
public void findByNameStartingWith() {
List<User> list = userService.findByNameStartingWith("李");
for (User user : list) {
System.out.println(user);
}
}
/**
* 查询姓名以'操'结尾的所有用户
*/
@Test
public void findByNameEndingWith() {
List<User> list = userService.findByNameEndingWith("操");
for (User user : list) {
System.out.println(user);
}
}
/**
* 查询姓名包含'河公'的所有用户
*/
@Test
public void findByNameContaining() {
List<User> list = userService.findByNameContaining("河公");
for (User user : list) {
System.out.println(user);
}
}
/**
* 查询性别是'女'的所有用户并按id倒序排列
*/
@Test
public void findBySexOrderByIdDesc() {
List<User> list = userService.findBySexOrderByIdDesc("女");
for (User user : list) {
System.out.println(user);
}
}
/**
* 查询姓名不是'曹操'的所有用户
*/
@Test
public void findByNameNot() {
List<User> list = userService.findByNameNot("曹操");
for (User user : list) {
System.out.println(user);
}
}
/**
* 查询id是35 42 43 44的这几个用户
*/
@Test
public void findByIdIn() {
Collection<Integer> c = new ArrayList<Integer>();
c.add(35);
c.add(42);
c.add(43);
c.add(44);
List<User> list = userService.findByIdIn(c);
for (User user : list) {
System.out.println(user);
}
}
/**
* 查询id不是35 42 43 44的所有用户
*/
@Test
public void findByIdNotIn() {
Collection<Integer> c = new ArrayList<Integer>();
c.add(35);
c.add(42);
c.add(43);
c.add(44);
List<User> list = userService.findByIdNotIn(c);
for (User user : list) {
System.out.println(user);
}
}
}
3.7. 在src下新建application.properties
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.25.138:3306/StudyMybatis?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=lyw123456
3.8. 在src下新建applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 配置读取properties文件的工具类 -->
<context:property-placeholder location="classpath:application.properties" />
<!-- 配置c3p0数据库连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="${spring.datasource.url}" />
<property name="driverClass" value="${spring.datasource.driverClassName}" />
<property name="user" value="${spring.datasource.username}" />
<property name="password" value="${spring.datasource.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.bjbs.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.bjbs.service" />
<!-- Spring Data JPA 的配置 -->
<!-- base-package: 扫描dao接口所在的包 -->
<jpa:repositories base-package="com.bjbs.dao" />
</beans>
3.9. 数据库user表
3.10. 查询姓名等于'曹操'的用户
3.11. 查询姓名等于'曹操'的用户
3.12. 查询姓名等于'曹操'的用户
3.13. 查询姓名等于'曹操'并且性别等于'男'的用户
3.14. 查询id等于37或的姓名等于'曹操'多个用户
3.15. 查询id在30-35之间的所有用户(包括id是30和35的用户)
3.16. 查询id<33的所有用户
3.17. 查询id<=33的所有用户
3.18. 查询id>55的所有用户
3.19. 查询id>=55的所有用户
3.20. 查询id>55的所有用户
3.21. 查询id<33的所有用户
3.22. 查询姓名为Null的所有用户
3.23. 查询姓名不是空的所有用户
3.24. 查询姓名不是空的所有用户
3.25. 查询姓名包含'河公'的所有用户
3.26. 查询姓名不是以'操'结尾的所有用户
3.27. 查询姓名以'李'开头的所有用户
3.28. 查询姓名以'操'结尾的所有用户
3.29. 查询姓名包含'河公'的所有用户
3.30. 查询性别是'女'的所有用户并按id倒序排列
3.31. 查询姓名不是'曹操'的所有用户
3.32. 查询id是35 42 43 44的这几个用户
3.33. 查询id不是35 42 43 44的所有用户