关于Spring Data

Spring社区的一个顶级工程,主要用于简化数据(关系型&非关系型)访问,如果我们使用Spring Data来开发程序的话,那么可以省去很多低级别的数据访问操作,如编写数据查询语句、DAO类等,我们仅需要编写一些抽象接口并定义相关操作即可,Spring会在运行期间的时候创建代理实例来实现我们接口中定义的操作。

关于Spring Data子项目

Spring Data拥有很多子项目,除了Spring Data Jpa外,还有如下子项目。

Spring Data Commons

Spring Data MongoDB

Spring Data Redis

Spring Data Solr

Spring Data Gemfire

Spring Data REST

Spring Data Neo4j

关于Spring Data Jpa

Spring Data Jpa是Spring Data的一个子项目,主要用于简化数据访问层的实现,使用Spring Data Jpa可以轻松实现增删改查、分页、排序等。

例子,Spring Boot + Spring Data Jpa

1、添加POM.XML文件

如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>spring-data-jpa-example</name><description>Demo project for Spring Boot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.4.4.RELEASE</version><relativePath /> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.7</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

其中,spring-boot-starter-parent会加载Spring Boot应用所需的所有默认配置;

spring-boot-starter-data-jpa会下载所有Spring Data Jpa所需的依赖;

添加spring-boot-starter-web是因为我们的工程是一个Web应用;

另外我们的数据库是mysql,所以还需要mysql-connector-java依赖;

由于使用了缓存,所以再添加一个spring-boot-starter-cache依赖;

2、编写实体类User

package com.example.domain;import java.io.Serializable;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQuery;@Entity
@NamedQuery(name = "User.findByName", query = "select name,address from User u where u.name=?1")
public class User implements Serializable
{private static final long serialVersionUID = 1L;@Idlong id;@Column(name = "name")String name;@Column(name = "address")String address;public long getId(){return id;}public void setId(long id){this.id = id;}public String getName(){return name;}public void setName(String name){this.name = name;}public String getAddress(){return address;}public void setAddress(String address){this.address = address;}}

其它没啥好说的,注意下这里的@NamedQuery注解,大致意思就是让我们在Repository接口中定义的findByName方法不使用默认的查询实现,取而代之的是使用这条自定义的查询语句去查询,如果这里没有标注的话,会使用默认实现的。

3、编写Repository接口

这里将编写两个Repository接口,仅仅用于示例,实际中可以合并成一个:

UserJpaRepository 
package com.example.repository;import org.springframework.data.jpa.repository.JpaRepository;import com.example.domain.User;public interface UserJpaRepository extends JpaRepository<User,Long> {}

这里的UserJpaRepository接口实现了JpaRepository接口;

实际上JpaRepository实现了PagingAndSortingRepository接口,PagingAndSortingRepository接口实现了CrudRepository接口,CrudRepository接口实现了Repository接口;

简单说明下:

Repository接口是一个标识接口,里面是空的;

CrudRepository接口定义了增删改查方法;

PagingAndSortingRepository接口用于分页和排序;

由于JpaRepository接口继承了以上所有接口,所以拥有它们声明的所有方法;

另外注意下,以findAll方法为例,JpaRepository接口返回的是List, PagingAndSortingRepository和CrudRepository返回的是迭代器;

UserRepository 
package com.example.repository;import java.util.List;import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.Repository;
import org.springframework.data.repository.query.Param;import com.example.domain.User;public interface UserRepository extends Repository<User, Long>
{List<User> findByNameAndAddress(String name, String address);@Query(value = "from User u where u.name=:name")List<User> findByName1(@Param("name") String name);@Query(value = "select * from #{#entityName} u where u.name=?1", nativeQuery = true)List<User> findByName2(String name);List<User> findByName(String name);
}

这里的UserRepository接口主要定义了一些查询方法;

比如这里的findByNameAndAddress和findByName方法,我们是不需要额外定义其它查询语句就可以直接执行的,Spring Data Jpa会根据实体类的属性名字以及方法名自动实现该方法;PS:由于我们在实体类中声明了@NamedQuery注解,实际上findByName方法会使用@NamedQuery注解标注的查询语句去查询;

另外这里的findByName1方法使用了HQL语句查询;

findByName2方法使用了原始的sql语句查询;

4、编写Service

service接口:

package com.example.service;import java.util.List;import com.example.domain.User;public interface IUserService
{public List<User> findAll();public void saveUser(User book);public User findOne(long id);public void delete(long id);public List<User> findByName(String name);}

接口实现类:

package com.example.service.impl;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import com.example.domain.User;
import com.example.repository.UserRepository;
import com.example.repository.UserJpaRepository;
import com.example.service.IUserService;@Service
@Transactional
public class UserServiceImpl implements IUserService
{@Autowiredprivate UserJpaRepository userJpaRepository;@Autowiredprivate UserRepository userRepository;public List<User> findAll(){return userJpaRepository.findAll();}public List<User> findByName(String name){List<User> userList1 = userRepository.findByName1(name);List<User> userList2 = userRepository.findByName2(name);List<User> userList3 = userRepository.findByNameAndAddress(name, "3");System.out.println("userList1:" + userList1);System.out.println("userList2:" + userList2);System.out.println("userList3:" + userList3);return userRepository.findByName(name);}public void saveUser(User book){userJpaRepository.save(book);}@Cacheable("users")public User findOne(long id){System.out.println("Cached Pages");return userJpaRepository.findOne(id);}public void delete(long id){userJpaRepository.delete(id);}
}

这个没啥好说的,调用Repository接口接口的方法即可。

5、编写Controller

Controller也没啥好说的,调用Service即可,注意下这里的Controller使用@RestController注解来标注,另外URL路径命名按照RESTful风格来命名;

package com.example.web;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import com.example.domain.User;
import com.example.service.IUserService;@RestController
@RequestMapping(value = "/users")
public class UserController
{@Autowiredprivate IUserService userService;@RequestMapping(value = "/add/{id}/{name}/{address}")public User addUser(@PathVariable int id, @PathVariable String name,@PathVariable String address){User user = new User();user.setId(id);user.setName(name);user.setAddress(address);userService.saveUser(user);return user;}@RequestMapping(value = "/delete/{id}")public void deleteBook(@PathVariable int id){userService.delete(id);}@RequestMapping(value = "/")public List<User> getBooks(){return userService.findAll();}@RequestMapping(value = "/{id}")public User getUser(@PathVariable int id){User user = userService.findOne(id);return user;}@RequestMapping(value = "/search/name/{name}")public List<User> getBookByName(@PathVariable String name){List<User> users = userService.findByName(name);return users;}}

6、配置datasource

在application.properties文件中添加如下配置:

spring.jpa.show-sql = true
logging.level.org.springframework.data=DEBUG
spring.jpa.hibernate.ddl-auto=spring.datasource.url=jdbc:mysql://localhost:3306/demo
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

如果你使用STS IDE的话,这些属性配置都会自动提示的,省的去查找。

想查看spring.datasource的配置,可以参考这个类:DataSourceProperties.java

7、编写启动类

比较简单,注意下该类所属的包级别要大于或等于其它类,以保证其它类的注解可以被扫描到。

package com.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;@SpringBootApplication
@EnableCaching
public class SpringDataJpaExampleApplication {public static void main(String[] args) {SpringApplication.run(SpringDataJpaExampleApplication.class, args);}
}

运行、测试程序

启动main方法,或打成jar包运行;

浏览器输入以下URL,测试即可:

http://localhost:8080/users/

http://localhost:8080/users/add/100/110/111

http://localhost:8080/users/delete/100

http://localhost:8080/users/2

http://localhost:8080/users/search/name/2

程序源码

https://github.com/peterchenhdu/spring-data-jpa-example

参考资料

http://docs.spring.io/spring-data/jpa/docs/1.11.0.RELEASE/reference/html/

http://javabeat.net/spring-data-jpa/

https://spring.io/guides/gs/caching/

Spring Data JPA例子[基于Spring Boot、Mysql]相关推荐

  1. ORM框架之Spring Data JPA(二)spring data jpa方式的基础增删改查

    上一篇主要在介绍hibernate实现jpa规范,如何实现数据增删改查,这一篇将会着重spring data jpa 一.Spring Data JPA 1.1 Spring Data JPA介绍: ...

  2. 【Spring Data JPA】基于 JpaRepository 增删改查

    文章目录 创建实体类 定义JPA查询接口 增.删.改.查 增加.修改 删除 删除[根据实体类删除] 删除[根据实体类主键删除] 查询 简单查询 查询单个信息[findBy] 查询多个信息[findAl ...

  3. Spring Boot整合Spring Data JPA操作数据

    一. Sping Data JPA 简介 Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套 JPA 应用框架,底层使用了 Hibernate 的 J ...

  4. SpringBoot 实战 (八) | 使用 Spring Data JPA 访问 Mysql 数据库

    微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 如题,今天介绍 Spring Data JPA 的使用. 什么是 Spring Data JPA 在介绍 Spri ...

  5. hibernate mysql 读写分离_SpringBoot集成Spring Data JPA及读写分离

    JPA是什么 JPA(Java Persistence API)是Sun官方提出的Java持久化规范,它为Java开发人员提供了一种对象/关联映射工具 来管理Java应用中的关系数据.它包括以下几方面 ...

  6. Spring Boot中使用Spring Data JPA示例

    JPA是Java Persistence API的简称,是sun公司早期推出的Java持久层规范,目前实现JPA规范的主流框架有Hibernate.OpenJPA等.Hibernate框架是当前较为流 ...

  7. 使用Spring Rest和Spring Data JPA和H2以及Spring Boot示例的Restful API

    你好朋友, 在本教程中,您将学习以下内容: 1.在Spring Boot中配置Spring Rest,Spring Data JPA和H2 2.使用Spring Boot创建Springful服务端点 ...

  8. SpringBoot22-spingboot数据访问-Spring Data JPA

    一:点睛Spring Data JPA 1,什么事Spring Data JPA 我们知道Hibernate是数据访问解决技术的绝对霸主,使用O/R映射技术实现数据访问,o/r映射即将领域模型类和数据 ...

  9. SpringBoot的Spring Data JPA配置

    配置文件加载的优先级顺序 项目根目录下config文件夹中的配置文件 项目根目录下的配置文件 resources目录下config文件夹中的配置文件 resources目录下的配置文件 注:相应的.y ...

最新文章

  1. python与excel的应用-python基础之类与对象的应用-操作excel
  2. 六、Springmvc json数据交互
  3. python算法与数据结构-快速排序算法
  4. P1145 约瑟夫 W(模拟)
  5. 2013 Multi-University Training Contest 2 Balls Rearrangement
  6. 基于php重庆旅游设计网站作品
  7. String.getBytes()方法中的中文编码问题(转)
  8. 神奇宝贝HTML游戏代码,《我的世界》神奇宝贝召唤神兽指令 各神兽召唤代码大全...
  9. 呼叫转移流程分析(一)
  10. 电脑蓝屏,问题:你的电脑未正确启动,按“重启”以重启你的电脑,有时这样可以解决问题,你还可以按“高级选项”,尝试使用其他选项修复你的电脑
  11. Unreal4引擎开发学习日志
  12. 航天工程系统是什么?
  13. cvCaptureFromFile一直返回NULL
  14. [转载]Malcolm的新书:Outliers
  15. python考研选什么专业好就业_人工智能考研专业就业怎么样 哪些院校开设人工智能专业...
  16. 白炽灯护眼还是LED护眼?盘点led护眼灯品牌排行
  17. 新思科技网络安全研究中心分析手机中的生物识别数据泄露漏洞
  18. 阿里云天池大赛赛题(深度学习)——人工智能辅助构建知识图谱(完整代码)
  19. 2006年日语一级听力原文
  20. 写给前端工程师的色彩常识:色彩三属性及其在CSS中的应用

热门文章

  1. 高性能计时器Timer的设计(时间轮和时间堆两种方式)
  2. java 和 Android Base64加密
  3. 关于图片上传的个人摘要
  4. DRBD数据同步部署-centos7
  5. Netdata---Linux系统性能实时监控平台部署记录
  6. 186. [USACO Oct08] 牧场旅行
  7. Unity 摄像机搭配陀螺仪的使用
  8. 求单独出现的数,冒泡排序优化,strncpy的优化
  9. 信息管理代码分析二读取二进制文件数据
  10. iOS逆向工程的一些资料