基础JDBC
导入数据包 . 需要包括含有需要进行数据库编程的JDBC类的包。大多数情况下,使用 import java.sql.* 就可以了.
注册JDBC驱动程序. 需要初始化驱动程序,可以与数据库打开一个通信通道。
打开连接. 需要使用DriverManager.getConnection() 方法创建一个Connection对象,它代表与数据库的物理连接。
执行查询 . 需要使用类型声明的对象建立并提交一个SQL语句到数据库。
从结果集中提取数据 . 要求使用适当的关于ResultSet.getXXX()方法来检索结果集的数据。
清理环境. 需要明确地关闭所有的数据库资源相对依靠JVM的垃圾收集。[1]
/STEP 1. Import required packages import java.sql.*; public class FirstExample { // JDBC driver name and database URL static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost/EMP"; // Database credentials static final String USER = "username"; static final String PASS = "password"; public static void main(String[] args) { Connection conn = null; Statement stmt = null; try{ //STEP 2: Register JDBC driver Class.forName("com.mysql.jdbc.Driver"); //STEP 3: Open a connection System.out.println("Connecting to database..."); conn = DriverManager.getConnection(DB_URL,USER,PASS); //STEP 4: Execute a query System.out.println("Creating statement..."); stmt = conn.createStatement(); String sql; sql = "SELECT id, first, last, age FROM Employees"; ResultSet rs = stmt.executeQuery(sql); //STEP 5: Extract data from result set while(rs.next()){ //Retrieve by column name int id = rs.getInt("id"); int age = rs.getInt("age"); String first = rs.getString("first"); String last = rs.getString("last"); //Display values System.out.print("ID: " + id); System.out.print(", Age: " + age); System.out.print(", First: " + first); System.out.println(", Last: " + last); } //STEP 6: Clean-up environment rs.close(); stmt.close(); conn.close(); }catch(SQLException se){ //Handle errors for JDBC se.printStackTrace(); }catch(Exception e){ //Handle errors for Class.forName e.printStackTrace(); }finally{ //finally block used to close resources try{ if(stmt!=null) stmt.close(); }catch(SQLException se2){ }// nothing we can do try{ if(conn!=null) conn.close(); }catch(SQLException se){ se.printStackTrace(); }//end finally try }//end try System.out.println("Goodbye!"); }//end main }//end FirstExample
/** [3] * 简单的dbcp * @return connection * @throws SQLException */ public Connection getConnectionByDBCPSimple() throws SQLException { // 新建DBCP数据源 BasicDataSource dataSource = new BasicDataSource(); // 设置必要属性值 dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/xiaotangai"); dataSource.setUsername("root"); dataSource.setPassword("123456"); // 从数据源获得数据库连接 Connection connection = dataSource.getConnection(); return connection; }
dbcp util demo
package com.xiaotangai.study.jdbc.dbcp; import java.io.InputStream; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSource; import org.apache.commons.dbcp.BasicDataSourceFactory; /** * DBCP(DataBase connection pool),数据库连接池。 * 1、单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar * 2、添加配置属性文件 dbcp.properties * 3、编写DBCPUtil * @author xiaotangai * @date 2016年3月3日下午8:54:52 */ public class DBCPUtil { private static DataSource dataSource; private static final String resource = "config/dbcp.properties"; static { if(null==dataSource){ createDataSource(); } } private static DataSource createDataSource() { try { Properties properties = new Properties(); InputStream inputStream = DBCPUtil.class.getClassLoader().getResourceAsStream(resource); properties.load(inputStream); return BasicDataSourceFactory.createDataSource(properties); } catch (Exception e) { e.printStackTrace(); } return null; } public static Connection getConnection(){ Connection connection = null; try { if(null==dataSource){ dataSource = createDataSource(); } connection = dataSource.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return connection; } }
dbcp.properties
# database information driverClassName = com.mysql.jdbc.Driver url = jdbc:mysql://localhost:3306/xiaotangai?useUnicode=true&characterEncoding=utf-8 username = root password = 123456
dbcp的基本配置
相关配置说明[2]:
c3p0的配置方式[5]
分为三种,分别是
1.setters一个个地设置各个配置项
2.类路径下提供一个c3p0.properties文件
3.类路径下提供一个c3p0-config.xml文件
2. 类路径下提供一个c3p0.properties文件
文件的命名必须是c3p0.properties,里面配置项的格式为:
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/jdbc
c3p0.user=root
c3p0.password=java
上面只提供了最基本的配置项,其他配置项参照 文档配置,记得是c3p0.后面加属性名就是了,最后初始化数据源的方式就是这样简单:
private static ComboPooledDataSource ds = new ComboPooledDataSource();
public static Connection getConnection() {
try {
return ds.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
3.类路径下提供一个c3p0-config.xml文件
这种方式使用方式与第二种差不多,但是有更多的优点
(1).更直观明显,很类似hibernate和spring的配置
(2).可以为多个数据源服务,提供default-config和named-config两种配置方式
下面是一个配置模板:
<c3p0-config> <default-config> <property name="user">root</property> <property name="password">java</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc</property> <property name="initialPoolSize">10</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">10</property> </default-config> <named-config name="myApp"> <property name="user">root</property> <property name="password">java</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc</property> <property name="initialPoolSize">10</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">10</property> </named-config> </c3p0-config>
如果要使用default-config则初始化数据源的方式与第二种一样,如果要使用named-config里面配置初始化数据源,则只要使用一个带参数的ComboPooledDataSource构造器就可以了
private static ComboPooledDataSource ds = new ComboPooledDataSource("myApp");
更改c3p0的xml文件的路径[6]
System.setProperty("com.mchange.v2.c3p0.cfg.xml","classloader:/resources/settings/c3p0-config.xml");
相关配置说明:[4]
acquireIncrement #当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3
acquireRetryAttempts #定义在从数据库获取新连接失败后重复尝试的次数。Default: 30
acquireRetryDelay #两次连接中间隔时间,单位毫秒。Default: 1000
autoCommitOnClose #连接关闭时默认将所有未提交的操作回滚。Default: false
automaticTestTable #c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试 使用。Default: null
breakAfterAcquireFailure #获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。Default: false
checkoutTimeout #当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒。Default: 0
connectionTesterClassName #通过实现ConnectionTester或QueryConnectionTester的类来测试连接。类名需制定全路径。 Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester
factoryClassLocation #指定c3p0 libraries的路径,如果(通常都是这样)在本地即可获得那么无需设置,默认null即可 Default: null
forceIgnoreUnresolvedTransactions #Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs. (文档原文)作者强烈建议不使用的一个属性
idleConnectionTestPeriod #每60秒检查所有连接池中的空闲连接。Default: 0
initialPoolSize #初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3
maxIdleTime #最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0
maxPoolSize #连接池中保留的最大连接数。Default: 15
maxStatements #JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements属于单个 connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。如果maxStatements与 maxStatementsPerConnection均为0,则缓存被关闭。Default: 0
maxStatementsPerConnection #maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0
numHelperThreads #c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能通过多线程实现多个操作同时被执行。Default: 3
overrideDefaultUser #当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0的数据源时。Default: null
overrideDefaultPassword #与overrideDefaultUser参数对应使用的一个参数。Default: null
password #密码。Default: null
preferredTestQuery #定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意:测试的表必须在初始数据源的时候就存在。Default: null
propertyCycle #用户修改系统配置参数执行前最多等待300秒。Default: 300
testConnectionOnCheckout #因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable 等方法来提升连接测试的性能。Default: false
testConnectionOnCheckin #如果设为true那么在取得连接的同时将校验连接的有效性。Default: false
user #用户名。Default: null
usesTraditionalReflectiveProxies #早期的c3p0版本对JDBC接口采用动态反射代理。在早期版本用途广泛的情况下这个参数允许用户恢复到动态反射代理以解决不稳定的故障。最新的非反射代理更快并且已经开始广泛的被使用,所以这个参数未必有用。现在原先的动态反射与新的非反射代理同时受到支持,但今后可能的版本可能不支持动态反射代理。Default: false
JDBC升级替代品
commons-dbutils
hibernate
mybatis
参考资料:
[0] 慕课网视频 JDBC http://www.imooc.com/learn/157 http://www.imooc.com/learn/421
[1] JDBC教程 http://www.yiibai.com/jdbc/
[2] dbcp基本配置和重连配置 http://blog.itpub.net/7971010/viewspace-1114524/
[3] DBCP数据库连接池实例详解 http://jingyan.baidu.com/article/db55b6098aa37e4ba20a2f63.html
[4] c3p0 参数解释 http://kangzye.blog.163.com/blog/static/368192232010442162576/
[5] C3P0的配置方式 http://myokm123.iteye.com/blog/1743452
[6] 更改C3P0连接池的XML配置 http://blog.csdn.net/pg_guo/article/details/46039651
待补充:例子代码 和理解