前言:
Spring Data JPA 是 spring data 项目下的一个模块。提供了一套基于 JPA标准操作数据库的简化方案。底层默认的是依赖 Hibernate JPA 来实现的。
一、创建Spring Data Jpa项目
1、导入依赖
| <dependency> |
| <groupId>org.springframework.boot</groupId> |
| <artifactId>spring-boot-starter-data-jpa</artifactId> |
| </dependency> |
2、配置数据源信息
| spring.datasource.driver-class-name=com.mysql.jdbc.Driver |
| spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useSSL=false |
| spring.datasource.username=root |
| spring.datasource.password=tianya |
| spring.jpa.hibernate.ddl-auto=none |
| spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect |
| server.port=8010 |
| logging.level.org.springframework=error |
| |
| spring.jpa.show-sql=true |
| spring.jpa.properties.hibernate.format_sql=true |
| spring.jpa.properties.hibernate.type=trace |
| spring.jpa.properties.hibernate.use_sql_comments=true |
| spring.jpa.properties.hibernate.jdbc.batch_size=50 |
| logging.level.org.hibernate.type.descriptor.sql=trace |
3、编写Dao层
| public interface UsersDao extends JpaRepository<Users, Integer> {} |
4、User
| @Entity |
| @Table(name="t_users") |
| public class Users implements Serializable{ |
| |
| @Id |
| @GeneratedValue(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; |
| } |
| |
| @Override |
| public String toString() { |
| return "Users [userid=" + userid + ", username=" + username + ", userage=" + userage + "]"; |
| } |
| |
| } |
5、编写测试代码
| @RunWith(SpringJUnit4ClassRunner.class) |
| @ContextConfiguration("classpath:applicationContext.xml") |
| public class UsersDaoImplTest { |
| @Autowired |
| private UsersDao usersDao; |
| |
| |
| |
| @Test |
| @Transactional |
| @Rollback(false) |
| public void testInsertUsers(){ |
| Users users = new Users(); |
| users.setUserage(24); |
| users.setUsername("张三"); |
| this.usersDao.save(users); |
| } |
| |
| } |
二、Spring Data Jpa 接口继承结构

三、Spring Data Jpa 运行原理
| @PersistenceContext(name="entityManagerFactory") |
| private EntityManager em; |
| @Test |
| public void test1(){ |
| |
| |
| |
| |
| JpaRepositoryFactory factory = new JpaRepositoryFactory(em); |
| |
| |
| UsersDao ud = factory.getRepository(UsersDao.class); |
| System.out.println(ud); |
| System.out.println(ud.getClass()); |
| } |
四、Repository 接口
| Repository 接口是 Spring Data JPA 中为我我们提供的所有接口中的顶层接口 Repository 提供了两种查询方式的支持 |
| 1)基于方法名称命名规则查询 |
| 2)基于@Query 注解查询 |
1、方法命名规则查询
规则:
findBy(关键字)+属性名称(属性名称的首字母大写)+查询条件(首字母大写)
方法命名规则示例表
关键字 |
方法命名 |
sql where 字句 |
And |
findByNameAndPwd |
where name= ? and pwd =? |
Or |
findByNameOrSex |
where name= ? or sex=? |
Is,Equal |
findById, |
findByIdEquals |
Between |
findByIdBetween |
where id between ? and ? |
LessThan |
findByIdLessThan |
where id < ? |
LessThanEqual |
findByIdLessThanEquals |
where id <= ? |
GreaterThan |
findByIdGreaterThan |
where id > ? |
GreaterThanEqual |
findByIdGreaterThanEquals |
where id > = ? |
After |
findByIdAfter |
where id > ? |
Before |
findByIdBefore |
where id < ? |
IsNull |
findByNameIsNull |
where name is null |
isNotNull,Not Null |
findByNameNotNull |
where name is not |
Like |
findByNameLike |
where name like ? |
NotLike |
findByNameNotLike |
where name not like ? |
StartingWith |
findByNameStartingWith |
where name like '?%' |
EndingWith |
findByNameEndingWith |
where name like '%?' |
Containing |
findByNameContaining |
where name like '%?%' |
OrderBy |
findByIdOrderByXDesc |
where id=? order by x desc |
Not |
findByNameNot |
where name <> ? |
In |
findByIdIn(Collection<?> c) |
where id in (?) |
NotIn |
findByIdNotIn(Collection<?> c) |
where id not in (?) |
True |
findByAaaTue |
where aaa = true |
False |
findByAaaFalse |
where aaa = false |
IgnoreCase |
findByNameIgnoreCase |
where UPPER(name)=UPPER(?) |
创建接口
| |
| |
| |
| |
| |
| public interface UsersDao extends Repository<Users, Integer> { |
| |
| List<Users> findByUsernameIs(String string); |
| List<Users> findByUsernameLike(String string); |
| List<Users> findByUsernameAndUserageGreaterThanEqual(String name,Integer age); |
| } |
测试类
| |
| |
| |
| |
| |
| @RunWith(SpringJUnit4ClassRunner.class) |
| @ContextConfiguration("classpath:applicationContext.xml") |
| public class RepositoryTest { |
| |
| @Autowired |
| private UsersDao usersDao; |
| |
| |
| |
| |
| @Test |
| public void test1(){ |
| |
| |
| |
| |
| |
| |
| List<Users> list = this.usersDao.findByUsernameIs("王五"); |
| for (Users users : list) { |
| System.out.println(users); |
| } |
| } |
| |
| |
| |
| |
| |
| @Test |
| public void test2(){ |
| List<Users> list = this.usersDao.findByUsernameLike("王%"); |
| for (Users users : list) { |
| System.out.println(users); |
| } |
| } |
| |
| |
| |
| |
| @Test |
| public void test3(){ |
| List<Users> list = this.usersDao.findByUsernameAndUserageGreaterThanEqual("王五", 22); |
| for (Users users : list) { |
| System.out.println(users); |
| } |
| } |
| } |
2、基于@Query注解查询
JPQL:
通过 Hibernate 的 HQL 演变过来的。他和 HQL 语法及其相似。
创建接口
| |
| |
| |
| |
| |
| public interface UsersDao extends Repository<Users, Integer> { |
| |
| @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); |
| } |
测试类
| |
| |
| |
| |
| |
| @RunWith(SpringJUnit4ClassRunner.class) |
| @ContextConfiguration("classpath:applicationContext.xml") |
| public class RepositoryTest { |
| |
| @Autowired |
| private UsersDao usersDao; |
| |
| |
| |
| |
| @Test |
| public void test4(){ |
| List<Users> list = this.usersDao.queryUserByNameUseJPQL("王五"); |
| for (Users users : list) { |
| System.out.println(users); |
| } |
| } |
| |
| |
| |
| |
| @Test |
| public void test5(){ |
| List<Users> list = this.usersDao.queryUserByLikeNameUseJPQL("王%"); |
| for (Users users : list) { |
| System.out.println(users); |
| } |
| } |
| |
| |
| |
| |
| @Test |
| public void test6(){ |
| List<Users> list = this.usersDao.queryUserByNameAndAge("王五", 22); |
| for (Users users : list) { |
| System.out.println(users); |
| } |
| } |
| } |
3、通过 SQL 语句查询
| |
| |
| |
| |
| |
| public interface UsersDao extends Repository<Users, Integer> { |
| |
| |
| @Query(value="select * from t_users where username = ?",nativeQuery=true) |
| List<Users> queryUserByNameUseSQL(String name); |
| |
| @Query(value="select * from t_users where username like ?",nativeQuery=true) |
| List<Users> queryUserByLikeNameUseSQL(String name); |
| |
| @Query(value="select * from t_users where username = ? and userage >= ?",nativeQuery=true) |
| List<Users> queryUserByNameAndAgeUseSQL(String name,Integer age); |
| |
| } |
4、通过@Query 注解完成数据更新
| |
| |
| |
| |
| |
| public interface UsersDao extends Repository<Users, Integer> { |
| @Query("update Users set userage = ? where userid = ?") |
| @Modifying |
| void updateUserAgeById(Integer age,Integer id); |
| } |
五、JpaRepository 接口
JpaRepository 接口是我们开发时使用的最多的接口。其特点是可以帮助我们将其他接口的方法的返回值做适配处理。可以使得我们在开发时更方便的使用这些方法。
1、创建接口
| |
| |
| |
| |
| |
| public interface UsersDao extends JpaRepository<Users, Integer>{ |
| |
| } |
2、测试类
| |
| |
| |
| |
| |
| @RunWith(SpringJUnit4ClassRunner.class) |
| @ContextConfiguration("classpath:applicationContext.xml") |
| public class RepositoryTest { |
| |
| @Autowired |
| private UsersDao usersDao; |
| |
| |
| |
| |
| @Test |
| public void test1(){ |
| List<Users> list = this.usersDao.findAll(); |
| for (Users users : list) { |
| System.out.println(users); |
| } |
| } |
| } |
参考博客:https://www.cnblogs.com/chenglc/p/11226693.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)