#博学谷IT学习技术支持#
一、为什么使用JDBC
针对不同的的关系型数据库,我们需要编写不同的java代码进行使用。当我们开发时,使用的是Mysql数据库,而上线时需要使用Oracle数据库,我们就需要大批量的修改代码。这明显不是我们想要看到的情况,我们希望的情况是一套java代码操作所有关系型数据库。JDBC便是sun公司推出的一套标准接口,而各个厂商针对改接口提供的实现类便是驱动。
二、JDBC快速入门
- 创建工程,导入数据库连接jar包
- 注册驱动
Class.forName("com.mysql.jdbc.Driver");
- 定义基本数据(url,username,password)
String username = "root";
String password = "1234";
String sql = “update account set money = 2000 where id = 1” ;
- 获取连接
Connection conn = DriverManager.getConnection(url, username, password);
Java代码需要发送SQL给MySQL服务端,就需要先建立连接
-
获取执行SQL对象
执行SQL语句需要SQL执行对象,而这个执行对象就是Statement对象
Statement stmt = conn.createStatement(); -
执行SQL
stmt.executeUpdate(sql); -
处理返回结果
-
释放资源
源码:
//1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2. 获取连接
String url = "jdbc:mysql://127.0.0.1:3306/db1";
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url, username, password);
//3. 定义sql
String sql = "update account set money = 2000 where id = 1";
//4. 获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//5. 执行sql
int count = stmt.executeUpdate(sql);//受影响的行数
//6. 处理结果
System.out.println(count);
//7. 释放资源
stmt.close();
conn.close();
三、API详解
-
DriverManager作用:注册驱动
- registerDriver方法是用于注册驱动的,但是这里却使用了
查看Driver类的源码便可以发现,在它的静态代码块里已经使用DriverManager来调用registerDriver方法进行注册了。Class.forName("com.mysql.jdbc.Driver");
所以我们只需要加载Driver类,静态代码块便会执行。而这里使用反射来进行加载Driver类。static{ try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } }
- registerDriver方法是用于注册驱动的,但是这里却使用了
-
Connection:获取与指定的URL连接
- 当使用的是本地的mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对
- 配置 useSSL=false 参数,禁用安全连接方式,解决警告提示
- 作用:获取执行SQL的对象;管理事务
-
获取SQL的普通对象
Statement stmt = conn.createStatement(); -
【重要】 获取SQL的预编译的对象
Statement stmt = conn.prepareStatement(sql)该对象用于防止SQL注入现象
-
Statement:
- 执行DDL,DML语句时使用 int executeUpdate(String sql) 方法,执行DDL也可能不返回内容
- 执行DQL语句使用ResultSet executeQuery(String sql) 方法,返回值为ResultSet
-
ResultSet:提供了从结果集中获取数据的方法
- boolean next():将光标从当前位置向前移动一行;判断当前行是否为有效行
- Xxx getXxx(参数):获取数据
- 例:int getInt(1):获取id为1的数据
- String getString(“name”):获取名字为name的数据
-
【重要】 PreparedStatement:
- SQL注入: sql注入是通过修改定义好的sql语句,来进行对服务器的攻击
例如:模拟登录案例,用户名随意输入,而密码输入
你可能并不懂这有什么意义,可是结合我们java代码中预先定义的sql来进行分析' or '1' = '1
拼接到sql语句中便成了String sql = "select * from tb_user where username = '" + name + "'and password = '" + pwd + "'"
这样无论用户名和密码满不满足条件,后面的 1 = 1 始终满足条件,用or连接,最终是成立的,就可以直接登录了select * from tb_user where username = 'sadsad' and password = ' ' or ' 1 ' = ' 1 ' - 作用: 预编译SQL语句并执行:预防SQL注入问题
- 在获取了PreparedStatement的对象之后,上面sql中的从参数会使用?来占位使用。所以使用之前我们需要进行值的设置
按照位置设置,第一个?便是1,第二个?是2,依次排序。 例如:pstmt.setString(1, name);
便可以进行执行sql了,方法中无需传入sql,因为之前已经预编译了。 - 如何解决的SQL注入问题:它会将特殊的字符进行了转义
select * from tb_user where username = 'sadsad' and password = ' ' or ' 1 ' = ' 1 ' - 实际上,之前我们并没有开启预编译的功能,只是解决了SQL注入的问题,在url中加上该参数开启预编译
useServerPrepStmts=true
- SQL注入: sql注入是通过修改定义好的sql语句,来进行对服务器的攻击
以上便是关于JDBC的入门使用及其API的讲解,如有不足,请指正。
本文介绍了使用JDBC的原因,它是sun公司推出的标准接口,可让一套Java代码操作所有关系型数据库。还给出了JDBC快速入门步骤,包括创建工程、注册驱动、获取连接等。此外,对JDBC的API进行了详细讲解,如DriverManager、Connection、Statement等,重点提及PreparedStatement可预防SQL注入。
1136

被折叠的 条评论
为什么被折叠?



