Jdbc:sun给出的一套标准(接口),该标准规定了如何连
接数据库,具体的实现是由各大数据库运营商提供实现
接口
java.sql.Driver 驱动程序的接口
java.sql.Connection 获取连接(通信信道)
java.sql.Statement
Java.sql.PreparedStatment 对sql编译
java.sql.ResultSet 结果集(存储的是数据库返回
的结果(select))
类
java.sql.DriverManager 对驱动程序进行管理
连接数据库的六大步奏:
1.第一步:注册驱动 (告知JVM连接的数据库是谁..)
2.第二步:获取连接对象(基于协议连接数据库,并且验证用户名
和密码是不是正确)
3.第三步:构建Statement和PreparedStatement对象
(对sql语句编译)
4.第四步:执行sql语句
5.第五步:看第四步有没有结果返回,有结果返回处理结果集
没有结果集返回,直接忽略该步;
6.关闭资源(先开后关)
Jdbc连接数据库的4中驱动方式
1.jdbc-odbc桥接方式
要求使用者必须安装jdbc-odbc驱动程序,该程序是二进制
(e.g.: oil.dll),执行过程:
Java程序- ->odbc借助驱动java代码编程成标准的数据库
语言->数据库
优点:安装驱动可以连接上所有的数据库
缺点:用户要安装驱动
2.本地API驱动
要求用户安装驱动包(针对某一个数据库的),其实就是代码库
执行流程:
java程序->代码库->数据库
3.网络协议驱动
需要安装jdbc-odbc驱动或本地api驱动的服务器作为中介
执行的流程:
java程序-(网络)->网络服务器(转换)->数据库
优点:用户不需要安装任何驱动,并且驱动更新方便
缺点:用到网络。
4,本地api协议
数据库运营商基于sun公司提供接口,按照规范实现的代码,
具体体现jar包,用户使用只需要下载jar包,
oracle14_g.jar 测试包
Oracle14.jar 开发包
注册驱动
1.
Class.forName(“oracle.jdbc.driver.OracleDriver”);
Connection conn=
DriverManager.getConnection(url, user,password);
2.手动注册驱动
Driver driver=new OracleDriver();
DriverManager.registerDriver(driver);
Connection conn=
DriverManager.getConnection(url, user,password);
3注册驱动给虚拟机传如参数
System.setProperty(“jdbc.drivers”,”oracle.jdbc.driver.OracleDriver”)
Connection conn=
DriverManager.getConnection(url, user,password);
4注册驱动给虚拟机传如参数、
第一步:
Connection conn=
DriverManager.getConnection(url, user,password);
第二步,点击程序右键-》run as ->run Configuration
-> arguments->VM arguments->
文本框填入-Djdbc.drivers=oracle.jdbc.driver.OracleDriver
->run直接运行
注意:运行的时候给虚拟机传参数=前后必须不能有空格
获取连接对象
1.Connection conn=
DriverManager.getConnection(url, user,password);
2.
Properties pro=new Properties();
pro.setProperty(“user”,”jd1812”);
pro.setProperty(“password”,”bruin”);
Connection conn=
DriverManager.getConnection(url, pro);
执行sql语句
1.execute() 返回的结果boolean,boolean表示
表示是否有结果集返回(select),有为true,其他情
况都为false
2.executeUpdate() 返回的结果int,int表是对数据库
影响的行计数
3.executeQuery() 返回的结果resultSet,一般情况
存放的是select查询的结果集,
注意:3种方式都可以执行各种sql语句,看你需要什么
样的结果
类和表有对应关系的
一个java类对应数据库中的一张表
一个java对象对应数据库中的一行数据
注意:数据库表中的列名(不包含维护关系的列)
就是类中的属性
PreparedStatement和Statemnet区别
PreparedStatement是Statemnet的子类
PreparedStatement执行的是同构的sql语句,Statemnet执行的是
异构的sql语句;
PreparedStatement执行sql语句的时候只编译一次sql语句并且可以
采用占位符?,Statemnet每执行一条sql语句都要编译,
PreparedStatement可以执行批处理,Statemnet不执行批处理
同构:sql语句结构一样(表名,参数的个数和顺序一样,值不一样)
insert into s_tea values(1,’tom’,34);
insert into s_tea values(2,’tom1’,34);
insert into s_tea values(3,’tom2’,34);
insert into s_tea values(4,’tom3’,34);
同构:sql语句结构不一样(表名,参数的个数和顺序不一样)
insert into s_tea values(4,’tom3’,34);
select * from s_tea;
insert into s_tea(id, name) values(4,’tom3’);
事物的隔离级别
隔离级别的由来:两个并发事务同时访问数据库表相同的行时,
可能出现的问题。
1.脏读:事务T1更新了一行记录,还未提交所做的修改,这个
T2读取了更新后的数据,然后T1执行回滚操作,取消刚才的修
改,所以T2所读取的行就无效,也就是脏数据。
2.不可重复读取:事务T1读取一行记录,紧接着事务T2修改了
T1刚刚读取的记录,然后T1再次查询,发现与第一次读取的记
录不同,这称为不可重复读。
3.幻读:事务T1读取一条指定where条件的语句,返回结果
集。此时事务T2插入一行新记录,恰好满足T1的where条件。
然后T1使用相同的条件再次查询,结果集中可以看到T2插入的
记录,这条新记录就是幻想。
针对上述出现的问题,解决方案:
1.READ UNCOMMITTED 幻想读、不可重复读和脏读都允许。
一个会话可以读取其他事务未提交的更新结果,如果这个事务
最后以回滚结束,这时的读取结果就可能是不正确的,所以
多数的数据库都不会运用这种隔离级别。
2.READ COMMITTED 允许幻读、不可重复读,不允许脏读。
一个会话只能读取其他事务已提交的更新结果,否则,发生等待,
但是其他会话可以修改这个事务中被读取的记录,而不必等待事
务结束,显然,在这种隔离级别下,一个事务中的两个相同的读
取操作,其结果可能不同。
3.REPEATABLE READ 允许幻读,不允许不可重复读和脏读
。在一个事务中,如果在两次相同条件的读取操作之间没有添加记
录的操作,也没有其他更新操作导致在这个查询条件下记录数增多,
则两次读取结果相同。换句话说,就是在一个事务中第一次读取的
记录保证不会在这个事务期间发生改动。
4.SERIALIZABLE 幻想读、不可重复读和脏读都不允许。串读,
一个事物结束之后另外一个事物才可以开始,效率低
四种隔离级别对比
隔离级别 脏读 不可重复读 幻读
Read uncommitted √ √ √
Read committed × √ √
Repeatable read × × √
Serializable × × ×
注意:Oracle数据库支持READ COMMITTED 和 SERIALIZABLE
这两种事务隔离级别。
数据库sqlplus工具设置隔离级别使用
SET TRANSACTION ISOLATION LEVEL
[READ UNCOMMITTED|READ COMMITTED|
REPEATABLE READ|SERIALIZABLE]
数据连接池的使用:
每次连接如果都是新创建出来的,一次连接用完了就释放掉,其实对网
络资源比较浪费,因为链接的创建是很占用资源的,如果建立过多的连
接会导致内存溢出,此外如果程序异常关闭,从而导致链接不能正常关
闭,那么也会有内存泄漏此外,我们希望对已经获取到的链接进行重用,
进行用数据库连接池负责分配,管理和释放数据库链接,它允许应用
程序重复使用一个现有的数据库连接,而不是每次新建
jdbc的数据库连接池使用javax.sql.DataSource来表示,
DataSource只是一个接口,该接口通常由服务器提供实现,也有一些
开源组织提供实现
1.dbcp是由apache 提供的数据源实现
(1)导入jar commons-dbcp commons-pool commons-logging
(2)在配置文件中构建配置信息,配置信息如下
#连接设置
driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@192.168.1.102:1521:XE
username=briup
password=briup
#初始化连接数
initialSize=5
#最大连接数
maxActive=5
#最大空闲连接
maxIdle=3
#最小空闲连接
minIdle=2
#超时等待时间 ms
maxWaitMillis=6000
#jdbc 驱动建立连接时除了user和password以外的其他属性
connectionProperties=useUnicode=true;characterEncoding=utf8
#指定由连接池所创建的连接的自动提交状态
defaultAutoCommit=true
#连接创建的连接是只读状态
defaultReadOnly=true
#事务隔离级别
#defaultTransactionIsolation=READ_COMMITED
(3)编写java程序构建Connection
Properties pro = new Properties();
pro.load(new FileInputStream("src/dbcpconfig.properties"));
BasicDataSource bds = BasicDataSourceFactory.createDataSource(pro);
Connection conn = bds.getConnection();
2.c3p0数据源
(1)导入c3p0的jar包
(1)创建c3p0-config.xml配置文件 放在类的路径下
(2)配置信息的构建
<c3p0-config>
<named-config name=“oracle”>
<!-- 指定基本属性-->
<property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
<property name="jdbcUrl">jdbc:oracle:thin:@192.168.1.102:1521:XE</property>
<property name="user">briup</property>
<property name="password">briup</property>
<!--连接池在无空闲连接可用时一次性创建的新数据库连接数,default : 3-->
<property name="acquireIncrement">5</property>
<!-- 初始化连接数量 ,default : 3-->
<property name="initialPoolSize">5</property>
<!-- 连接池中最小的连接数 ,default : 3-->
<property name="minPoolSize">5</property>
<!-- 连接池中最大的连接数 default : 15-->
<property name="maxPoolSize">5</property>
<!-- 连接池所维护的statement的个数-->
<property name="maxStatements">25</property>
<!-- 每个连接同时可以使用的statement的个数-->
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>
(3)编写程序获取Connection对象
//参数为配置文件中 某个配置的名字
ComboPooledDataSource ds = new ComboPooledDataSource(“oracle”)
ds.getConnection();