1.JDBC简介
- JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,使用这个类库可以以一种标准的方法、方便地访问数据库资源
- JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。
- JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。
- •JDBC API 是一系列的接口,它使得应用程序能够进行数据库联接,执行SQL语句,并且得到返回结果。
- 几种常用数据库的JDBC URL
对于 Oracle 数据库连接,采用如下形式:
–jdbc:oracle:thin:@localhost:1521:sid
•对于 SQLServer 数据库连接,采用如下形式:
–jdbc:microsoft:sqlserver//localhost:1433; DatabaseName=sid
•对于 MYSQL 数据库连接,采用如下形式:
–jdbc:mysql://localhost:3306/sid
2.入门程序
package com.jdbc.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.jdbc.vo.User;
public class JDBCUtil {
private static Connection conn = null;
private static PreparedStatement pstm = null;
private static ResultSet rs = null;
public static Connection getConnection(){
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/cart","root","1234");
System.out.println("Connection success.");
}
catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/**
* 释放所有资源 --记得有顺序
* @param rs 结果集
* @param pstm preparedStatement 对象
* @param conn 数据库连接
*/
public static void closeConnection(ResultSet rs, PreparedStatement pstm, Connection conn){
if (rs != null) {
try {
rs.close();
}
catch (SQLException e) {
e.printStackTrace();
}
}
if (pstm != null) {
try {
pstm.close();
}
catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
}
catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
//先插入一条数据
conn = JDBCUtil.getConnection();
String sql="insert into user (name,password) values(?,?)";
pstm = conn.prepareStatement(sql);
pstm.setString(1, "影魔");
pstm.setString(2, "1234");
pstm.executeUpdate();
System.out.println("插入一条数据成功");
//再进行查询
String sql2 = "select * from user";
pstm = conn.prepareStatement(sql2);
//获取查询结果集
rs = pstm.executeQuery();
while(rs.next()) {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setPassword(rs.getString("password"));
System.out.println(user);
}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
//依次关闭数据库连接
JDBCUtil.closeConnection(rs, pstm, conn);
}
}
}
3.封装工具类
3.1.使用配置文件properties
加载数据库驱动,获取连接时存在硬编码,当数据库改变,数据库类型改变。密码等信息改变时,代码不利于维护 。
在src跟目录下创建db.properties 文件 。
driver=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/cart
user=root
password=1234
修改getConnection方法
public static Connection getConnection(){
try {
// 1). 创建 Properties 对象
Properties properties = new Properties();
// 2). 获取 jdbc.properties 对应的输入流
InputStream in = JDBCUtil.class.getClassLoader().getResourceAsStream("db.properties");
// 3). 加载 2) 对应的输入流
properties.load(in);
// 4). 具体决定 user, password 等4 个字符串.
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String jdbcUrl = properties.getProperty("jdbcUrl");
String driver = properties.getProperty("driver");
// 2. 加载数据库驱动程序(对应的 Driver 实现类中有注册驱动的静态代码块.)
Class.forName(driver);
// 3. 通过 DriverManager 的 getConnection() 方法获取数据库连接.
conn = DriverManager.getConnection(jdbcUrl, user, password);
}
catch (Exception e) {
e.printStackTrace();
}
return conn;
}
4.数据库连接池
4.1. 什么是数据库连接池
数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。
4.2.优点
节省创建连接与释放连接 性能消耗
连接池中连接起到复用的作用 ,提高程序性能
4.3. 数据库连接池的运行机制
(1) 程序初始化时创建连接池
(2) 使用时向连接池申请可用连接
(3) 使用完毕,将连接返还给连接池
(4) 程序退出时,断开所有连接,并释放资源
4.4.使用c3p0连接池
常用开源连接池:
dbcp 半自动化操作 不能自动连接
c3p0 自动化操作(自动的加载配置文件 并且设置到对象里面) 自动尝试连接
Druid 阿里巴巴的开源连接池
4.5.数据库源配置文件
以下两种配置方式,c3p0连接池会自动读取配置文件数据源
第一种: c3p0.properties 文件名不能改, 必须放在src下 ,配置文件中的key名称不能变
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://127.0.0.1:3306/ssm?characterEncoding=UTF-8
c3p0.user=root
c3p0.password=root
第二种: c3p0-config.xml 可以配置多个数据库连接并且可以指定名字去加载
ComboPooledDataSource dataSource = new ComboPooledDataSource("my");
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config><named-config name="mysql">
<!-- 指定连接数据源的基本属性 -->
<property name="user">root</property>
<property name="password">1234</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///cart</property>
<!-- 若数据库中连接数不足时, 一次向数据库服务器申请多少个连接 -->
<property name="acquireIncrement">5</property>
<!-- 初始化数据库连接池时连接的数量 -->
<property name="initialPoolSize">5</property>
<!-- 数据库连接池中的最小的数据库连接数 -->
<property name="minPoolSize">2</property>
<!-- 数据库连接池中的最大的数据库连接数 -->
<property name="maxPoolSize">15</property><!-- C3P0 数据库连接池可以维护的 Statement 的个数 -->
<property name="maxStatements">10</property>
<!-- 每个连接同时可以使用的 Statement 对象的个数 -->
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>
修改getConnection方法
private static DataSource ds = null;
static {
ds = new ComboPooledDataSource("mysql");
}
/**
* 使用c3p0配置文件获取连接
* @return
*/
public static Connection getC3p0Conn() {
try {
conn = ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
参考博客:
源代码码示例:github下载地址