JDBC原理和连接池技术

JDBC原理: Java Datebase Connectivity:java访问数据库的解决方案
.希望用相同的方式访问不同的数据库,以实现与具体数据库无关的java操作页面
.JDBC定义了一套标准接口,即访问数据库通用的API,不同的数据库厂商根据各自的
数据库的特点去实现这些接口
具体实现是由数据库厂商去实现的.

JDBC接口以及数据库厂商实现
.DriverManager        ---驱动管理
.Connection            ---连接接口

.Statement
.PreparaedStatement ---语句对象接口

.ResultSet            ---结果集接口

JDBC原理:
1.JDBC定义接口
2.数据库厂商实现接口
3.程序员调用接口,实际调用的是底层数据库厂商的实现部分

JDBC的工作过程:
-加载驱动,建立连接
-创建语句对象
-执行SQL语句
-处理结果集
-关闭连接

ResultSet:
查询的结果存放在ResultSet对象的一系列行中
.ResultSet对象的初始位置在行首
.ResultSet.next()方法用来在行间进行移动
.ResultSet.getXXXX()方法来取得字段的内容.

JDBC基础编程(写配置文件,封装)
通过连接工具类获取连接
.在工程中,编写一个访问数据库的工具类,此后所有访问数据库的操作,都从工具类中
获取连接
.两种方式:
-直接把数据配置写在工具类中
-把数据库配置写在一个properties属性文件中,工具类读取属性文件,逐行获取数据库
连接参数(建议使用第二种)

通过属性文件维护连接属性
#驱动类名
jdbc.driver = oracle.jdbc.OracleDriver
#连接字符串
jdbc.url = jdbc:oracle:thin:@localhost:1521:xe
#访问数据的用户名
jdbc.user = wuya
#访问数据密码
jdbc.password = orcl;

在properties属性文件#符号表示注释

从类路径中加载属性文件
String path = "文件的url";

properties.load(DBUtility.getClassLoader().getResourceAsStream(path));

连接的关闭:
public static void closeConnection(Connection conn){
    if(conn!=null){
    try{
        conn.close();
    }catch(SQLException e){
        e.printStackTrace();
    }
        
}
}

1.创建属性db.properties,在该文件中以键值对的形式来存储连接数据库的相关信息
    通过属性文件维护连接属性
    #驱动类名
    jdbc.driver = oracle.jdbc.OracleDriver
    #连接字符串
    jdbc.url = jdbc:oracle:thin:@localhost:1521:xe
    #访问数据的用户名
    jdbc.user = wuya
    #访问数据密码
    jdbc.password = orcl;

这样做的目的是当需要修改连接数据时,只需要修改文件集合,降低了连接数据库的信息
与使用类之间的耦合

2.创建DBUtility类,使用static块,初始化连接数据信息

static{
try{
//加载配置文件
    properties.load(DBUtility.getClassLoader().getResourceAsStream(path));
    driver = properties.getProperty("jdbc.driver");
    url = properties.getProperty("jdbc.url");
    user = properties.getProperty("jdbc.user");
    password = properties.getProperty("jdbc.password");
    }catch(SQLException e){
    e.printStackTrac();
}
}


连接池技术
直接使用JDBC访问数据库时要面临的问题:
1.每一次数据操作请求都需要建立数据库连接,打开连接,存取数和关闭数据连接步骤,
而建立连接和打开数据库连接是一件即耗费资源又费时的操作,如果频繁发生这种数据库
操作,势必使得系统性能下降
2.连接对象代表着数据库系统的连接进程,是有限的资源,如果系统的使用用户非常多,
有可能超出数据库服务器的承受极限,造成系统崩溃

数据库连接池是解决上述问题的最常用的方法.所谓连接池,是可以创建并持有数据库
连接的组件.连接池可以预先创建并封装一些连接对象并将其缓存起来,并需要使用连接
对象时可以向连接池"借"一个,用完归还到连接池中

连接池的主要作用:
1.连接池对象的创建和释放
2.服务器启动时,创建指定数量的数据库连接
3.为用户请求提供可用连接,如果没有空闲连接,且连接数没有超出最大值,创建一个新的
数据库连接
4.将用户不在使用的连接标识为可用的,等待其他用户请求
5.当空闲的连接数过多时,释放连接对象

连接池组件都需要实现JDBC规范中的javax.sql.DataSource接口
DataSource接口中定义了获取连接的方法getConnection方法

常用的连接池组件:
DBCP,C3P0,proxool等

以Apach的DBCP组件为例实现数据库连接池

方案:
1.导包
commons-dbcp-1.2.2.jar
commons-pool-1.3.jar

2.重构db.properties
2.1初始化连接
dataSource.initialSize = 10
2.2最大空闲连接
dataSource.maxIdle = 20
2.3最小空闲连接
dataSource.minIdle = 5
2.4最大的连接数量
dataSource.maxActive = 50
超时回收时间(超时等待时间以毫秒为单位)
dataSource.maxWait = 1000

3.创建ConnectionSource

4.使用ConnectionSource类获取连接对象
conn.close()
并不一定真的关闭对象,有可能是归还到连接池中


sql Injection简介:
select * from t_emp where name='' and salary = 'a' or 'b' = 'b';
此SQL语句的where条件永远成立.
这种现象称为sql注入

对于JDBC而言,sql注入攻击只对Statement有效,,对于PreparedStatement无效.
因为PreparedStatement不允许在插入参数时改变SQL语句的逻辑结构

使用预编译的语句对象,用户传入的任何数据不会和原SQL语句发生匹配关系,无需
对输入的数据做过滤

如果用户将"or 1=1"传入赋值给占位符,SQL语句将无法执行.
 

猜你喜欢

转载自blog.csdn.net/CXY_ZPH/article/details/85156817