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. SecureCRT在Tab下的Title显示IP

    注意:要针对每个Session进行修改才行. 参考: http://www.cnblogs.com/tyhmj/archive/2013/12/20/3483247.html

  2. Ubuntu 16.04重启输入法

    一般使用搜狗输入法,但是偶尔不太稳定会挂掉,但是可以通过以下脚本重启: pidof fcitx | xargs kill pidof sogou-qimpanel | xargs kill nohup ...

  3. 原则 principles

    1.找到对的人来讨论问题. 2.把工作分配给对的人才能把事情做对. 3.

  4. 手把手教你开发Chrome扩展二:为html添加行为

    手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 上一节我们 ...

  5. AutoCAD如何打印

    现在有一个CAD图纸,左侧为房型图,右侧为规划好之后的图纸,我只要打印右侧的东西.点击文件-打印   在打印设备中选择Default Windows System Printer,名称的下拉菜单下面有 ...

  6. Swift开发iOS项目实战视频教程(一)---iOS真简单

    本课主要介绍iOS项目的创建.第一个iOS项目的开发.UILabel.UIButton的使用. 假设你看完此视频还认为iOS非常难,请你来找我! 本教程摒弃枯燥的语法和知识解说,全是有趣有料的项目实战 ...

  7. Oracle Warehouse Builder(OWB) 安装报seeding owbsys错误的解决

    今天在RHEL6.4上安装Oracle Warehouse Builder 11.2时在最后一步报错,打开日志查看有例如以下信息: main.TaskScheduler timer[5]2014052 ...

  8. MariaDB基础操作

    MariaDB: MariaDB是MySQL源代码的一个分支,随着Oracle买下Sun,MySQL也落入了关系型数据库王者之手.在意识到Oracle会对MySQL许可做什么后便分离了出来(MySQL ...

  9. 2016/1/21 练习 创建 接口interface 应用implements 类class 并实例化调用

    package testinterface; public interface ICpu { //电压 public boolean dianya(); //控制 public void kongzh ...

  10. 如何装载Storyboard中的ViewController?

      如上图所示,如何装载Storyboard中指定的ViewController? 首先,需要指定ViewController的ID,如上图右上方红色方框内的Storyboard ID.然后使用下面的 ...