一、JDBC的概念
1.概念:Java数据库连接,(Java Database Connectivity 简称:JDBC),是java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
2.JDBC API 是一系列接口,它使得应用程序能够进行数据库连接,执行SQL语句,并得到返回结果。
3.Driver接口
(1)java.sql.Driver 接口是所有JDBC驱动程序需要实现的接口,这个接口是提供给数据库厂商使用的,不同的数据库厂商提供不同的实现。
(2)在程序中不需要直接去访问实现了Driver接口的类,而是由驱动管理器类(java.sql.DriverManager)去调用这些Driver实现。
(最终是以不同的jar包出现在项目中的)
(3)加载与注册JDBC驱动
①加载JDBC驱动调用Class类的静态方法forName(),向其传递要加载的JDBC驱动的类名,DriverManager类是驱动程序管理器类,负责管理驱动程序。
forName()放驱动的类名
②通常不用显示调用DriverManager类的registerDriver() 方法来注册驱动程序类的实例,因为Driver接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用 DriverManager.registerDriver() 方法来注册自身的一个实例。
(4)常见的几种JDBC驱动类名:
类 型 JDBC驱动程序名称
MySQL com.mysql.jdbc.Driver
SQLServer com.microsoft.sqlserver.jdbc.SQLServer.Driver
ORACLE oracle.jdbc.driver.OracleDriver
DB2 com.ibm.db2.jdbc.net.DB2Driver
eg: Class.forName(“com.mysql.jdbc.Driver”)
(5)建立连接
可以调用DriverManager类的getConnection()方法建立到数据库的连接对象Connection. (Connection在java.sql.Connection包下)
Connection conn = DriverManager.getConnection(url,username,passwor)
url用于标识一个被注册的驱动程序,驱动程序管理器通过这个URL选择正确的驱动程序,从而建立到数据库连接(username 用户名,password 密码)
(6).JDBC URL的标准由三部分组成,各部分间用冒号分隔:
Jdbc : mysql: // localhost:3306/test(数据库名)
协议 子协议 子名称
①. jdbc:<子协议>:<子名称>.
②协议:JDBC URL中的协议总是jdbc
③子协议:子协议用于标识一个数据库驱动程序
④.子名称:一种标识数据库的方法,子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息。
一个Connection 对象代表一个数据库连接,如果获取到了Connection,说明连接到了数据库
(7).常用数据库对应的JDBC URL
RDBMS URL格式
MySQL jdbc:nysql://[hostName]:[portNumber][databaseName] 中括号要被替换的(IP地址)
SQLServer jdbc:sqlserver://[hstName]:[portNumber];
DatabaseName=[databaseName]
ORACLE jdbc:oracle:thin:@hostName:[porNumber]:[databaseName]
DB2 jdbc:db2:[hostName]:[portNumber]//[databaseName]
[hostName]:ip地址,一般本机为127.0.01
[portNumber]:数据库服务的端口,一般情况下:mysql为3306;SQLServer为1433
[databaseName]:我们所建立的数据库的名称
(8).访问数据库
数据库连接被用于向数据库服务器发送命令和SQL语句,在连接建立后,需要对数据库进行访问,执行SQL语句
在java.sql包中有3个接口分别定义了对数据库的调用的不同方式:
Statement PrepatedStatement CallableStatement
4.Statement.接口
通过调用Connection对象的createStatement()方法创建对象,该对象用于执行静态的SQL语句,并且返回执行结果
Statement接口中定义了下列方法用于执行SQL语句
ResultSet excuteQuery(String sql()) 查询的
Int excuteUpdate (String sql()) 更新的
(更新有三个,增 删 改)
5.PrepatedStatement
可以通过调用Connnection对象的PreparedStatement()方法获取
①PreparedStatement接口是Statement的子接口,它表示一条预编译过的SQL语句
②PreparedStatement对象所代表的SQL语句中的参数用问号(?)来表示调用
③PreparedStatement对象的setxxx()方法来设置这些参数 setxxx()方法有两个参数
(1)参数是设置的sql语句中的参数的索引(从1开始)
(2)设置的sql语句种的参数的值
6. PreparedStatement和Statement区别:
(1)代码的可读性和可维护性
(2)PreparedStatement能最大可能提高性能:
①DBServer会对预编译语句提供性能优化
②PreparedStatement可以防止SQL注入
7.ResultSet 接口
(1).通过调用Statement对象的excuteQuery()方法创建该对象。Resultset对象以逻辑表格的形式封装了执行数据库操作的结果集,Resultset接口由数据库厂商实现。
(2).Resultset对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过Resultset对象的next()方法移动到下一行。
(3).Resultset接口的常用方法:
Boolean next() 获取数据
Sting getString()
Int getInt()
8.释放关闭资源
Connection PreparedStatement statement Resultset等资源使用完毕后必须进行关闭,类似IO流关闭是一样的,常使用close()方法进行关闭
9.使用直连操作数据库
<1>加载jdbc驱动程序(项目中添加驱动包)
<2>使用DriverManger建立到数据库的连接
<3>准备sql语句
<4>使用Statement访问数据库
<5>使用ResultSet或者int接收访问数据库的反馈结果
<6>对结果进行输出或展示
<7>关闭资源
二.SQL注入攻击
1.当应用程序使用输入内容来构造动态,sql语句以访问数据库时,会发生sql注入攻击,所谓的SQL注入,就是通过把SQL命令插入到Web表单递交或输入域或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
2.Stringsql=”select id from users where username=””+username+“ ” and password=””+password+””;
这里的username和password都是我们存取从web表单获得的数据,来看一下简单地注入,如果我们在表单中username的输入框中输入 or 1=1- ,password的表单中随便输入一些东西,假如这里输入123,此时我们所执行的sql语句为:
select id from users where username=”or 1=1- and password=’123’”
因为1=1是true,后面and password=’123’被注释掉了,所以完全跳过了sql验证
3.如何防止SQL注入攻击
(1)Sql注入攻击是指利用设计上的漏洞,在目标服务器上运行_Sql 语句以及进行其他方式的攻击,动态生成Sql语句时没有对用户输入的数据进行验证是Sql注入攻击得逞的主要原因。
(2)对于Java数据库连接JDBC而言SQL注入攻击只对Statement有效,对preparedStatement是无效的,这是因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构。
4. PreparedStatement相对Statement有以下优点:
(1). 防注入攻击、
(2).多次运行速度快
(3)防止数据库缓冲区溢出,
(4).代码的可读性可维护性好.
这四点使得PreparedStatement成为访问数据库的语句对象的首选,缺点是灵活性不够好,有些场合还是必须使用Statement.
5.此类SQL注入攻击可以使用两种方案:
(1).对提交的动态Sql语句检查是否含有’or 1=1’日’等类似情况,并做出相应禁止措施。
(2)使用PerparedStatement替换Statement.