实现什么接口的对象会自动spring配置接口实现类数据库连接并准备查询语句

基于Spring Boot为关系型数据库构建REST访问接口-spring-data-rest,java,spring,springboot,spring-data 相关文章-天码营
基于Spring Boot为关系型数据库构建REST访问接口
本课将构建一个基于Spring Boot的应用,它提供对关系型数据库的REST访问接口——通过接口可以对存储在关系型数据库中的User对象进行增删改查操作。应用中我们使用来创建访问接口。 提示Spring Data REST不仅支持关系型数据库,还能够支持各类NoSQL数据库——Neo4j, Gemfile和MongoDB。它们不在本课的范围之内,可以参考项目。环境准备一个称手的文本编辑器(例如Vim、Emacs、Sublime Text)或者IDE(Eclipse、Idea Intellij)Java环境(JDK 1.7或以上版本)构建工具Gradle 2.3初始化项目目录首先创建一个项目目录,在目录中创建一个Gradle项目描述文件build.gradle:buildscript {
repositories {
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.5.RELEASE")
apply plugin: 'java'
apply plugin: 'spring-boot'
baseName = 'spring-data-rest-demo'
version = '1.0.0-SNAPSHOT'
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
dependencies {
compile("org.springframework.boot:spring-boot-starter-data-rest")
compile("org.springframework.boot:spring-boot-starter-data-jpa")
compile("com.h2database:h2")
在这个文件中,使用到了来帮助我们简化一些配置工作:提供了Spring Boot框架的依赖定义,在dependencies标签中直接使用它们即可(不需要声明版本号)将应用的代码及所有的依赖打包成一个单独的jar文件自动搜索main函数并作为jar文件的启动函数,jar文件是一个独立可执行的文件领域对象在本课中,领域对象是User——它包含两个字段——email和name,依据Gradle的约定,该对象应该位于项目源码文件夹src/main/java下,同时我们将它放在tmy这个package中:src/main/java/tmy/User.java@Entity
public class User {
@GeneratedValue
//构造方法、Getter/Setter方法略
@Entity注解表明User是一个JPA实体。每一个User对象有一个唯一的主键标识符id,它是Spring Data JPA自动自增生成的,无需手动处理它。上述领域对象定义了数据存储的格式,Spring Data JPA将其字段映射到关系型数据库表中的列名,假设现在有一个User对象:User user = new User(1L, "", "Test Name");
它在关系型数据库(这里我们用到的是类路径上默认的内存数据库H2Database)中的存储结构是:idemailname1Test NameRepository有了领域对象User后,需要定义一个能对其进行增删改查操作的Repository接口:src/main/java/tmy/UserRepository.javaimport org.springframework.data.repository.PagingAndSortingR
public interface UserRepository extends PagingAndSortingRepository&User, Long& {
这个接口中我们没有定义任何操作方法,而是直接继承于PagingAndSortingRepository接口,该接口中已经包含常用的操作方法:findOne(Long id)findAll()save(User user)在应用启动时,Spring会自动创建这个接口的实现。以调用findOne(1L)为例,实际上Spring Data JPA帮我们生成了一个这样的sql查询:select * from users where id = 1;
并且将查询结果集按字段名映射为一个User对象并返回。这也就是ORM(Object Relation Mapper)框架帮助我们简化数据访问层开发的基本方法于思路。同时Spring Data Rest也会在Spring MVC中绑定响应的HTTP路由方法,并创建User对象的RESTful访问端点/users:GET /users User列表信息(数据来源于UserRepository对应的关系型数据库,下同)POST /users 创建一个User对象GET /users/{id} 获取单个User对象PUT /users/{id} 更新单个User对象DELETE /users/{id} 删除单个User对象这也就是对于User资源最基本的增删改查以及列表的RESTful访问接口,在使用Spring Data Rest项目后,我们不再需要自己动手编写这些@Controller,对于大部分资源来说,这些代码都是大同小异的,Spring Data Rest正是把这些通用的代码抽取出来,减轻了我们的编码工作量。运行应用运行基于Spring Boot的应用非常简单,无需将代码及依赖打成传统的WAR包放置在应用服务器(Jetty, Tomcat)中,Spring Boot插件在打包的过程中,内嵌了一个应用服务器(默认是tomcat)。所以应用本身是自启动的,我们无需将其部署到外部的应用服务器中:src/main/java/hello/Application.java
import org.springframework.boot.SpringA
import org.springframework.boot.autoconfigure.SpringBootA
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
@SpringBootApplication是Spring Boot提供的注解,他相当于加上如下注解:@Configuration,表明Application是一个Spring的配置对象,用于配置Spring应用上下文。@EnableAutoConfiguration,Spring Boot会根据类路径(classpath)以及一些属性值来自动完成一些配置行为,例如:开发基于Spring MVC的Web应用,需要在配置中加上@EnableWebMvc直接来激活一些默认的Web配置,一旦Spring Boot发现运行时类路径上包含了 spring-webmvc 依赖,它会自动的完成一个Web应用的基本配置——例如配置DispatcherServlet等等。@ComponenScan告知Spring应用从什么位置去发现Spring构件(@Component, @Service, @Configuration)等等完成上述配置后,运行应用有两种方法:在IDE中直接运行main方法通过Gradle打包应用:gradle build,运行:java -jar build/libs/${appname}-{version}.jar使用REST接口创建一个对象应用运行后,数据库中并不存在任何数据,可以通过POST /users接口来创建一个User:$ curl -X POST -H "Content-Type:application/json" -d '{
"email" : "",
"name" : "Ruici" }' http://localhost:8080/users
HTTP/1.1 201 Created
Server: Apache-Coyote/1.1
Location: http://localhost:8080/users/1
Content-Length: 0
Date: Mon, 20 Jul :10 GMT
curl命令的参数意义如下:-X 参数指定请求的方法类型——GET, POST, PUT, DELETE-H 参数指定请求的Header,这里因为请求body的内容是json对象,所以必须设置Content-Type:application/json-d 指定请求体内容如果Windows下使用curl不方便,推荐使用Chrome的插件——图形化界面工具。如果创建成功,服务器会返回201 Created状态码,并在Location头中标明已创建的资源的URL。获取所有对象$ curl http://localhost:8080/users
"_links" : {
"self" : {
"href" : "http://localhost:8080/users{?page,size,sort}",
"templated" : true
"_embedded" : {
"users" : [ {
"email" : "",
"name" : "Ruici",
"_links" : {
"self" : {
"href" : "http://localhost:8080/users/1"
"page" : {
"size" : 20,
"totalElements" : 1,
"totalPages" : 1,
"number" : 0
获取单个对象$ curl http://localhost:8080/users/1
"email" : "",
"name" : "Ruici",
"_links" : {
"self" : {
"href" : "http://localhost:8080/users/1"
嵌套对象在大多数情况下,领域对象并不是一组简单的对象(例如上例中的User,它只包含两个数据字段email和name),其中最常见的一种情况是组合,例如:@Entity
public class Address {
@GeneratedValue
//构造方法和Getter/Setter方法略
User类中包含了private A字段用于存储用户的地址。在关系型数据库中通常是再建一张表来进行关联。Address表:idcitystreet1BeijingYiheyuan RoadUser表:idemailnameaddressId1Test Name1addressId字段表示关联表Address中id为1的记录,SQL查询语句可以这样写:select u.id as userId, email, name, a.id as addressId, city, street
from address a inner join user u on a.id =
u.addressId where u.id = 1
Spring Data JPA基于ORM映射原理,可以这样定义关联关系:@Entity
public class User {
@GeneratedValue
@OneToOne(cascade = CascadeType.ALL)
//构造方法和Getter/Setter方法略
添加一个User对象的代码如下:@Autowired
private UserRepository userR
public void run(String... args) throws Exception {
User user = new User("", "Hello World");
user.setAddress(new Address("Beijing", "Yiheyuan Road 5"));
userRepository.save(user);
也就是说Spring Data JPA会自动的将User对象中嵌套的组合对象Address持久化到相应的关系型数据库表中。对于查询也是如此。经过以上处理,运行应用后执行curl ,可以看到user字段中已经包含了组合对象address。延伸阅读
本文由创作,转载需署名作者且注明文章出处
要获取本文的参考代码,请访问:
那么问题来了,发布的服务查询出来的JSON不带ID。怎么破?或者出于什么考虑没有ID?
这根关系型数据库有什么关系? 参考代码能提供吗?
学习HTML、CSS、Bootstrap,从零开始!以 天码营博客 为例,创建完整的、响应式的、现代...
Spring MVC实战入门训练,以一个博客系统为例,将Spring MVC的核心知识融入到实战当中...
通过实战学习Spring Data JPA的核心概念和使用方法,如何定义查询方法、实体对象和实体对象...JDBC常见面试题集锦(一)
什么是JDBC,在什么时候会用到它?
JDBC的全称是 DataBase Connection,也就是Java连接,我们可以用它来操作关系型数据库。JDBC接口及相关类在java.sql包和javax.sql包里。我们可以用它来连接数据库,执行SQL查询,存储过程,并处理返回的结果。
JDBC接口让Java程序和JDBC驱动实现了松耦合,使得切换不同的数据库变得更加简单。
有哪些不同类型的JDBC驱动?
有四类JDBC驱动。和数据库进行交互的Java程序分成两个部分,一部分是JDBC的API,实际工作的驱动则是另一部分。
A JDBC-ODBC Bridge plus ODBC Driver(类型1):它使用ODBC驱动连接数据库。需要安装ODBC以便连接数据库,正因为这样,这种方式现在已经基本淘汰了。
B Native API partly Java technology-enabled driver(类型2):这种驱动把JDBC调用适配成数据库的本地接口的调用。
C Pure Java Driver for Database Middleware(类型3):这个驱动把JDBC调用转发给中间件服务器,由它去和不同的数据库进行连接。用这种类型的驱动需要部署中间件服务器。这种方式增加了额外的网络调用,导致性能变差,因此很少使用。
D Direct-to-Database Pure Java Driver(类型4):这个驱动把JDBC转化成数据库使用的网络协议。这种方案最简单,也适合通过网络连接数据库。不过使用这种方式的话,需要根据不同数据库选用特定的驱动程序,比如OJDBC是开发的Oracle数据库的驱动,而MySQL Connector/J是MySQL数据库的驱动。
JDBC是如何实现Java程序和JDBC驱动的松耦合的?
JDBC API使用Java的反射机制来实现Java程序和JDBC驱动的松耦合。随便看一个简单的JDBC示例,你会发现所有操作都是通过JDBC接口完成的,而驱动只有在通过Class.forName反射机制来加载的时候才会出现。
我觉得这是Java核心库里反射机制的最佳实践之一,它使得应用程序和驱动程序之间进行了隔离,让迁移数据库的工作变得更简单。在这里可以看到更多JDBC的使用示例。
什么是JDBC连接,在Java中如何创建一个JDBC连接?
JDBC连接是和数据库服务器建立的一个会话。你可以想像成是一个和数据库的Socket连接。
创建JDBC连接很简单,只需要两步:
A. 注册并加载驱动:使用Class.forName(),驱动类就会注册到DriverManager里面并加载到内存里。
B. 用DriverManager获取连接对象:调用DriverManager.getConnnection()方法并传入数据库连接的URL,用户名及密码,就能获取到连接对象。
{% highlight java%}
Connection con =
// load the Driver Class
Class.forName(&com..jdbc.Driver&);
// create the connection now
con = DriverManager.getConnection(&jdbc:mysql://localhost:3306/UserDB&,
&pankaj123&);
}catch (SQLException e) {
System.out.println(&Check database is UP and configs are correct&);
e.printStackTrace();
}catch (ClassNotFoundException e) {
System.out.println(&Please include JDBC MySQL jar in classpath&);
e.printStackTrace();
JDBC的DriverManager是用来做什么的?
JDBC的DriverManager是一个工厂类,我们通过它来创建数据库连接。当JDBC的Driver类被加载进来时,它会自己注册到DriverManager类里面,你可以看下JDBC Driver类的来了解一下。
然后我们会把数据库配置信息传成DriverManager.getConnection()方法,DriverManager会使用注册到它里面的驱动来获取数据库连接,并返回给调用的程序。
在Java程序中,如何获取数据库服务器的相关信息?
使用DatabaseMetaData可以获取到服务器的信息。当和数据库的连接成功建立了之后,可以通过调用getMetaData()方法来获取数据库的元信息。DatabaseMetaData里面有很多方法,通过它们可以获取到数据库的产品名称,版本号,配置信息等。
DatabaseMetaData metaData = con.getMetaData();
String dbProduct = metaData.getDatabaseProductName();
JDBC的Statement是什么?
Statement是JDBC中用来执行数据库SQL查询语句的接口。通过调用连接对象的getStatement()方法我们可以生成一个Statement对象。我们可以通过调用它的execute(),executeQuery(),executeUpdate()方法来执行静态SQL查询。
由于SQL语句是程序中传入的,如果没有对用户输入进行校验的话可能会引起SQL注入的问题,如果想了解更多关于SQL注入的,可以看下这里。
默认情况下,一个Statement同时只能打开一个ResultSet。如果想操作多个ResultSet对象的话,需要创建多个Statement。Statement接口的所有execute方法开始执行时都默认会关闭当前打开的ResultSet。
execute,executeQuery,executeUpdate的区别是什么?
Statement的execute(String query)方法用来执行任意的SQL查询,如果查询的结果是一个ResultSet,这个方法就返回true。如果结果不是ResultSet,比如insert或者update查询,它就会返回false。我们可以通过它的getResultSet方法来获取ResultSet,或者通过getUpdateCount()方法来获取更新的记录条数。
Statement的executeQuery(String query)接口用来执行select查询,并且返回ResultSet。即使查询不到记录返回的ResultSet也不会为null。我们通常使用executeQuery来执行查询语句,这样的话如果传进来的是insert或者update语句的话,它会抛出错误信息为 &executeQuery method can not be used for update&的java.util.SQLException。
Statement的executeUpdate(String query)方法用来执行insert或者update/delete(DML)语句,或者 什么也不返回DDL语句。返回值是int类型,如果是DML语句的话,它就是更新的条数,如果是DDL的话,就返回0。
只有当你不确定是什么语句的时候才应该使用execute()方法,否则应该使用executeQuery或者executeUpdate方法。
JDBC的PreparedStatement是什么?
PreparedStatement对象代表的是一个预编译的SQL语句。用它提供的setter方法可以传入查询的变量。
由于PreparedStatement是预编译的,通过它可以将对应的SQL语句高效的执行多次。由于PreparedStatement自动对特殊字符转义,避免了SQL注入攻击,因此应当尽量的使用它。
PreparedStatement中如何注入NULL值?
可以使用它的setNull方法来把null值绑定到指定的变量上。setNull方法需要传入参数的索引以及SQL字段的类型,像这样:
ps.setNull(10, java.sql.Types.INTEGER);.
Statement中的getGeneratedKeys方法有什么用?
有的时候表会生成主键,这时候就可以用Statement的getGeneratedKeys()方法来获取这个自动生成的主键的值了。
相对于Statement,PreparedStatement的优点是什么?
它和Statement相比优点在于:
PreparedStatement有助于防止SQL注入,因为它会自动对特殊字符转义。
PreparedStatement可以用来进行动态查询。
PreparedStatement执行更快。尤其当你重用它或者使用它的拼量查询接口执行多条语句时。
使用PreparedStatement的setter方法更容易写出面向对象的代码,而Statement的话,我们得拼接字符串来生成查询语句。如果参数太多了,字符串拼接看起来会非常丑陋并且容易出错。
PreparedStatement的缺点是什么,怎么解决这个问题?
PreparedStatement的一个缺点是,我们不能直接用它来执行in条件语句;需要执行IN条件语句的话,下面有一些解决方案:
分别进行单条查询&&这样做性能很差,不推荐。
使用存储过程&&这取决于数据库的实现,不是所有数据库都支持。
动态生成PreparedStatement&&这是个好办法,但是不能享受PreparedStatement的缓存带来的好处了。
在PreparedStatement查询中使用NULL值&&如果你知道输入变量的最大个数的话,这是个不错的办法,扩展一下还可以支持无限参数。
关于这个问题更详细的分析可以看下这篇文章。
JDBC的ResultSet是什么?
在查询数据库后会返回一个ResultSet,它就像是查询结果集的一张数据表。
ResultSet对象维护了一个游标,指向当前的数据行。开始的时候这个游标指向的是第一行。如果调用了ResultSet的next()方法游标会下移一行,如果没有更多的数据了,next()方法会返回false。可以在for循环中用它来遍历数据集。
默认的ResultSet是不能更新的,游标也只能往下移。也就是说你只能从第一行到最后一行遍历一遍。不过也可以创建可以回滚或者可更新的ResultSet,像下面这样。
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
当生成ResultSet的Statement对象要关闭或者重新执行或是获取下一个ResultSet的时候,ResultSet对象也会自动关闭。
可以通过ResultSet的getter方法,传入列名或者从1开始的序号来获取列数据。
有哪些不同的ResultSet?
根据创建Statement时输入参数的不同,会对应不同类型的ResultSet。如果你看下Connection的方法,你会发现createStatement和prepareStatement方法重载了,以支持不同的ResultSet和并发类型。
一共有三种ResultSet对象。
ResultSet.TYPE_FORWARD_ONLY:这是默认的类型,它的游标只能往下移。
ResultSet.TYPE_SCROLL_INSENSITIVE:游标可以上下移动,一旦它创建后,数据库里的数据再发生修改,对它来说是透明的。
ResultSet.TYPE_SCROLL_SENSITIVE:游标可以上下移动,如果生成后数据库还发生了修改操作,它是能够感知到的。
ResultSet有两种并发类型。
ResultSet.CONCUR_READ_ONLY:ResultSet是只读的,这是默认类型。
ResultSet.CONCUR_UPDATABLE:我们可以使用ResultSet的更新方法来更新里面的数据。
Statement中的setFetchSize和setMaxRows方法有什么用处?
setMaxRows可以用来限制返回的数据集的行数。当然通过SQL语句也可以实现这个功能。比如在MySQL中我们可以用LIMIT条件来设置返回结果的最大行数。
setFetchSize理解起来就有点费劲了,因为你得知道Statement和ResultSet是怎么工作的。当数据库在执行一条查询语句时,查询到的数据是在数据库的缓存中维护的。ResultSet其实引用的是数据库中缓存的结果。
假设我们有一条查询返回了100行数据,我们把fetchSize设置成了10,那么数据库驱动每次只会取10条数据,也就是说得取10次。当每条数据需要处理的时间比较长的时候并且返回数据又非常多的时候,这个可选的参数就变得非常有用了。
我们可以通过Statement来设置fetchSize参数,不过它会被ResultSet对象设置进来的值所覆盖掉。
如何使用JDBC接口来调用存储过程?
存储过程就是数据库编译好的一组SQL语句,可以通过JDBC接口来进行调用。我们可以通过JDBC的CallableStatement接口来在数据库中执行存储过程。初始化CallableStatement的语法是这样的:
CallableStatement stmt = con.prepareCall(&{call insertEmployee(?,?,?,?,?,?)}&);
stmt.setInt(1, id);
stmt.setString(2, name);
stmt.setString(3, role);
stmt.setString(4, city);
stmt.setString(5, country);
//register the OUT parameter before calling the stored procedure
stmt.registerOutParameter(6, java.sql.Types.VARCHAR);
stmt.executeUpdate();
我们得在执行CallableStatement之前注册OUT参数。关于这个更详细的资料可以看这里。
JDBC的批处理是什么,有什么好处?
有时候类似的查询我们需要执行很多遍,比如从CSV文件中加载数据到关系型数据库的表里。我们也知道,执行查询可以用Statement或者PreparedStatement。除此之外,JDBC还提供了批处理的特性,有了它,我们可以在一次数据库调用中执行多条查询语句。
JDBC通过Statement和PreparedStatement中的addBatch和executeBatch方法来支持批处理。
批处理比一条条语句执行的速度要快得多,因为它需要很少的数据库调用,想进一步了解请点这里。
JDBC的事务管理是什么,为什么需要它?
默认情况下,我们创建的数据库连接,是工作在自动提交的模式下的。这意味着只要我们执行完一条查询语句,就会自动进行提交。因此我们的每条查询,实际上都是一个事务,如果我们执行的是DML或者DDL,每条语句完成的时候,数据库就已经完成修改了。
有的时候我们希望由一组SQL查询组成一个事务,如果它们都执行OK我们再进行提交,如果中途出现异常了,我们可以进行回滚。
JDBC接口提供了一个setAutoCommit(boolean flag)方法,我们可以用它来关闭连接自动提交的特性。我们应该在需要手动提交时才关闭这个特性,不然的话事务不会自动提交,每次都得手动提交。数据库通过表锁来管理事务,这个操作非常消耗资源。因此我们应当完成操作后尽快的提交事务。在这里有更多关于事务的示例程序。
如何回滚事务?
通过Connection对象的rollback方法可以回滚事务。它会回滚这次事务中的所有修改操作,并释放当前连接所持有的数据库锁。
译注:先到这吧,后面还有20题,明天继续。都比较基础,不过有些同学可能长期使用ORM框架,就当复习一下了,万一面试问到呢~spring&mvc&通过配置完成数据库的连接_Qinrb_新浪博客
spring&mvc&通过配置完成数据库的连接
在通过数据源与数据库建立连接之后,我们就要实际访问数据库了,而最基本的方式就是使用JDBC,现在我们就来看一看Spring如何让使用简单的JDBC更加简便。&Spring在第三方依赖包中包含了两个数据源的实现类包,其一是Apache的DBCP,其二是
C3P0。可以在Spring配置文件中利用这两者中任何一个配置数据源。
DBCP数据源&&&&&
DBCP 类包位于 /lib/jakarta-commons/commons-dbcp.jar,DBCP是一个依赖 Jakarta
commons- pool对象池机制的数据库连接池,所以在类路径下还必须包括/lib/jakarta-
commons/commons-pool.jar。下面是使 用DBCP配置MySql数据源的配置片断:
代码&&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&bean&&&
BasicDataSource提供了close()方法关闭数据源,所以必须设定destroy-method=”close”属性,
以便Spring容器关闭时,数据源能够正常关闭。除以上必须的数据源属性外,还有一些常用的属性:&&&&&
defaultAutoCommit:设置从数据源中返回的连接是否采用自动提交机制,默认值为
true;&&&&&
defaultReadOnly:设置数据源是否仅能执行只读操作, 默认值为
false;&&&&&
maxActive:最大连接数据库连接数,设置为0时,表示没有限制;&&&&&
maxIdle:最大等待连接中的数量,设置为0时,表示没有限制;&&&&&
maxWait:最大等待秒数,单位为毫秒,
超过时间会报出错误信息;&&&&&
validationQuery:用于验证连接是否成功的查询SQL语句,SQL语句必须至少要返回一行数据,
如你可以简单地设置为:“select count(*) from
user”;&&&&&
removeAbandoned:是否自我中断,默认是 false
removeAbandonedTimeout:几秒后数据连接会自动断开,在removeAbandoned为true,提供该值;&&&&&
logAbandoned:是否记录中断事件, 默认为 false;
C3P0数据源&&&&&
是一个开放源代码的JDBC数据源实现项目,它在lib目录中与Hibernate一起发布,实现了JDBC3和JDBC2扩展规范说明的
Connection 和Statement
池。C3P0类包位于/lib/c3p0/c3p0-0.9.0.4.jar。下面是使用C3P0配置一 个
oracle数据源:
代码&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&bean&&&
ComboPooledDataSource和BasicDataSource一样提供了一个用于关闭数据源的close()方法,这样我们就可以保证Spring容器关闭时数据源能够成功释放。&&&&&
C3P0拥有比DBCP更丰富的配置属性,通过这些属性,可以对数据源进行各种有效的控制:&&&&&
acquireIncrement:当连接池中的连接用完时,C3P0一次性创建新连接的数目;&&&&&
acquireRetryAttempts:定义在从数据库获取新连接失败后重复尝试获取的次数,默认为30;&&&&&
acquireRetryDelay:两次连接中间隔时间,单位毫秒,默认为1000;&&&&&
autoCommitOnClose:连接关闭时默认将所有未提交的操作回滚。默认为false;&&&&&
automaticTestTable:
C3P0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数,那么属性preferredTestQuery将被忽略。
不能在这张Test表上进行任何操作,它将中为C3P0测试所用,默认为null;&&&&&
breakAfterAcquireFailure:
获取连接失败将会引起所有等待获取连接的线程抛出异常。但是数据源仍有效保留,并在下次调&&&
用getConnection()的时候继续尝试获取连
接。如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。默认为
false;&&&&&
checkoutTimeout:当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒,默认为0;&&&&&
connectionTesterClassName:
通过实现ConnectionTester或QueryConnectionTester的类来测试连接,类名需设置为全限定名。默认为
com.mchange.v2.C3P0.impl.DefaultConnectionTester;&&&&&
idleConnectionTestPeriod:隔多少秒检查所有连接池中的空闲连接,默认为0表示不检查;&&&&&
initialPoolSize:初始化时创建的连接数,应在minPoolSize与maxPoolSize之间取值。默认为3;&&&&&
maxIdleTime:最大空闲时间,超过空闲时间的连接将被丢弃。为0或负数则永不丢弃。默认为0;&&&&&
maxPoolSize:连接池中保留的最大连接数。默认为15;&&&&&
maxStatements:
JDBC的标准参数,用以控制数据源内加载的PreparedStatement数量。但由于预缓存的Statement属
于单个Connection 而不是整个连接池。所以设置这个参数需要考虑到多方面的因素,如果maxStatements与
maxStatementsPerConnection
均为0,则缓存被关闭。默认为0;&&&&&
maxStatementsPerConnection:连接池内单个连接所拥有的最大缓存Statement数。默认为0;&&&&&
numHelperThreads:C3P0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能,通过多线程实现多个操作同时被执行。默认为3;&&&&&
preferredTestQuery:定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个参数能显著提高测试速度。测试的表必须在初始数据源的时候就存在。默认为null;&&&&&
propertyCycle:
用户修改系统配置参数执行前最多等待的秒数。默认为300;&&&&&
testConnectionOnCheckout:
因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的时候都 将校验其有效性。建议使用
idleConnectionTestPeriod或automaticTestTable&等方法来提升连接测试的性能。默认为false;&&&&&
testConnectionOnCheckin:如果设为true那么在取得连接的同时将校验连接的有效性。默认为false。
读配置文件的方式引用属性:
&&&&&&&&&&&
&&&&&&&bean&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&bean&&&&
在jdbc.properties属性文件中定义属性值:&&&&&
jdbc.driverClassName=
com.mysql.jdbc.Driver&&&&&
jdbc:mysql://localhost:3309/sampledb&&&&&
jdbc.username=root&&&&&
jdbc.password=1234&&&&&
提示 经常有开发者在${xxx}的前后不小心键入一些空格,这些空格字符将和变量合并后作为属性的值。如:
的属性配置项,在前后都有空格,被解析后,username的值为“ 1234
”,这将造成最终的错误,因此需要特别小心。
获取JNDI数据源&&&&&
如果应用配置在高性能的应用服务器(如WebLogic或Websphere等)上,我们可能更希望使用应用服务器本身提供的数据源。应用服务器的数据源
使用JNDI开放调用者使用,Spring为此专门提供引用JNDI资源的JndiObjectFactoryBean类。下面是一个简单的配置:
代码&&&&&&&&&&&
&&&&&&&bean&&&
通过jndiName指定引用的JNDI数据源名称。&&&&&
2.0为获取J2EE资源提供了一个jee命名空间,通过jee命名空间,可以有效地简化J2EE资源的引用。下面是使用jee命名空间引用JNDI数据源的配置:
代码http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-2.0.xsd
"&&&&&&&&&&&&&&&
Spring的数据源实现类&&&&&
Spring 本身也提供了一个简单的数据源实现类DriverManagerDataSource ,它位于
org.springframework.jdbc.datasource包中。这个类实现了javax.sql.DataSource接口,但
有提供池化连接的机制,每次调用getConnection()获取新连接时,只是简单地创建一个新的连接。因此,这个数据源类比较适合在单元测试
单的独立应用中使用,因为它不需要额外的依赖类。&&&&&&
下面,我们来看一下DriverManagerDataSource的简单使用:当然,我们也可以通过配置的方式直接使用DriverManagerDataSource。
java 代码DriverManagerDataSource ds = new
DriverManagerDataSource
();&&&&&&&ds.setDriverClassName("com.mysql.jdbc.Driver");&&&&&&&ds.setUrl("jdbc:mysql://localhost:3309/sampledb");&&&&&&&ds.setUsername("root");&&&&&&&ds.setPassword("1234");&&&&&&&Connection
actualCon =
ds.getConnection();&&
不管采用何种持久化技术,都需要定义数据源。Spring附带了两个数据源的实现类包,你可以自行选择进行定义。在实际部署时,我们可能会直接采用应用服
务器本身提供的数据源,这时,则可以通过JndiObjectFactoryBean或jee命名空间引用JNDI中的数据源。
DBCP与C3PO配置的区别:
&&&&&&&&&&&
oracle.jdbc.driver.OracleDrivervalue&&&&&&&&
property&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
jdbc:oracle:thin:@10.10.10.6:1521:DataBaseNamevalue&&&&&&&&&
property&&&&&&&&
&&&&&&&&&&&
testAdminvalue&&&&&&&&
property&&&&&&&&
&&&&&&&&&&&
123456value&&&&&&&&
property&&&&bean&&&
代码&&&&&&&
&&&&&&&&&&&
oracle.jdbc.driver.OracleDrivervalue&&&&&&&&
property&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
jdbc:oracle:thin:@10.10.10.6:1521:DataBaseNamevalue&&&&&&&&&
property&&&&&&&&
&&&&&&&&&&&
testAdminvalue&&&&&&&&
property&&&&&&&&
&&&&&&&&&&&
123456value&&&&&&&&
property&&&&bean&
博客等级:
博客积分:0
博客访问:4,628
关注人气:0
荣誉徽章:

我要回帖

更多关于 数据库连接对象 的文章

 

随机推荐