VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

JDBC

Vastbase数据库通过提供JDBC驱动为使用JAVA语言的应用程序提供访问Vastbase的接口。

Vastbase JDBC版本

如果要使用Vastbase JDBC驱动访问Vastbase, 建议使用对应版本的Vastbase JDBC驱动。驱动名称:vastbase-$version.jar,例如vastbase-2.2.jar。下文中统称为vastbase.jar

Vastbase JDBC与JDK的兼容性

Vastbase JDBC驱动兼容JDK1.8及以上版本。

Vastbase JDBC主要类与接口

Vastbase JDBC 驱动由具有建立和管理与Vastbase 数据库连接、执行SQL 语句和对结果集进行储存管理的若干功能类组成。

  • Driver类(org.postgresql.Driver)

    当注册驱动的时候或配置软件以使用Vastbase JDBC驱动的时候,应该使用这个类名。

    示例:

    Class.forName("org.postgresql.Driver");
    
  • DriverManager 类(java.sql.DriverManager)

    跟踪可用的驱动程序,在数据库与相应的驱动程序之间建立连接。在应用服务器外使用JDBC时,DriverManager 类管理连接的确立。要告诉DriverManager 应该与哪个JDBC驱动进行连接,最简单的方法就是使用实现了接口java.sql.Driver的类的Class.forName()方法。在Vastbase JDBC驱动中,这个类的名字叫做org.postgresql.Driver。用这种方法,就可以在连接一个数据库时使用一个外部配置文件来给驱动提供类名和驱动参数。

  • Connection接口(org.postgresql.PGConnection)

    与特定数据库的连接(会话)。在连接上下文中执行SQL 语句并返回结果。

    示例:

    Connection con=DriverManager.getConnection("jdbc:postgresql://host:port/dbname ", "user","password");
    
  • Statement接口(org.postgresql.PGStatement)

    用于执行SQL语句并返回结果。

  • ResultSet接口(org.postgresql.PGResultSetMetaData)

    存储执行SQL语句产生的结果集。示例:

    Statement st = con.createStatement();
    ResultSet rs = st.executeQuery("select c_custkey from customer");
    

设置JDBC驱动

设置类路径

要使用驱动,必须将驱动jar包含在类路径里,可以将jar包路径添加到 CLASSPATH 环境变量中,或者使用 java 命令行标记的方式将驱动jar包引入.

比如,有一个使用 Vastbase JDBC驱动的应用安装在/usr/local/lib/myapp.jar,而 Vastbase JDBC驱动安装在/usr/local/vastbase/share/java/vastbase.jar.可以用以下方式运行应用∶

export CLASSPATH=/usr/local/lib/MyApp.jar:/usr/local/vastbase/share/java/vastbase.jar:.
java MyApp;

使用maven私服方式进行配置

将本地jar包上传至远程私服仓库,使用maven私服方式进行配置:

1.确认远程仓库的目录位置,以及用户名、密码和仓库id

2.使用mvn -deploy命令上传jar包到远程仓库

mvn deploy:deploy-file -Dmaven.test.skip=true 
-DgroupId=cn.com.vastdata
-DartifactId=vastbase-jdbc
-Dversion=1.0.0 
-Dpackaging=jar 
-Dfile=D:/temp/vastbase-jdbc.jar 
-Durl=http://x.x.x.x:xxxx/repository/releases/
-DrepositoryId=nexus-releases

3.在maven项目中的pom.xml文件中引入

<dependency>
    <groupId>cn.com.vastdata</groupId>
    <artifactId>vastbase-jdbc</artifactId>
    <version>1.0.0</version>
</dependency>

为JDBC准备数据库

因为java只支持使用TCP/IP连接,所以Vastbase必须配置为可接受TCP/IP连接。可以通过修改listen addresses来进行配置。同样,也需要配置主机认证文件,保证客户端程序可以访问数据库。

使用JDBC连接数据库

导入

任何使用JDBC的程序都需要导入java.sql包:

import java.sql.*

加载驱动

在试图与数据库建立连接之前,首先需要加载驱动,加载驱动有两种方法:

  • 在代码中,用Class.forName(“org.postgresql.Driver”)方法显示加载驱动;

  • 在JVM启动时作为参数传递,比如:java -Djdbc.drivers=org.postgresql.Driver

连接数据库

URL格式

使用Vastbase JDBC驱动访问Vastbase 的URL格式如下:

  • jdbc:postgresql://host:port/database

  • jdbc:postgresql://host:port/

  • jdbc:postgresql://host/database

  • jdbc:postgresql://host/

  • jdbc:postgresql:/

URL中各参数的含义如下:

  • host

    服务端的主机名,默认为localhost,如果要指定IPV6的地址,必须用方括号括起主机参数,例如:jdbc:postgresql://[::1]:5432/vastbase.

  • port

    服务端监听的端口,默认为5432.

  • database

    数据库名称,默认连接的数据库是与用户同名的数据库。比如连接用户为vuser,如果不指定database参数,则默认连接到vuser这个数据库。

获取JDBC连接

使用DriverManager.getConnection()获取连接:

Connection connection = DriverManager.getConnection(url, username,password);
关闭JDBC连接

关闭连接时调用Connection的close()方法即可:

Connection connection = DriverManager.getConnection(url, username,password);
connection.close();

连接参数

名称 类型 定义
user String 连接数据库的用户
password String 数据库用户的密码
sendBufferSize int 在连接流上设置SO_SNDBUF
recvBufferSize int 在连接流上设置SO_RCVBUF
tcpKeepAlive boolean 启用或禁用TCP keep-alive
socketTimeout int socket读取操作的超时时间
ApplicationName String 指定正在使用连接的应用程序名称
currentSchema String 指定设置到search-path中的schema
readOnly boolean 将连接设置为只读模式

执行SQL语句并处理结果

向数据库发出执行SQL的请求时,需要使用Statement或PreparedStatement,使用Statement或PrepareStatement实例发出查询,服务端执行完成后将返回一个ResultSet实例,该实例包括查询的结果。

执行查询

使用Statement执行查询
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500");
while (rs.next())
{
    System.out.print("Column 1 returned ");
    System.out.println(rs.getString(1));
}
rs.close();
使用PreparedStatement执行查询
int foovalue = 500;
PreparedStatement st = conn.prepareStatement("SELECT * FROM mytable WHERE columnfoo = ?");
st.setInt(1, foovalue);
ResultSet rs = st.executeQuery();
while (rs.next())
{
    System.out.print("Column 1 returned ");
    System.out.println(rs.getString(1));
}
rs.close();
st.close();

使用游标获取结果

默认情况下,驱动程序将一次性获取查询的所有结果,当某个查询的结果集很庞大时,一次获取所有结果很不合理,因此JDBC驱动程序提供了一种基于数据库游标的ResultSet方法,只获取少量的行缓存在客户端。通过重新定位游标来获取下一批数据。

基于游标的ResultSet不能在所有情况下使用。有许多限制会使驱动程序一次性获取整个结果集:

  • 连接不能使用自动提交模式,因为后端会在事务结束时关闭游标,因此在自动提交模式下,事务结束后,在从游标获取数据之前,游标已经被关闭。

  • Statement必须使用ResultSet.TYPE_FORWARD_ONLY类型创建,这意味着不能在结果集中进行跳转或向后滚动。这也是默认值,因此不需要在代码中额外指定。

  • 给定的查询语句必须是单条语句,不能是用分号连接在一起的多个语句。

  • 必须设置fetch size,且fetch size不能为0.

示例:

// make sure autocommit is off
conn.setAutoCommit(false);
Statement st = conn.createStatement();

// Turn use of the cursor on.
st.setFetchSize(50);
ResultSet rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next())
{
    System.out.print("a row was returned.");
}
rs.close();

// Turn the cursor off.
st.setFetchSize(0);
rs = st.executeQuery("SELECT * FROM mytable");
while (rs.next())
{
    System.out.print("many rows were returned.");
}
rs.close();

// Close the statement.
st.close();

使用Statement和 PreparedStatement接口

在使用Statement和PreparedStatement时,需要注意以下问题:

  • 可以多次使用一个Statement实例,可以在打开连接时创建Statement然后在连接的整个生命周期内使用它。但是必须注意在给定时间内每个Statement或PreparedStatement只能存在一个ResultSet.

  • 如果在处理ResultSet时需要执行查询,可以创建另一个Statement来执行。

  • 如果使用多线程,并且有多个线程正在使用数据库,则每个线程必须使用单独的Statement.

  • 使用完Statement或PreparedStatement应该及时关闭。

  • 在JDBC中,问号(?)是PreparedStatement的占位符,但是有一些操作符包含一个问号,为避免SQL语句中的问号被当成占位符,可以使用两个问号(??)进行转义。也可以在Statement中使用上述转义,但是不是必须的,因为在Statement中单个问号也可以用作操作符。

使用ResultSet接口

使用ResultSet接口时必须考虑下面的问题:

  • 在读取任何数值的时候,必须调用next().如果还有结果则返回真(true)。

  • 在 JDBC 规范里,对一个字段应该只访问一次.遵循这个规则是最安全的,不过目前 Vastbase JDBC 驱动允许对一个字段访问任意次.

  • 在结束对一个 ResultSet 的处理后,必须调用 close()来关闭它。

  • 使用那个创建ResultSet的 Statement做另一个查询请求, 当前打开的ResultSet 实例将自动关闭.

执行更新

要更改数据(执行一个insert,update或者delete),可以使用 executeUpdate()方法. executeUpdate() 方法类似于发出 select语句的executeQuery()方法,不过,它不返回ResultSet,它返回的是insert,update或者delete语句影响的行数.

删除
int foovalue = 500;
PreparedStatement st = conn.prepareStatement("DELETE FROM mytable WHERE columnfoo = ?");
st.setInt(1, foovalue);
int rowsDeleted = st.executeUpdate();
System.out.println(rowsDeleted + " rows deleted");
st.close();
更新
int foovalue = 500;
PreparedStatement st = conn.prepareStatement("UPDATE mytable  SET columninfo=’updated’ WHERE columnfoo = ?");
st.setInt(1, foovalue);
int rowsUpdated = st.executeUpdate();
System.out.println(rowsUpdated + " rows updated");
st.close();
插入

插入单行:

PreparedStatement st = conn.prepareStatement("INSERT INTO mytable(col_1,col_2) values(?,?)");
st.setInt(1, 0);
st.setString(2, "row1");
int rowsInsert = st.executeUpdate();
System.out.println(rowsInsert + " rows insert");
st.close();

插入多行:

PreparedStatement st = conn.prepareStatement("INSERT INTO mytable(col_1,col_2) values(?,?)");
st.setInt(1, 0);
st.setString(2, "row1");
st.addBatch();
st.setInt(1,1);
st.setString(2, "row2");
st.addBatch();
st.executeBatch();
st.close();

创建或修改数据库对象

要创建、更改或者删除一个类似表或者视图这样的数据库对象, 可以使用execute() 方法, execute()方法类于发出 select语句的 executeQuery()方法,不过它不返回结果.

例如DROP表:

Statement st = conn.createStatement();
st.execute("DROP TABLE mytable");
st.close();

调用存储过程

下面的例子展示了如何调用存储过程:

CallableStatement upperProc = conn.prepareCall("{? = call upper( ? ) }");
upperProc.registerOutParameter(1, Types.VARCHAR);
upperProc.setString(2, "lowercase to uppercase");
upperProc.execute();
String upperCased = upperProc.getString(1);
upperProc.close();

获取结果集

函数可以通过两种方式返回结果集,根据函数被调用的方式决定结果集的返回方式。

  • 方式一:

    Statement stmt = conn.createStatement();
    stmt.execute("CREATE OR REPLACE FUNCTION setoffunc() RETURNS SETOF int AS "
    + "' SELECT 1 UNION SELECT 2;' LANGUAGE sql");
    ResultSet rs = stmt.executeQuery("SELECT * FROM setoffunc()");
    while (rs.next())
    {
    // do something
    }
    rs.close();
    stmt.close();
    
  • 方式二:

    // Setup function to call.
    Statement stmt = conn.createStatement();
    stmt.execute("CREATE OR REPLACE FUNCTION refcursorfunc() RETURNS refcursor"
    + " LANGUAGE plpgsql AS '"
    + " DECLARE "
    + "    mycurs refcursor; "
    + " BEGIN "
    + "    OPEN mycurs FOR SELECT 1 UNION SELECT 2; "
    + "    RETURN mycurs; "
    + " END;' ");
    stmt.close();
    
    // We must be inside a transaction for cursors to work.
    conn.setAutoCommit(false);
    
    // Procedure call.
    CallableStatement proc = conn.prepareCall("{? = call refcursorfunc() }");
    proc.registerOutParameter(1, Types.OTHER);
    proc.execute();
    ResultSet results = (ResultSet) proc.getObject(1);
    while (results.next())
    {
    // do something with the results.
    }
    results.close();
    proc.close();
    

处理大数据类型

二进制类型

Vastbase提供两种不同的方法存储二进制数据。二进制数据可以使用二进制数据类型 BYTEA存储在表中,BYTEA的字段可以存储最多 1G 字节的二进制数据。

使用BYTEA类型存储二进制数据,可以用getBytes(),setBytes(),getBinaryStream(),setBinaryStream()进行读写。

例如:

CREATE TABLE images (imgname text, img bytea);
插入记录
File file = new File("myimage.gif");
FileInputStream fis = new FileInputStream(file);
PreparedStatement ps = conn.prepareStatement("INSERT INTO images VALUES (?, ?)");
ps.setString(1, file.getName());
ps.setBinaryStream(2, fis);
ps.executeUpdate();
ps.close();
fis.close();

在这里,setBinaryStream()将一组字节从流传输到BYTEA类型的列中。如果数据已经在byte[]中,那么也可以使用setBytes()方法来实现数据写入。

读取记录
PreparedStatement ps = conn.prepareStatement("SELECT img FROM images WHERE imgname = ?"); 
ps.setString(1, "myimage.gif"); 
ResultSet rs = ps.executeQuery(); 
while (rs.next()) 
{ 
    byte[] imgBytes = rs.getBytes(1); 
    // use the data in some way here 
} 
rs.close(); 
ps.close();

在这里,二进制数据被读取为byte[]。也可以调用getBinaryStream()处理 。

字符串类型

Vastbase中TEXT类型与VARCHAR类型都是可变长的字符串类型,区别在于VARCHAR类型通过VARCHAR(n)中的n来限制最大长度,而TEXT类型没有。TEXT类型与VARCHAR类型几乎没有性能差别,TEXT类型最多可存储1G数据。

使用TEXT类型存储数据时,可用getString(),getCharacterStream(),setString(), setCharacterStream()来进行读写。

例如:

CREATE TABLE images (id int, msg text); 
插入记录
File file = new File("myimage.gif");
Reader reader = new InputStreamReader(new FileInputStream(file));
PreparedStatement ps = conn.prepareStatement("INSERT INTO images VALUES (?, ?)");
ps.setInt(1, 12);
ps.setCharacterStream (2, reader);
ps.executeUpdate();
ps.close(); 

如果数据内容已经在String中,那么也可以使用setString()方法来实现数据写入。

读取记录
PreparedStatement ps = conn.prepareStatement("SELECT msg FROM images WHERE id= ?"); 
ps.setInt(1, 12); 
ResultSet rs = ps.executeQuery(); 
while (rs.next()) 
{ 
    String imgBytes = rs.getString(1); 
    // use the data in some way here 
} 
rs.close(); 
ps.close(); 

在这里,TEXT数据被读取为String,也可以调用getCharacterStream()处理 。

使用连接池

PostgreSQL jdbc连接可使用连接池,比如阿里巴巴开源连接池Druid。

  • 无框架配置

    下载Druid的jar包并引入,在resource目录下配置db_server.properties文件

    driverClassName=org.postgresql.Driver
    url=jdbc:postgresql://127.0.0.1:5432/test
    username=root
    password=123456
    filters=stat
    initialSize=2
    maxActive=300
    maxWait=60000
    timeBetweenEvictionRunsMillis=60000
    minEvictableIdleTimeMillis=300000
    validationQuery=SELECT 1
    testWhileIdle=true
    testOnBorrow=false
    testOnReturn=false
    poolPreparedStatements=false
    maxPoolPreparedStatementPerConnectionSize=200;
    
    public class DBPoolConnection {
    	static Logger log = Logger.getLogger(DBPoolConnection.class);
    	private static DBPoolConnection dbPoolConnection = null;
    	private static DruidDataSource druidDataSource = null;
    
    	static {
    		Properties properties = loadPropertiesFile("resource/db_server.properties");
    		try {
    			druidDataSource = (DruidDataSource)DruidDataSourceFactory.createDataSource(properties); //DruidDataSrouce工厂模式
    		} catch (Exception e) {
    			log.error("获取配置失败");
    		}
    	}
    
    	/**
    	* 数据库连接池单例
    	* @return
    	*/
    	public static synchronized DBPoolConnection getInstance(){
    		if (null == this.dbPoolConnection){
    			dbPoolConnection = new DBPoolConnection();
    		}
    		return this.dbPoolConnection;
    	}
    
    	/**
    	* 返回druid数据库连接
    	* @return
    	* @throws SQLException
    	*/
    	public DruidPooledConnection getConnection() throws SQLException{
    		return druidDataSource.getConnection();
    	}
    }
    
    //get connection
    DruidPooledConnection dsConn = DBPoolConnection.getInstance().getConnection();
    Connection conn = dsConn .getConnection();
           
    //execute SQL
     String sql = "INSERT INTO student VALUES (NULL, ?, ?, ?);";
    PreparedStatement pstmt = conn.prepareStatement(sql);
    pstmt.setString(1, "sam");
    pstmt.setInt(2, 35);
    pstmt.setDouble(3, 88.5);
    int i = pstmt.executeUpdate();
     System.out.println("insert rows: " + i);
      	
    pstmt.close();
    //release connection and give back to pool
    conn.close();
    
  • Tomcat配置

    • Tomcat中植入

      1.Tomcat依赖修改

      下载druid的依赖jar,放入到tomcat/lib目录下。

      2.web.xml配置

      修改tomcat下的web.xml,里面增加druid配置:增加在web.xml中servlet的default配置后面

      <!-- druid view -->
      <servlet>
      <servlet-name>DruidStatView</servlet-name>
      <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
      <init-param>
      <!-- 允许清空统计数据 -->
      <param-name>resetEnable</param-name>
      <param-value>true</param-value>
      </init-param>
      <init-param>
      <!-- 用户名 -->
      <param-name>loginUsername</param-name>
      <param-value>admin</param-value>
      </init-param>
      <init-param>
      <!-- 密码 -->
      <param-name>loginPassword</param-name>
      <param-value>admin</param-value>
      </init-param>
      </servlet>
      
      <servlet-mapping>
      <servlet-name>DruidStatView</servlet-name>
      <url-pattern>/druid/*</url-pattern>
      </servlet-mapping>
      <!-- druid view -->
      

      3.context.xml配置

      将source中的factory修改为:com.alibaba.druid.pool.DruidDataSourceFactory

      <Resource name="prpDataSource"
        auth="Container"
        type="javax.sql.DataSource"
        factory="com.alibaba.druid.pool.DruidDataSourceFactory"
        defaultTransactionIsolation="READ_COMMITTED"
        username="用户名"
        password="密码"
        filters="stat,wall"
        driverClassName="org.postgresql.Driver"
        url="jdbc:postgresql://127.0.0.1:5432/dbname"
        maxActive="96"
        minIdle="8"
        removeabandoned="true"
        removeabandonedtimeout="60"
        logabandoned="true">
      </Resource>
      

      4.catalina.properties文件

      如果druid没有加载到,再修改catalina.properties文件

  • 项目中配置

    1.引入pom依赖

    <dependency>
    <groupId>com.alibaba.druid</groupId>
    <artifactId>druid-wrapper</artifactId>
    <version>0.2.9</version>
    </dependency>
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.9</version>
    </dependency>
    <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.8</version>
    </dependency>
    

    2.web.xml与context.xml配置

    参考上述context.xml与web.xml文件的配置

    3.filter相关配置

    如果项目中有使用Authorization权限拦截的,需要在白名单中配置/druid/路径

    <filter>
    <filter-name>Authorization</filter-name>
    <filter-class>
        com.sinosoft.common.AuthorizationFilter
    </filter-class>
    <init-param>
        <param-name>loginPage</param-name>
        <param-value>/index.html</param-value>
    </init-param>
    <init-param>
        <param-name>valid</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>ignore</param-name>
        <param-value>
            /login.do;
            /claim/swfFlowBeforeQuery.do;
            /interFaces/;
            /prpall/;
            /www/;
            /druid/;
        </param-value>
    </init-param>
    </filter>
    
  • Spring配置

    • 引入相关依赖

      <!-- SPRINGBOOT WEB -->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      
      <!-- SPRINGBOOT DRUID -->
      <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid-spring-boot-starter</artifactId>
          <version>1.1.10</version>
      </dependency>
              
      <!-- SPRINGBOOT JDBC -->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-jdbc</artifactId>
      </dependency>
      
      <!-- AtlasDB -->
      <dependency>
          <groupId>cn.com.atlasdata</groupId>
          <artifactId>atlasdb</artifactId>
          <version>${atlasdb-jdbc.version}</version>
      </dependency>
              
      <!-- LOG4J -->
      <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.16</version>
          <scope>compile</scope>
      </dependency>
      
    • xml配置

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop.xsd">
      <!-- 配置_Druid和Spring关联监控配置 -->
      <bean id="druid-stat-interceptor"
      class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor"></bean>
      <!-- 方法名正则匹配拦截配置 -->
      <bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"
      scope="prototype">
      <property name="patterns">
          <list>
          	<!--此处根据实际项目的包名更改-->
              <value>com.beini.*</value>
          </list>
      </property>
      </bean>
      <aop:config proxy-target-class="true">
      <aop:advisor advice-ref="druid-stat-interceptor"
      	pointcut-ref="druid-stat-pointcut" />
      </aop:config>
      </beans>
      
    • 结合Mybatis的xml配置

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
      	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
      xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:util="http://www.springframework.org/schema/util"
      	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
      	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
      	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
      	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
      <!-- 配置dao层扫描 -->
      	<context:property-placeholder location="classpath:conf/database.properties" /> 
      <!-- 通过JDBC模版获取数据库连接 -->
      <bean scope="singleton" id="jdbcTemplate"
      class="org.springframework.jdbc.core.JdbcTemplate">
      <property name="dataSource" ref="dataSource"></property>
      </bean>
      	<!-- 数据库连接池 -->
      	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
      		destroy-method="close">
      		<property name="url" value="${jdbc.url}" />
      		<property name="username" value="${jdbc.username}" />
      		<property name="password" value="${jdbc.password}" />
      		<property name="driverClassName" value="${jdbc.driverClassName}" />
      	</bean>
      	
      	<!-- 让spring管理sqlsessionfactory 使用mybatis和spring整合包中的 -->
      	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
      		<!-- 数据库连接池 -->
      		<property name="dataSource" ref="dataSource" />
      		<!-- 加载mybatis的全局配置文件 -->
      		<property name="mapperLocations" value="classpath:com/mapper/*.xml" />
      	</bean>
      	
      	<!-- 配置mapper扫描包 -->
      	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
      		<property name="basePackage" value="com.mapper" />
      	</bean>
      </beans>
      
    • yml配置

      spring:
      # 数据源配置
      datasource:
      type: com.alibaba.druid.pool.DruidDataSource
      driver-class-name: org.postgresql.Driver
      url: jdbc:postgresql://127.0.0.1:5432/test
      username: root
      password: 123456
      # 连接池配置
      druid:
      # 初始化大小,最小,最大
      initial-size: 5
      min-idle: 5
      max-active: 20
      # 配置获取连接等待超时的时间
      max-wait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位毫秒
      time-between-eviction-runs-millis: 60000
      # 配置一个连接在池中最小生存时间
      min-evictable-idle-time-millis: 300000
      validation-query: SELECT 1 FROM sys_user
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      # 打开 PSCache,并且指定每个连接上 PSCache 的大小
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 20
      # 配置监控统计拦截的 Filter,去掉后监控界面 SQL 无法统计,wall 用于防火墙
      filters: stat,wall,log4j
      # 通过 connection-properties 属性打开 mergeSql 功能;慢 SQL 记录
      connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
      # 配置 DruidStatFilter
      web-stat-filter:
      enabled: true
      url-pattern: /*
      exclusions: .js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*
      # 配置 DruidStatViewServlet
      stat-view-servlet:
      url-pattern: /druid/*
      # IP 白名单,没有配置或者为空,则允许所有访问
      allow: 127.0.0.1
      # IP 黑名单,若白名单也存在,则优先使用
      deny: 192.168.31.253
      # 禁用 HTML 中 Reset All 按钮
      reset-enable: false
      # 登录用户名/密码
      login-username: root
      login-password: 123