SpringBoot集成Mybatis开启下划线格式的数据自动转换成小驼峰格式
application.yml文件:
mybatis: configuration: map-underscore-to-camel-case: true
Spring知识堂
Spring Boot内置的Tomcat服务器配置详解
springboot内置了tomcat, 并给我们设置了默认参数, 我们怎么样修改springboot内置的tomcat参数, 才能使我们的服务效率更高呢?
解决
Spring Boot能支持的最大并发量主要看其置tomcat的配置, 可以在配置文件中对其进行更改。在 Spring boot 项目中,可以内置 Tomcat、Jetty、Undertow、Netty 等服务器容器。当我们添加了 spring-boot-starter-web 依赖后,默认会使用 Tomcat 作为 Web 容器。
下面演示如何对这个 Tomcat 进行进一步的配置
要对 Tomcat 进行进一步的配置,可以在 application.properties 中进行配置:
server.xx开头的是全部servlet容器通用的配置,server.tomcat.xx开头的是tomcat特有的参数
服务器在任何给定时间接受和处理的最大连接数。 一旦达到限制,操作系统仍然可以根据“acceptCount”属性接受连接。
server.tomcat.max-connections: 8192
当所有可能的请求处理线程都在使用时,传入连接请求会被放进队列中等待,等待队列的最大队列长度。
server.tomcat.accept-count: 100
服务器在给定时间能接受的连接数为server.tomcat.max-connections, 但并不是同时在工作,最大工作线程数。
server.tomcat.threads.max: 200
有最大的工作线程数, 就有最小工作线程数。
server.tomcat.threads.min-spare: 10
用于解码 URI 的字符编码。
server.tomcat.uri-encoding: UTF-8
任何 HTTP POST请求中表单内容的最大大小。理论上POST请求的大小是无限制的,但是tomcat设定了请求大小为两兆,如要取消限制,则应该将值设为 -1。
server.tomcat.max-http-form-post-size: 2MB
请求正文的大小。
server.tomcat.max-swallow-size: 2MB
连接器在接受连接后将等待呈现请求 URI 行的时间。即socket调用read()等待读取的时间,如果在设置的时间内没有请求,则会主动断开连接
server.tomcat.connection-timeout: 60000ms
在连接关闭之前等待另一个 HTTP 请求的时间。默认和 connectionTimeout的值一样。 设置为 -1 时不会超时。
server.tomcat.keep-alive-timeout: (Duration)
Maximum number of HTTP requests that can be pipelined before the connection is closed. When set to 0 or 1, keep-alive and pipelining are disabled. When set to -1, an unlimited number of pipelined or keep-alive requests are allowed.
在连接关闭之前可以通过管道传输的最大 HTTP 请求数。 当设置为 0 或 1 时,长连接和管道被禁用,可以避免tomcat产生大量的TIME_WAIT连接,从而从一定程度上避免tomcat假死。 当设置为 -1 时,允许无限数量的管道或长连接请求。
即表示该连接最大支持的请求数。超过该请求数的连接也将被关闭(此时就会返回一个Connection: close头给客户端)
server.tomcat.max-keep-alive-requests: 100
其他一些不常用的设置
# 是否缓冲输出,使其仅定期刷新。
server.tomcat.accesslog.buffered: true# 是否检查日志文件是否存在,以便在外部进程重命名它时可以重新创建它。
server.tomcat.accesslog.check-exists: false# 是否仅在“ServletRequest.getAttribute(conditionIf)”不产生 null 时才启用请求的日志记录。
server.tomcat.accesslog.condition-if: String# 是否仅在“ServletRequest.getAttribute(conditionUnless)”产生 null 时才启用请求记录。
server.tomcat.accesslog.condition-unless: String# 创建日志文件的目录。 可以是绝对的或相对于 Tomcat 基本目录。
server.tomcat.accesslog.directory: logs# 启用访问日志。
server.tomcat.accesslog.enabled: false# 日志文件使用的字符集。 默认为系统默认字符集。
server.tomcat.accesslog.encoding: String# 放置在日志文件名中的日期格式。
server.tomcat.accesslog.file-date-format: .yyyy-MM-dd# 是否使用 RFC 5952 定义的 IPv6 规范表示格式。
server.tomcat.accesslog.ipv6-canonical: false# 用于格式化日志条目和日志文件名后缀中的时间戳的语言环境。 默认为 Java 进程的默认语言环境。
server.tomcat.accesslog.locale: String# 删除访问日志文件之前保留的天数。
server.tomcat.accesslog.max-days: -1# 访问日志的格式模式。
server.tomcat.accesslog.pattern: common# 日志文件名前缀。
server.tomcat.accesslog.prefix: access_log# 是否推迟在文件名中包含日期戳,直到轮换时间。
server.tomcat.accesslog.rename-on-rotate: false# 为请求使用的 IP 地址、主机名、协议和端口设置请求属性。
server.tomcat.accesslog.request-attributes-enabled: false# 是否启用访问日志轮换。
server.tomcat.accesslog.rotate: true# 日志文件名后缀。
server.tomcat.accesslog.suffix: .log# 逗号分隔的附加模式列表,匹配 jar 以忽略 TLD 扫描。 特殊的“?” 和 '*' 字符可以在模式中使用,以分别匹配一个和一个字符以及零个或多个字符。
server.tomcat.additional-tld-skip-patterns: List<String># 调用 backgroundProcess 方法之间的延迟。 如果未指定持续时间后缀,则将使用秒。
server.tomcat.background-processor-delay: 10s# Tomcat 基目录。 如果未指定,则使用临时目录。
server.tomcat.basedir: File# 是否应该启用 Tomcat 的 MBean Registry。
server.tomcat.mbeanregistry.enabled: false# 将保留在缓存中并在后续请求中重用的最大空闲处理器数。 当设置为 -1 时,缓存将不受限制,理论上的最大大小等于最大连接数。
server.tomcat.processor-cache: 200# 是否应通过将 / 附加到路径来重定向对上下文根的请求。 使用在代理处终止的 SSL 时,此属性应设置为 false。
server.tomcat.redirect-context-root: true# URI 路径中应允许的其他未编码字符的逗号分隔列表。 只允许使用“< > [ \ ] ^ ` { | }”。
server.tomcat.relaxed-path-chars: List<Character># URI 查询字符串中应允许的其他未编码字符的逗号分隔列表。 只允许使用“< > [ \ ] ^ ` { | }”。
server.tomcat.relaxed-query-chars: List<Character># 从中提取远程主机的 HTTP 表头的名称。
server.tomcat.remoteip.host-header: X-Forwarded-Host# 匹配要信任的代理的正则表达式。
server.tomcat.remoteip.internal-proxies: 10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|169\.254\.\d{1,3}\.\d{1,3}|127\.\d{1,3}\.\d{1,3}\.\d{1,3}|172\.1[6-9]{1}\.\d{1,3}\.\d{1,3}|172\.2[0-9]{1}\.\d{1,3}\.\d{1,3}|172\.3[0-1]{1}\.\d{1,3}\.\d{1,3}|0:0:0:0:0:0:0:1|::1# 用于覆盖原始端口值的 HTTP 标头的名称。
server.tomcat.remoteip.port-header: X-Forwarded-Port# 包含传入协议的标头,通常命名为“X-Forwarded-Proto”。
server.tomcat.remoteip.protocol-header: X-Forwarded-Proto# 指示传入请求是否使用 SSL 的协议头的值.
server.tomcat.remoteip.protocol-header-https-value: https# 从中提取远程 IP 的 HTTP 表头的名称。 例如,`X-FORWARDED-FOR`。
server.tomcat.remoteip.remote-ip-header: X-FORWARDED-FOR# 此 Web 应用程序是否允许静态资源缓存。
server.tomcat.resource.allow-caching: true# 静态资源缓存的生存时间。
server.tomcat.resource.cache-ttl: Duration# 通过调用 sendRedirect 生成的 HTTP 1.1 和更高版本的位置标头将使用相对重定向还是绝对重定向。
server.tomcat.use-relative-redirects: false
SpringBoot不使用内置的Tomcat的方法
刚创建好的SpringBoot项目,默认给我们提供了内置的Tomcat,只要运行Application就可以启动项目了,因为使用了注解EnableConfiguration ,这里我们使用外置的tomcat来启动
<packaging>war</packaging>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 移除嵌入式tomcat插件 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
/**
* 使用内嵌的tomcat时SpringbootdemoApplication的main方法启动的方式
这里需要类似于web.xml的配置方式来启动spring上下文,因此重写SpringBootServletInitializer的configure方法,在Application类的同级添加一个SpringBootStartApplication类
*/
public class ScfManagerWebStartApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(ScfManagerWebApplication.class);
}
}
SpringBoot 统一给URL添加/api前缀
src\main\resources目录的配置文件 application.properties 中添加如下配置:server.servlet.contextPath=/api # SpringBoot 2.xserver.contextPath=/api # SpringBoot 1.x
SpringBoot 内嵌tomcat设置解决报错问题:Invalid character found in the request target
解决报错:
Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
//2.x @Bean public ConfigurableServletWebServerFactory webServerFactory() { TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(); factory.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> connector.setProperty("relaxedQueryChars", "|{}[]")); return factory; } //1.x @Bean public EmbeddedServletContainerFactory webServerFactory() { TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(); factory.addConnectorCustomizers( (TomcatConnectorCustomizer) connector -> connector.setProperty("relaxedQueryChars", "|{}[]")); return factory; }
Spring Boot项目中如何查看springBoot版本和Spring的版本_怎么查看springboot版本
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986 解决方案
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
org.apache.coyote.http11.AbstractHttp11Processor process
信息: Error parsing HTTP request header
Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
at org.apache.coyote.http11.AbstractNioInputBuffer.parseRequestLine(AbstractNioInputBuffer.java:283)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1017)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1524)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1480)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
spring MVC 使用 @RequestBody 接收JSON参数转为实体对象
public void save(@RequestBody Scene scene, HttpServletRequest
request, HttpServletResponse response) throws Exception {
}
当在浏览器中访问时 URL中带有特殊字符,如花括号冒号时,就会出现这个错误。
例如:http://localhost:8080/index.do?{id:123}
原因已经清楚了,但解决方法有多种:
1、去除URL中的特殊字符;
2、特殊字符是出现在后面跟的参数中,对参数进行 URL 编码,可以使用 JavaScript 中的 encodeURIComponent() 函数。
3、使用 Post 方法提交数据
以下两种方法参考:http://blog.csdn.net/zeroso/article/details/70592179
4、更换低版本的Tomcat来规避这种问题。
5、在 conf/catalina.properties 中最后添加一行:
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
重启服务器后,解决问题。
官方指南地址:http://tomcat.apache.org/tomcat-8.5-doc/config/systemprops.html
官方说明:
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH
If this is true ‘%2F’ and ‘%5C’ will be permitted as path.delimiters.If not specified, the default value of false will be used.
SpringBoot Test及注解详解
Spring Test与JUnit等其他测试框架结合起来,提供了便捷高效的测试手段。而Spring Boot Test 是在Spring Test之上的再次封装,增加了切片测试,增强了mock能力。
整体上,Spring Boot Test支持的测试种类,大致可以分为如下三类:
功能测试过程中的几个关键要素及支撑方式如下:
增加spring-boot-starter-test依赖,使用@RunWith和@SpringBootTest注解,即可开始测试。
添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
一旦依赖了spring-boot-starter-test,下面这些类库将被一同依赖进去:
1. 单元测试
@RunWith(SpringRunner.class) @SpringBootTest public class SpringBootApplicationTests { @Autowired private UserService userService; @Test public void testAddUser() { User user = new User(); user.setName("john"); user.setAddress("earth"); userService.add(user); } }
@RunWith是Junit4提供的注解,将Spring和Junit链接了起来。假如使用Junit5,不再需要使用@ExtendWith注解,@SpringBootTest和其它@*Test默认已经包含了该注解。
@SpringBootTest替代了spring-test中的@ContextConfiguration注解,目的是加载ApplicationContext,启动spring容器。
使用@SpringBootTest时并没有像@ContextConfiguration一样显示指定locations或classes属性,原因在于@SpringBootTest注解会自动检索程序的配置文件,检索顺序是从当前包开始,逐级向上查找被@SpringBootApplication或@SpringBootConfiguration注解的类。
2. 功能测试
一般情况下,使用@SpringBootTest后,Spring将加载所有被管理的bean,基本等同于启动了整个服务,此时便可以开始功能测试。
由于web服务是最常见的服务,且我们对于web服务的测试有一些特殊的期望,所以@SpringBootTest注解中,给出了webEnvironment参数指定了web的environment,该参数的值一共有四个可选值:
注:如果当前服务的classpath中没有包含web相关的依赖,spring将启动一个非web的ApplicationContext,此时的webEnvironment就没有什么意义了。
3. 切片测试
所谓切片测试,官网文档称为 “slice” of your application,实际上是对一些特定组件的称呼。这里的slice并非单独的类(毕竟普通类只需要基于JUnit的单元测试即可),而是介于单元测试和集成测试中间的范围。
slice是指一些在特定环境下才能执行的模块,比如MVC中的Controller、JDBC数据库访问、Redis客户端等,这些模块大多脱离特定环境后不能独立运行,假如spring没有为此提供测试支持,开发者只能启动完整服务对这些模块进行测试,这在一些复杂的系统中非常不方便,所以spring为这些模块提供了测试支持,使开发者有能力单独对这些模块进行测试。
通过@*Test开启具体模块的测试支持,开启后spring仅加载相关的bean,无关内容不会被加载。
使用@WebMvcTest用来校验controllers是否正常工作的示例:
@RunWith(SpringRunner.class) @WebMvcTest(IndexController.class) public class SpringBootTest { @Autowired private MockMvc mvc; @Test public void testExample() throws Exception { //groupManager访问路径 //param传入参数 MvcResult result=mvc.perform(MockMvcRequestBuilders.post("/groupManager").param("pageNum","1").param("pageSize","10")).andReturn(); MockHttpServletResponse response = result.getResponse(); String content = response.getContentAsString(); List<JtInfoDto> jtInfoDtoList = GsonUtils.toObjects(content, new TypeToken<List<JtInfoDto>>() {}.getType()); for(JtInfoDto infoDto : jtInfoDtoList){ System.out.println(infoDto.getJtCode()); } } }
使用@WebMvcTest和MockMvc搭配使用,可以在不启动web容器的情况下,对Controller进行测试(注意:仅仅只是对controller进行简单的测试,如果Controller中依赖用@Autowired注入的service、dao等则不能这样测试)。
Spring为了避免的繁琐难懂的xml配置,引入大量annotation进行系统配置,确实减轻了配置工作量。由此,理解这些annotation变得尤为重要,一定程度上讲,对Spring Boot Test的使用,就是对其相关annotation的使用。
1. 按功能分类
从功能上讲,Spring Boot Test中的注解主要分如下几类:
@TestConfiguration等。提供一些测试相关的配置入口。@MockBean等。提供mock支持。@AutoConfigureJdbc等。以AutoConfigure开头的注解,具有加载测试支持功能的能力。(1) 配置类型的注解
@Component,在语义上用来指定某个Bean是专门用于测试的。该注解适用于测试代码和正式混合在一起时,不加载被该注解描述的Bean,使用不多。@TestComponent,它用于补充额外的Bean或覆盖已存在的Bean。在不修改正式代码的前提下,使配置更加灵活。@EnableAutoConfiguration,与ImportAutoConfiguration结合使用,以限制所加载的自动配置类。在不修改正式代码的前提下,提供了修改配置自动配置类的能力。@AutoConfigure*注解中用到的变量名称,例如在@AutoConfigureMockMvc中定义名为spring.test.mockmvc.webclient.enabled的变量。一般不使用。使用@SpringBootApplication启动测试或者生产代码,被@TestComponent描述的Bean会自动被排除掉。如果不是则需要向@SpringBootApplication添加TypeExcludeFilter。
(2) mock类型的注解
@MockBean和@SpyBean这两个注解,在mockito框架中本来已经存在,且功能基本相同。Spring Boot Test又定义一份重复的注解,目的在于使MockBean和SpyBean被ApplicationContext管理,从而方便使用。
MockBean和SpyBean功能非常相似,都能模拟方法的各种行为。不同之处在于MockBean是全新的对象,跟正式对象没有关系;而SpyBean与正式对象紧密联系,可以模拟正式对象的部分方法,没有被模拟的方法仍然可以运行正式代码。
(3) 自动配置类型的注解(@AutoConfigure*)
这些注解可以搭配@\*Test使用,用于开启在@\*Test中未自动配置的功能。例如@SpringBootTest和@AutoConfigureMockMvc组合后,就可以注入org.springframework.test.web.servlet.MockMvc。
自动配置类型有两种方式:
@SpringBootTest)时显示添加。@WebMvcTest注解时,隐式添加了@AutoConfigureCache、@AutoConfigureWebMvc、@AutoConfigureMockMvc。(4) 启动测试类型的注解(@*Test)
所有的@*Test注解都被@BootstrapWith注解,它们可以启动ApplicationContext,是测试的入口,所有的测试类必须声明一个@*Test注解。
除了@SpringBootTest之外的注解都是用来进行切面测试的,他们会默认导入一些自动配。
一般情况下,推荐使用@SpringBootTest而非其它切片测试的注解,简单有效。若某次改动仅涉及特定切片,可以考虑使用切片测试。
@SpringBootTest是这些注解中最常用的一个,其中包含的配置项如下:
webEnvironment详细说明:
2. 相互之间的搭配组合
package sample.test; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import sample.test.domain.VehicleIdentificationNumber; import sample.test.service.VehicleDetails; import sample.test.service.VehicleDetailsService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.test.context.junit4.SpringRunner; import static org.mockito.BDDMockito.given; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) @AutoConfigureTestDatabase public class SampleTestApplicationWebIntegrationTests { private static final VehicleIdentificationNumber VIN = new VehicleIdentificationNumber( "01234567890123456"); @Autowired private TestRestTemplate restTemplate; @MockBean private VehicleDetailsService vehicleDetailsService; @Before public void setup() { given(this.vehicleDetailsService.getVehicleDetails(VIN)) .willReturn(new VehicleDetails("Honda", "Civic")); } @Test public void test() { this.restTemplate.getForEntity("/{username}/vehicle", String.class, "sframework"); } }
其中@RunWith和@*Test必须存在,@AutoConfigure*可以同时配置任意多个,而配置类型的注解可以在需要时添加。
3. 相似注解的区别于联系
(1) @TestComment vs @Comment
@TestComponent是另一种@Component,在语义上用来指定某个Bean是专门用于测试的@TestComponent会被自动排除(2) @TestConfiguration vs @Configuration
@TestConfiguration是Spring Boot Boot Test提供的,@Configuration是Spring Framework提供的。@TestConfiguration实际上是也是一种@TestComponent,只是这个@TestComponent专门用来做配置用。@TestConfiguration和@Configuration不同,它不会阻止@SpringBootTest的查找机制,相当于是对既有配置的补充或覆盖。(3) @SpringBootTest vs @WebMvcTest(或@*Test)
转自:沉迷思考的鱼 http://ypk1226.com/2018/11/20/spring-boot/spring-boot-test-2/
junit4常用注解
这边就记录一些常用注解,当做学习方便。
@Before:初始化方法,在任何一个测试方法执行之前,必须执行的代码。对比 JUnit 3 ,和 setUp()方法具有相同的功能。在该注解的方法中,可以进行一些准备工作,比如初始化对象,打开网络连接等。
同时,该 Annotation(@Test) 还可以测试期望异常和超时时间,如 @Test(timeout=100),我们给测试函数设定一个执行时间,超过这个时间(100毫秒),他们就会被系统强行终止,并且系统还会向你汇报该函数结束的原因是因为超时,这样你就可以发现这些 bug 了。而且,它还可以测试期望的异常,例如,我们刚刚的那个空指针异常就可以这样:@Test(expected=NullPointerException.class)。
@Ignore:忽略的测试方法,标注的含义就是“某些方法尚未完成,咱不参与此次测试”;这样的话测试结果就会提示你有几个测试被忽略,而不是失败。一旦你完成了相应的函数,只需要把 @Ignore 注解删除即可,就可以进行正常测试了。当然,这个 @Ignore 注解对于像我这样有“强迫症”的人还是大有意义的。每当看到红色条(测试失败)的时候就会全身不舒服,感觉无法忍受(除非要测试的目的就是让它失败)。当然,对代码也是一样,无法忍受那些杂乱不堪的代码。
@BeforeClass:针对所有测试,也就是整个测试类中,在所有测试方法执行前,都会先执行由它注解的方法,而且只执行一次。当然,需要注意的是,修饰符必须是 public static void xxxx ;此 Annotation 是 JUnit 4 新增的功能。
@AfterClass:针对所有测试,也就是整个测试类中,在所有测试方法都执行完之后,才会执行由它注解的方法,而且只执行一次。当然,需要注意的是,修饰符也必须是 public static void xxxx ;此 Annotation 也是 JUnit 4 新增的功能,与 @BeforeClass 是一对。
ORM 相关概念
ORM :对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。
JDBC (Java Database Connectivity) API,即Java数据库编程接口,是一组标准的Java语言中的接口和类,使用这些接口和类,Java客户端程序可以访问各种不同类型的数据库。
常见的JDBC代码,简单的select语句也需要冗长的出错处理,并且每个函数都不断地重复同样的代码。
Spring Framework的JdbcTemplate正是为了减少上述繁琐的代码而设计出来的。它是对JDBC的一种封装,抽象我们常用的一些方法。
JPA 全称为Java Persistence API ,Java持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口。JPA吸取了目前Java持久化技术的优点,旨在规范、简化Java对象的持久化工作。使用JPA持久化对象,并不是依赖于某一个ORM框架。
JPA规范本质上就是一种ORM规范,注意不是ORM框架——因为JPA并未提供ORM实现,它只是制订了一些规范,提供了一些编程的API接口,但具体实现则由服务厂商来提供实现,JBoss应用服务器底层就以Hibernate作为JPA的实现。
虽然ORM框架都实现了JPA规范,但是在不同ORM框架之间切换是需要编写的代码有一些差异,而通过使用Spring Data Jpa能够方便大家在不同的ORM框架中间进行切换而不要更改代码。并且Spring Data Jpa对Repository层封装的很好,可以省去不少的麻烦。