JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。

​ ● JDBC

​ ● C3P0

​ ● DRUID


一.JDBC

1.基本使用

​ 使用 JDBC 操作MySQL数据库时,可以将步骤分为以下7步:

// 1.注册驱动(将mysql的驱动类加载到内存中)
DriverManager.registerDriver(new Driver());
// 2.获取连接
String url = "jdbc:mysql://localhost:3306/db";
String username = "root";
String password = "root";
Connection con = DriverManager.getConnection(url, username, password);
// 3.编写sql
String sql = " ... ";
// 4.获取语句的执行器
Statement statement = con.createStatement();
// 5.执行sql并返回结果集
ResultSet rs = statement.excuteQuery(sql);
// 6.处理结果集
while(rs.next()){ ... }
// 7.释放资源
rs.close();
statement.close();
con.close();

2.PreparedStatement:预编译对象

为防止 SQL 注入,我们先将sql 传给数据库,将sql语句事先编译好,使用时直接赋真实值,执行sql即可。

// 使用 ? 占位
String sql = "select * from stu where id= ? "
// 创建预编译对象
PreparedStatement pst = con.prepareStatement(sql);
// 设置具体的参数 (第几个 ?, 具体值)
pst.set(1, 2);
// 执行sql
ResultSet rs = pst.executeQuery();
int i = pst.executeUpdate();

3.封装优化

​ 由于Driver类的源码当中有注册驱动的静态代码块,因此我们可以不用自己再去注册(类加载后就完成了注册),同时为了避免硬编码和代码冗余我们将其优化,封装成简单工具类。

1.编写配置文件 :Jdbc.properties

# 数据库驱动配置
# Driver类的全限定类名(加载即完成注册)
jdbc.driver=com.mysql.jdbc.Driver
# 协议 协议 地址 端口 数据库
jdbc.url=jdbc:mysql://localhost:3306/db
# 用户名
jdbc.username=root
# 密码
jdbc.password=root

2.编写工具类 :JdbcUtils

public class JdbcUtils {
//声明配置信息
private static String driver;
private static String url;
private static String username;
private static String password;
private static Connection con;
//静态代码块,类加载时解析配置信息
static {
try {
InputStreamReader is = new InputStreamReader
(JdbcUtils.class.getResourceAsStream("/jdbc.properties"));
Properties properties = new Properties();
properties.load(is);
driver = properties.getProperty("jdbc.driver").trim();
url = properties.getProperty("jdbc.url").trim();
username = properties.getProperty("jdbc.username").trim();
password = properties.getProperty("jdbc.password").trim();
//加载驱动获取连接
Class.forName(driver);
con = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
e.printStackTrace();
}
}
// 获取数据库连接(如果连接关闭则重新创建)
public static Connection getConnection() {
try {
if (con.isClosed()) {
con = DriverManager.getConnection(
url,username,password);
return con;
}
} catch (SQLException e) {
e.printStackTrace();
return null;
}
return con;
}
// 关闭资源(有结果集)
public static void close(ResultSet rs, Statement s,
Connection con) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (s != null) {
try {
s.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// 关闭资源(无结果集)
public static void close(Statement s, Connection con) {
close(null, s, con);
}
}

3.注意事项

// 需要注意的是
// 1.将jdbc.properties放到src文件下 // 2.解析配置文件时除上述写法还可以使用如下方式(此法针对src下的properties文件):
ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
driver = bundle.getString("jdbc.driver").trim();
url = bundle.getString("jdbc.url").trim();
username = bundle.getString("jdbc.username").trim();
password = bundle.getString("jdbc.password").trim();

在使用上述方法连接并操作数据库时,若没有按照上面的代码对连接的状态进行检查那么肯定会遇到这样一个异常:No operations allowed after connection closed. 因为我们只创建了一个连接,当完成一个操作后将其关闭,那么下一次操作获得的连接就是已经关闭了的连接,因此会发生此异常!上述代码中对连接进行了状态的判断,比较麻烦。而数据库连接池正是维护着几个连接供我们使用,使用后将其归还至连接池(并不是真的关闭)。

二.C3P0连接池

C3P0是开源的连接池,Hibernate框架默认使用的就是C3P0连接池。使用配置文件创建连接池时注意文件名称“ c3p0-config.xml"不能更改(放在src下)。

1.创建配置文件:c3p0-config.xml

<c3p0-config>
<!-- 使用默认的配置读取连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/db</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">10</property>
<property name="checkoutTimeout">3000</property>
</default-config>
<!-- 指定名称的配置信息 -->
<named-config name="myc3p0">
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day25</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">8</property>
<property name="checkoutTimeout">1000</property>
</named-config>
</c3p0-config>

2.获取连接池对象

// 关键代码
// 使用默认配置获取连接池对象
ComboPooledDataSource comboPooledDataSource =
new ComboPooledDataSource();
// 使用指定的配置 (配置名) 获取连接池对象
ComboPooledDataSource comboPooledDataSource =
new ComboPooledDataSource("myc3p0");

三.DRUID(德鲁伊)连接池

DRUID是阿里巴巴开发的目前最好的数据库连接池。 com.alibaba.druid.pool.DruidDataSourceFactory 类创建连接池的方法:

1.创建配置文件:mydruid.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/db
username=root
password=root
initialSize=5
maxActive=10
maxWait=3000
minIdle=3 # 最小连接池数量

2.获取连接池对象

Properties prop = new Properties();
InputStream is = DruidDemo.class.getClassLoader().
getResourceAsStream("mydruid.properties");
prop.load(is);
//druid工厂根据配置文件创建druid连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);

四.DRUID工具类封装

1.配置文件(参上)

2.关键代码

private static DataSource dataSource;
static{
try {
// 解析druid的配置文件
Properties prop = new Properties();
InputStream is = JDBCUtil.class.getClassLoader().
getResourceAsStream("druid.properties");
prop.load(is);
// druid工厂使用配置文件创建druid连接池对象
dataSource = DruidDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
e.printStackTrace();
}
}
//获取druid连接池
public static DataSource getDataSource(){
return dataSource;
}
//获取druid连接池中的连接
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
//释放资源(归还连接)
public static void close(ResultSet rs, Statement st,Connection conn) {
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(st!=null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Statement st,Connection conn) {
close(null,st,conn);
}

Tips:

// 将properties文件放到src下时
JdbcUtils.class.getResourceAsStream("/jdbc.properties")
//两种方式的参数不一样
JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties")

关注微信公众号,随时随地学习

JDBC和数据库连接池的更多相关文章

  1. 数据库连接JDBC和数据库连接池C3P0自定义的java封装类

    数据库连接JDBC和数据库连接池C3P0自定义的java封装类 使用以下的包装类都需要自己有JDBC的驱动jar包: 如 mysql-connector-java-5.1.26-bin.jar(5.1 ...

  2. Java -- JDBC 学习--数据库连接池

    JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库连接. 这种模式开 ...

  3. JDBC【数据库连接池、DbUtils框架、分页】

    1.数据库连接池 什么是数据库连接池 简单来说:数据库连接池就是提供连接的... 为什么我们要使用数据库连接池 数据库的连接的建立和关闭是非常消耗资源的 频繁地打开.关闭连接造成系统性能低下 编写连接 ...

  4. Java Web(九) JDBC及数据库连接池及DBCP,c3p0,dbutils的使用

    DBCP.C3P0.DBUtils的jar包和配置文件(百度云盘):点我下载 JDBC JDBC(Java 数据库连接,Java Database Connectify)是标准的Java访问数据库的A ...

  5. 基于JDBC的数据库连接池技术研究与应用

    引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的3层开 ...

  6. spring配置tomcat jdbc pool数据库连接池

    <bean id="sqliteDataSource" class="org.apache.tomcat.jdbc.pool.DataSource" de ...

  7. JavaEE JDBC 了解数据库连接池

    了解数据库连接池 @author ixenos 数据库连接是有限的资源,如果用户需要离开应用一段时间,那么他占用的连接就不应该保持开放状态: 另一方面,每次查询都获取连接并在随后关闭它的代价也很高. ...

  8. 关于jdbc和数据库连接池的关系(不是封装的关系)

    你都说是数据库连接池了.那就是连接数据库用的.JDBC是java封装的对数据库的操作.当然你可以自己进一步封装.数据库连接池是JDBC使用的前提,如果连数据库连接池都没连上,JDBC的操作就谈不上了. ...

  9. Jdbc druid数据库连接池

    //测试类package druid; import util.JdbcUtilsDruid; import java.sql.Connection; import java.sql.Date; im ...

随机推荐

  1. 配置文件的备份和IOS 的备份

    分享到 QQ空间 新浪微博 百度搜藏 人人网 腾讯微博 开心网 腾讯朋友 百度空间 豆瓣网 搜狐微博 百度新首页 QQ收藏 和讯微博 我的淘宝 百度贴吧 更多... 百度分享 广场 登录 注册 关注此 ...

  2. 初探FFT在数字图像处理中的应用(fft2函数的用法)

    初探FFT在数字图像处理中的应用 一般FFT在通信等领域都做的一维变换就能够了.可是在图像处理方面,须要做二维变换,这个时候就须要用到FFT2. 在利用Octave(或者matlab)里面的fft2( ...

  3. socket 由浅入深系列------ 原理(一)

    来自:网络整理 个人觉得写一个网络应用程序没有是一件非常easy的事.其实,我们刚開始的时候总觉得的原则: 建立------>连接套接字------->接受一个连接---->发送数据 ...

  4. 从epoll构建muduo-13 Reactor + ThreadPool 成型

    mini-muduo版本号传送门 version 0.00 从epoll构建muduo-1 mini-muduo介绍 version 0.01 从epoll构建muduo-2 最简单的epoll ve ...

  5. cocos2dx塔防游戏逻辑

    cocos2dx 塔防游戏逻辑 1.欢迎界面 2.tield制作游戏地图,空块设置cantouch属性为1 3.设置地图锚点,把锚点增加一个锚点容器,给怪物的行走函数传入 该锚点容器參数,让怪物依照锚 ...

  6. B. Error Correct System (CF Round #296 (Div. 2))

    B. Error Correct System time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  7. jquery.validate自己定义验证--成功提示与择要提示

    1. 自己定义验证--成功提示 1) 加入选项 errorClass: "unchecked". validClass: "checked", errorEle ...

  8. 安装ubuntu后启动黑屏

    我是在windows7上的一个空暇盘上安装ubuntu 14.安装后重新启动没有ubuntu的启动项,然后用easybcd生成启动项,重新启动发现果然有,可是选择之后黑屏. 百度半天无果.后来无意发现 ...

  9. 协议解析Bug分析

    协议解析Bug分析 源自邮件协议RPC(远程过程调用)处理的Request请求数据包的bug.        一.Bug描写叙述 腾讯收购的Foxmailclient能够作为outlookclient ...

  10. 7-81 js课程小结

    7-81 js课程小结 学习要点 理解全局对象 变量的作用范围 理解全局对象Global 全局属性和函数可用于所有内建的 JavaScript 对象.全局对象是所有全局方法的拥有者,用来统一管理全局方 ...