JDBC 拼搏现实的明天。 2021-11-10 07:31 313阅读 0赞 **目录** 一、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语句的格式,这样就算用户输入中包含关键字也可以避免注入的发生。 [Two-tier-Architecture-for-Data-Access]: /images/20211109/2522df954a1f4d25bce19e3f6a0261e8.png [Three-tier-Architecture-for-Data-Access]: /images/20211109/152cbda51375463f8daad302b5513541.png
相关 jdbc教程_JDBC教程 jdbc教程 Welcome to JDBC tutorial. Java DataBase Connectivity (JDBC) is one of the most w 今天药忘吃喽~/ 2023年02月28日 05:59/ 0 赞/ 21 阅读
相关 jdbc 1.Jbdc 1.1 DriverManager java.sql 类 DriverManager java.lang.Object java.sql 我就是我/ 2022年06月11日 06:58/ 0 赞/ 141 阅读
相关 JDBC 1. JDBC(Java数据库连接)概念: 是用于执行SQL语句的API,可以为多种关系数据库提供统一访问,由一组Java语言编写的类和接口组成。 JDBC为工具/数据库 喜欢ヅ旅行/ 2022年06月07日 12:23/ 0 赞/ 253 阅读
相关 JDBC JAVA 访问数据库的技术: Jdbc是一种Java连接数据库技术(Java database connectity), 它是 Java 提供的一些接口,这些接口大部分是数据 桃扇骨/ 2022年05月22日 04:35/ 0 赞/ 135 阅读
相关 JDBC 所需jar包 oracle:ojdbc6.jar(在oracle数据库文件夹下的jdbc/lib下能找到) mysql:mysql-connector-java-5.1 向右看齐/ 2022年04月08日 10:59/ 0 赞/ 114 阅读
相关 JDBC [https://www.cnblogs.com/centor/p/6142775.html][https_www.cnblogs.com_centor_p_6142775.h 女爷i/ 2022年01月31日 05:45/ 0 赞/ 397 阅读
相关 JDBC [JDBC][] JDBC:JAVA DATA BASE CONNECTIVITY 1、SQL语言: (1) 数据定义语言:create、alter、drop (2) 喜欢ヅ旅行/ 2021年12月19日 16:25/ 0 赞/ 219 阅读
相关 JDBC 目录 一、JDBC架构 二、数据库连接 三、常用接口 四、事务 五、SQL注入 -------------------- 一、JDBC架构 JDBC有双层架 拼搏现实的明天。/ 2021年11月10日 07:31/ 0 赞/ 314 阅读
相关 JDBC import java.security.Provider; import java.sql.DatabaseMetaData; import java 小鱼儿/ 2021年09月11日 07:46/ 0 赞/ 279 阅读
还没有评论,来说两句吧...