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. Servlet的服务端响应

    以下内容引用自http://wiki.jikexueyuan.com/project/servlet/server-response.html: 当一个Web服务器对浏览器响应一个HTTP请求时,响应 ...

  2. JSP的EL表达式语言

    以下内容引用自http://wiki.jikexueyuan.com/project/jsp/expression-language.html: JSP表达式语言(EL)可以方便地访问存储在JavaB ...

  3. node使用npm一句命令停止某个端口号 xl_close_port

    一命令停止某一个端口号,再也不怕端口号被占用了.. 1.插件背景 开启项目的时候,跑不起来了? 很多时候的原因就是,依赖版本,依赖的包未安装,再就是端口号被占用 例如: 这时候,我们做法就是: 1.到 ...

  4. 如何启动/关闭weblogic

    听语音 | 浏览:7107 | 更新:2014-12-25 15:43 1 2 3 4 5 6 分步阅读 最近用到weblogic 给大家分享一下如何启动和关闭weblogic 工具/原料   电脑 ...

  5. Lua迭代器

    在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素.迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,可以通过闭包提供的机制来实现这个任务(闭包中的外部局部变量可以用 ...

  6. react 项目实战(三)表单验证

    我们需要记录每一个字段当前的有效状态,有效时隐藏错误信息,无效时显示错误信息. 而这个有效/无效,可以在表单值改变的时候进行判断. 我们对/src/pages/UserAdd.js进行修改: 首先修改 ...

  7. KLT 光流

    一 光流 光流的概念是Gibson在1950年首先提出来的.它是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在 ...

  8. keepalived + lvs marster 与 backup 之间的 高可用

    简介 keepalived 是linux下一个轻量级的高可用解决方案,它与HACMP实现功能类似,都可以实现服务或者网络的高可用,但是又有差别:hacmp是一个专业的.功能完善的高可用软件,它提供了H ...

  9. 第一天,Robert和Sue大师培训给的启示

    程序猿的零点从他睡觉那一刻开始计时. 今天是周六,听到了Robert关于销售技巧的培训还有Sue关于微信零售业O2O电商的分析,一并加上昨天晚上直到11点的Leadership培训,这个周末真的是收获 ...

  10. 2016/1/17 private public protected 权限练习

    package caipiao; private class Test0117 { private String title; public String actor; protected Strin ...