JDBC原理:java Database Connectivity:java访问数据库的解决方案.
希望用相同的方法访问不同的数据库,以实现与具体数据库无关的java操作页面.
JDBC定义了一套标准接口,及访问数据库通用的API,不同的数据库产商根据各自的数据库的特点去实现这些接口.
具体实现是由数据库产商去实现的.
JDBC接口以及数据库产商实现
DriverManager ----驱动管理
.Connection ----连接接口
.Statement
.PreparaedStatement ---语句对象接口(防止sql注入,因为是预编译的)
.ResultSet ----结果集接口
JDBC原理:
1.JDBC定义接口
2.数据库产商实现接口
3.程序员调用接口,实际调用的是底层数据库产商的实现部分.
JDBC的工厂过程:
-加载驱动,建立连接
-创建语句对象
-执行sql语句
-处理结果集
-关闭连接
ResultSet:
查询的结果存放在ResultSet对象的一系列行中
.ResultSet对象的最初位置在行首
.ResultSet.next()方法用来在行间进行移动
.ResultSet.getXXXX()方法来取得字段的内容.
JDBC基础编程(写配置文件,封装)
通过连接工具类获取连接
在工程中,编写一个访问数据的工具类,此后所有访问数据库的操作都从工具类中获取连接
.两种方式:
-直接把数据配置写在工具类中
-把数据库配置写在一个properties属性文件中,工具类读取属性文件,逐渐获取数据库连接参数(建议使用第二种)
通过属性文件维护连接属性
#驱动类名
jdbc.driver=oracle.jdbc.OracleDriver
#jdbc连接字符串
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:xe
#访问数据的用户名
jdbc.user=system
#访问数据的密码
jdbc.password=orcl
在properties属性文件#表示注释
从类路径加载属性文件
String path = "文件的url";
properties.load(DBUtility.class.getClassLoader().getResourceAsStream(path));
连接的关闭:
public static void closeConnection(){
if(conn!=null){
try{
conn.close();
}cathch(SQLException e){
e.printStaicTrace();
}
}
}
练习:封装DBUtility,提供连接的获取和关闭
将数据库的获取和关闭封装到DBUtility类中,并实现对t_emp表中的数据的查询
1.创建属性db.properties,在该文件中以键值对的形式来存储连接数据库的相关信息
#驱动类名
jdbc.driver=oracle.jdbc.OracleDriver
#jdbc连接字符串
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:xe
#访问数据的用户名
jdbc.user=system
#访问数据的密码
jdbc.password=orcl
这样做的目的是当需要修改连接时,只需要修改文件集合,降低了连接数据库的信息与使用类之间的耦合
2.创建DBUtility类,使用static块.初始化连接数据信息.
static{
try{
//加载配置文件
String path = "文件的url";
properties.load(DBUtility.class.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.printStackTrace();
}
}
连接池技术
直接使用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.1最大空闲连接
dataSource
dataSource.maxIdle=20
2.3最小空闲连接
dataSource.minIdle=5
2.4最大的连接数量
dataSource.maxActive=50
超时回收时间(超时等待时间以毫秒为单位)
dataSource.maxWait=1000
3.创建ConnectionSource类
4.使用ConnectionSource类获取连接对象
conn.close();
并不一定真的关闭连接对象,有可能是归还到连接池中.
sql Injection简介
此sql语句where条件永远成立
这种现象称为sql注入,
对于JDBC而言,sql注入只对Statment有效,对于PreparedStatement无效
因为PreparedStatement不允许在插入参数时改变Sql语句的逻辑结构.
使用预编译的语句对象,用户传入的任何数据不会和原SQL语句发生匹配关系,无需对输入的数据做过滤
如果用户将"or 1 = 1"传入值赋值给占位符,SQL语句将无法执行.
or'1'='1'
JDBC高级编程
.事务简介
.事务:(Transaction)数据库中 保证交易可靠的机制
.JDBC支持数据库中的事务概念
.在JDBC中,事务默认是自动提交的.
为什么要用事务:
A转账到B
1.A账户扣除1000元
2.B账号增加1000元
ps:为什么要用事务:因为我们必须要保证1,2两个步骤必须在一个事务中完成.
事务的特性:ACID:
原子性:(Atomicity):事务必须原子工作单元,对于其数据修改,要么全部执行要么全部不执行
一致性:(Consistency):事务在完成时,必须是使得所有的数据都保持一致状态.
隔离性:(Isolation):由并发事务所做的修改必须与任何其他并发事务所做的修改隔离.
持久性:(Durability):事务完成之后,他对于系统的影响是永久性的.
JDBC事务API
.获取当前事务的提交方式,默认为true
Connection.getAutoCommit();
.设置事务的提交属性,参数是true(自动提交)和false(不自动提交)
Connection.setAutoCommit();
.提交事务
Connection.commit();
.回滚事务
Connection.rollback();
练习:从A账户转账到B账户500元
方案:需要使用事务将两次新操作装成一个逻辑单元,要么完全执行,要么就不执行,保证数据的完整性
第一步:创建Account表,并插入测试数据
第二步:新建类Trans,完成数据库的连接和转账操作
208

被折叠的 条评论
为什么被折叠?



