JDBC

    
  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();

 

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值