Spring Data JPA例子[基于Spring Boot、Mysql]

阅读目录

  • 关于Spring Data
  • 关于Spring Data子项目
  • 关于Spring Data Jpa
  • 例子,Spring Boot + Spring Data Jpa
  • 运行、测试程序
  • 程序源码
  • 参考资料

关于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);}
}
复制代码


本文转自风一样的码农博客园博客,原文链接:http://www.cnblogs.com/chenpi/p/6357527.html,如需转载请自行联系原作者

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

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

相关文章

The way of Webpack learning (IV.) -- Packaging CSS(打包css)

一&#xff1a;目录结构 二&#xff1a;webpack.config.js的配置 const path require(path);module.exports {mode:development,entry:{app:./src/app.js},output:{path:path.resolve(__dirname,dist),publicPath:./dist/,//设置引入路径在相对路径filename:[name].bundle.js…

文本文档TXT每行开头结尾加内容批处理代码

文本文档TXT每行开头结尾加内容批处理代码 读A.TXT ,每行开头加&#xff1a;HTMLBodytxt HTMLBodytxt chr(10) aaaaaaaa结尾加&#xff1a;bbbbbbbb处理后的文档写入到B.TXT For /f "delims" %%i in (a.txt) do echo HTMLBodytxt HTMLBodytxt chr(10) aaaaaaaa%%…

windows运行对话框_如何在Windows运行对话框中添加文本快捷方式?

windows运行对话框Windows comes prepackaged with a ton of handy run-dialog shortcuts to help you launch apps and tools right from the run box; is it possible to add in your own custom shortcuts? Windows预包装了许多方便的运行对话框快捷方式&#xff0c;可帮助…

前后台分离--概念相关

js 包管理器:  1、npm  2、bower 包管理器的作用&#xff1a;&#xff08;之前满世界找代码&#xff0c;现在统一地址了。类似于360软件管家&#xff0c;maven仓库。&#xff09;  1、复用别人已经写好的代码。  2、管理包之间的依赖关系。 JS &#xff1a;语言&#…

Zabbix 3.0 安装

Zabbix 3.0 For CentOS6安装 1 概述2 安装MySQL3 安装WEB4 安装Zabbix-Server5配置WEB1概述 对于3.0&#xff0c;官方只提供CentOS7的RPM包&#xff0c;Ubuntu的DEB包&#xff0c;对于CentOS6&#xff0c;默认不提供RPM包&#xff0c;为了照顾到使用CentOS6的兄弟们&#xff0c…

[Hadoop in China 2011] 中兴:NoSQL应用现状及电信业务实践

http://tech.it168.com/a2011/1203/1283/000001283154.shtml 在今天下午进行的NoSQL系统及应用分论坛中&#xff0c;中兴云计算平台研发总工、中兴通讯技术专家委员会专家高洪发表主题演讲“NoSQL技术的电信业务实践”&#xff0c;介绍了NoSQL的发展现状及其在电信业务中的应用…

qmediaplayer获取流类型_Java 流API

流相关的接口和类在java.util.stream包中。AutoCloseable接口来自java.lang包。所有流接口从继承自AutoCloseable接口的BaseStream接口继承。AutoCloseable|--BaseStream|--IntStream|--LongStream|--DoubleStream|--Stream如果流使用集合作为其数据源&#xff0c;并且集合不需…

田刚:庞加莱猜想与几何

&#xff08;作者 田刚&#xff09; 时间&#xff1a;2015年11月1日 地点&#xff1a;北京大学北京国际数学研究中心 主题&#xff1a;未来论坛“理解未来”讲座北大专场&#xff1a;庞加莱猜想与几何 田刚&#xff1a; 非常高兴能够有这个机会来参加未来论坛讲演。我今天要讲的…

进化:从孤胆极客到高效团队_极客学校:学习Windows 7 –远程管理

进化:从孤胆极客到高效团队In this installation of Geek School, we look at how we can administer our machines remotely using Remote Assistance, Remote Desktop, Windows Remote Management also known as WinRM, and PowerShell. 在此Geek School安装中&#xff0c;我…

新秀翻译(两)——使用Java通用配置模板方法模式

假设你发现你已经非常重码&#xff0c;你可能会考虑使用模板的方法来消除easy重复错误代码。下面是一个示例:以下两类,他完成了几乎相同的功能&#xff1a; 实例化并初始化一个Reader来读取CSV文件。读取每一行并解析&#xff1b;把每一行的字符填充到Product或Customer对象&am…

框架基础:深入理解Java注解类型(@Annotation)

注解的概念 注解的官方定义 首先看看官方对注解的描述&#xff1a; An annotation is a form of metadata, that can be added to Java source code. Classes, methods, variables, parameters and packages may be annotated. Annotations have no direct effect on the opera…

打印墨水调钢笔墨水_如何节省墨水并改善网站打印质量

打印墨水调钢笔墨水Printing out web pages you want a hard copy of can be a little hit and miss. Unlike other documents, it is not easy to tell exactly how many pieces of paper will be needed, and whether or not there will be any awkward clipping. Add to thi…

highcharts 怎么去掉鼠标悬停效果_练瑜伽减肥没效果什么原因?

没有心的参与&#xff0c;瑜伽就不是瑜伽曾经有很多人问&#xff1a;自己想用瑜伽来减肥&#xff0c;但练习瑜伽这么久&#xff0c;为什么还是减不下来&#xff1f;一点效果都没有。瑜伽是什么&#xff1f;瑜伽只是一种单纯的运动吗&#xff1f;只让身体参与进去就可以了吗&…

百度地图1

百度地图BMap的类 BMap的属性是一些构造函数,主大类有&#xff1a;核心类、基础类、控件类、覆盖物类、右键菜单类、地图类型类、地图吐槽类、服务类、全局类 核心类Map Map&#xff1a;最主要的一个类&#xff0c;集成了其他模块的方法&#xff0c;是一个集成了整个地图功能的…

Java基础学习总结(23)——GUI编程

2019独角兽企业重金招聘Python工程师标准>>> 一、AWT介绍 所有的可以显示出来的图形元素都称为Component&#xff0c;Component代表了所有的可见的图形元素&#xff0c;Component里面有一种比较特殊的图形元素叫Container&#xff0c;Container(容器)在图形界面里面…

spring-使用配置文件完成JdbcTemplate操作数据库

一、创建spring项目项目名称&#xff1a;spring101302二、在项目上添加jar包1.在项目中创建lib目录/lib2.在lib目录下添加spring支持commons-logging.jarjunit-4.10.jarlog4j.jarmysql-connector-java-5.1.18-bin.jarspring-beans-3.2.0.RELEASE.jarspring-context-3.2.0.RELEA…

瓦片经纬度及行列号转换_Slippy map tilenames(瓦片和经纬度换算)

Slippy map tilenames(瓦片和经纬度换算)This article describes the file naming conventions for theSlippy Map application.Tiles are 256 256 pixel PNG filesEachzoom level is a directory, each column is a subdirectory, andeach tile in that column is a fileFilen…

在Windows 7或Vista(或Windows 8.x,Sorta)上禁用Aero

The Windows Aero Glass interface for Windows 7 or Vista requires a decent video card, you won’t be able to use it on an old clunker computer. For those worried about performance, sometimes squeezing every last drop requires disabling Aero. Windows 7或Vist…

一个简单的JDBC通用工具

支持多种数据库&#xff0c;统一方式产生连接&#xff0c;最优化、最简单方式释放资源。欢迎拍砖&#xff01;import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.sql.*; import java.util.List; import java.util.Properties…

sfm点云代码_VisualSFM使用方法与心得

关于VisualSfM的更多内容组合多个模型(What if VisualSFM produces multiple models?)&#xff1a;按照上述步骤进行稀疏重建后&#xff0c;理论上可以得到很好的模型。如果结果产生了多个模型&#xff0c;要想把多个模型合成成一个&#xff0c;点击菜单中的“SfM->More Fu…