JDBC

目录

一、JDBC架构

二、数据库连接

三、常用接口

四、事务

五、SQL注入


一、JDBC架构

JDBC有双层架构三层架构两种,它们都要求 Driver 能与访问的数据库交互。

双层架构中应用可直接访问数据源,进行交互,但这种方法不太安全。

Two-tier-Architecture-for-Data-Access

三层架构引入了中间层服务,应用通过中间层访问数据源进行交互,这种方式增加了访问控制,也能够简化应用的部署。

Three-tier-Architecture-for-Data-Access

二、数据库连接

数据库可以采用连接池的方式,这样降低程序耦合性,更方便引用数据库连接

连接池包含:自定义连接池,c3p0连接池,dcbp连接池

连接池:用池来管理Connection,这样可以重复使用Connection。连接池会自己创建Connection,使用时通过池来获取Connection对象,当使用完后再将Connection归还到池中去,池就可以再利用这个Connection。

1、自定义连接池

自己建立的数据库连接文件,包含连接数据库方法、释放资源(关闭数据库)、数据库的一些基本操作方法。

2、c3p0连接池

通过 c3p0-config.xml配置文件获取连接,它是一个免费开源的连接池,被广泛使用。

使用方法是先在工程里导入jar包(c3p0-0.9.1.2.jar),然后创建c3p0-config.xml(必须是此文件名),c3p0-config.xml会自动调用,里面包含的内容是数据库的连接信息(包含登录名密码之类的以及一些数据库属性配置)。使用的话就是编写工具类,在工具类当中写数据库的基本操作方法,之后就在应用到的时候调用相应方法就好了。下面是c3p0-config.xml文件的编写例子:

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <!-- 默认读的配置文件 -->
    <default-config>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/internship</property>
        <property name="user">root</property>
        <property name="password">123456</property>
        <property name="minPoolSize">10</property>
        <property name="initialPoolSize">5</property>
    </default-config>

    <!-- 额外的,备用的数据库,比如oracle -->
    <named-config name="mydb">
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/internship</property>
        <property name="user">root</property>
        <property name="password">123456</property>
        <property name="minPoolSize">10</property>
        <property name="initialPoolSize">5</property>
    </named-config>
</c3p0-config>

3、dcbp连接池

通过db.properties配置文件获取连接,也是一个开源连接池。

使用之前也要先导入相应jar包(commons-dbcp-1.4.jar,commons-pool-1.5.6.jar)然后编写配置文件(dbinfo.properties)和工具类,dbinfo.properties编写例子:

user=root
password=123456
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/internship

三、常用接口

1.Driver接口

Driver接口是用来装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。

常用的有:

  1. 装载MySql驱动:Class.forName("com.mysql.jdbc.Driver");
  2. 装载Oracle驱动:Class.forName("oracle.jdbc.driver.OracleDriver");

2.Connection接口

Connection与特定数据库的连接(会话),在连接上下文中执行sql语句并返回结果。

连接MySql数据库:

Connection conn = DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");

连接Oracle数据库:

Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@host:port:database", "user", "password");

连接SqlServer数据库:

Connection conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://host:port; DatabaseName=database", "user", "password");

常用方法:

  1. createStatement():创建向数据库发送sql的statement对象。
  2. prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。
  3. prepareCall(sql):创建执行存储过程的callableStatement对象。
  4. setAutoCommit(boolean autoCommit):设置事务是否自动提交。
  5. commit() :在链接上提交事务。
  6. rollback() :在此链接上回滚事务。

3.Statement接口

用于执行静态SQL语句并返回它所生成结果的对象。

三种Statement类:

  1. Statement:由createStatement创建,用于发送简单的SQL语句(不带参数)。
  2. PreparedStatement :继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement。
  3. CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程。

常用Statement方法:

  1. execute(String sql):运行语句,返回是否有结果集
  2. executeQuery(String sql):运行select语句,返回ResultSet结果集。
  3. executeUpdate(String sql):运行insert/update/delete操作,返回更新的行数。
  4. addBatch(String sql) :把多条sql语句放到一个批处理中。
  5. executeBatch():向数据库发送一批sql语句执行。

4.ResultSet接口

ResultSet提供检索不同类型字段的方法,还提供对结果集进行滚动的方法:

  1. next():移动到下一行
  2. Previous():移动到前一行
  3. absolute(int row):移动到指定行
  4. beforeFirst():移动resultSet的最前面。
  5. afterLast() :移动到resultSet的最后面。

使用后依次关闭对象及连接:ResultSet → Statement → Connection

四、事务

首先解释一下什么是事务:

数据库中一些操作的集合是一个独立的单元,事务就是构成单一逻辑工作单位的集合。事务是为解决数据安全操作提出的,事务控制实际上就是控制数据的安全访问。而未能成功完成的事务变成中止事务,对中止事务造成的变更需要进行撤销处理,称为事务回滚

事务是必须满足4个条件(ACID)

  1. 原子性( Atomicity):一组事务,要么成功;要么撤回。
  2. 一致性 (Consistency):事务执行后,数据库状态与其他业务规则保持一致。如转账业务,无论事务执行成功否,参与转账的两个账号余额之和应该是不变的。
  3. 隔离性(Isolation):事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
  4. 持久性(Durability):软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit 选项 决定什么时候吧事务保存到日志里。

1、JDBC中的事务 

在JDBC中处理事务,都是通过Connection完成的。

同一事务中所有的操作,都在使用同一个Connection对象。

Connection的三个方法与事务有关:

setAutoCommit(boolean):设置是否为自动提交事务,如果true(默认值为true)表示自动提交,也就是每条执行的SQL语句都是一个单独的事务,如果设置为false,那么相当于开启了事务了;con.setAutoCommit(false) 表示开启事务。

commit():提交结束事务。

rollback():回滚结束事务。

2、事务并发

事务并发就是不同事务对同一部分数据进行操作。

(1)事务并发处理可能引起的问题

  1. 脏读(dirty read):一个事务读取了另一个事务尚未提交的数据。即当A和B事务并发执行,当A事务操作后B事务读取的是A还没有提交的数据,此时A事务回滚,B事务这是胡独到的数据就是”脏数据“。
  2. 不可重复读(non-repeatable read):一个事务的操作导致另一个事务前后两次读取到不同的数据。即B事务查询数据后A事务更新操作更改了B事务中读取到的数据,此时B读取的是两次不同的数据。
  3. 幻读:一个事务的操作导致另一个事务前后两次查询到的结果数据量不同。即B事务查询操作后A事务更啊改了B查询的数据的记录,此时B事务再次读取查询就会发现前面某个记录不见了(被更改)。

3、事务隔离级别

JDBC提供了5种不同的事务隔离级别。在Connection中进行了定义。

  1. TRANSACTION_NONE:JDBC不支持事务
  2. TRANSACTION_READ_UNCOMMITTED:允许脏读、不可重复读和幻读
  3. TRANSACTION_READ_COMMITTED:禁止脏读,但允许不可重复读和幻读
  4. TRANSACTION_REPEATABLE_READ:禁止脏读和不可重复读,单可以幻读
  5. TRANSACTION_SERIALIZABLE:禁止脏读、不可重复读和幻读

五、SQL注入

SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,最终达到欺骗服务器执行恶意的SQL命令。简单来说,就是黑客利用SQL漏洞,对数据库进行窃取。

而导致SQL注入的主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。即由于没有对用户输入进行充分检查,而SQL又是拼接而成,在用户输入参数时,在参数中添加一些SQL 关键字,达到改变SQL运行结果的目的,也可以完成恶意攻击。

JDBC中存在有防止恶意注入的方式:

1、将sql语句设置为预编译,即使用PrepareStatement ps代替Statement st。

2、使用占位符"?"代替字段值,固定sql语句的格式,这样就算用户输入中包含关键字也可以避免注入的发生。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值