文章目录
一、JDBC简介
1. JDBC概念
JDBC(Java DateBase Connection)
Java数据库连接,它是JavaEE(Java企业级开发)的一种数据库连接规范。
市面上会有很多不同的数据库厂商,他们中的SQL语句都大同小异,但是每种SQL都会有自己的方言,比如:分页操作(MySQL使用 limit
;Oracle使用 rownum
;SqlServer使用 top
)… ;所以Java针对这些不同的情况提供了一个Java代码连接数据库的规范,这种规范就是我们说的JDBC,而不同的数据库厂商根据Java提供的这些规范(接口),实现了不同数据库对于JDBC的支持(实现接口,并重写方法)。
2. JDBC作用
通过Java代码实现对于不同种类数据库的操作。
JDBC是 Java代码与数据库之间的桥梁(连接)。
二、JDBC的简单使用
Maven项目导入依赖
<!-- 连接MySQL数据库的依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
1. JDBC的执行步骤
- 注册驱动
- 获取数据库连接对象
- 创建执行SQL语句对象
- 执行SQL语句(
Statement
、PreparedStatement
) - 处理结果集(
ResultSet
一般在查询时才会有这一步) - 关闭连接
常用接口解释
JDBC常用接口 | 作用 |
---|---|
Driver | 数据库驱动接口 |
DriverManager | 管理驱动,可以用来获取数据库连接 |
Connection | 数据库连接对象,用于建立Java代码和数据库之间的连接 |
Statement | 执行SQL语句对象 |
PreparedStatement | 执行SQL语句对象 |
ResultSet | 结果集,用于获取查询语句的结果 |
2. JDBC的执行步骤案例(查)
// 1)获取数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2)获取连接对象
String url = "jdbc:mysql://localhost:3306/jdbc?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true";
String username = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url, username, password);
// 3)创建执行SQL语句的对象
Statement s = connection.createStatement();
// 4)执行SQL语句
String sql = "select id,name,pwd,nick from user";
ResultSet rs = s.executeQuery(sql);
// 5)处理结果集(查询时才会有这一步)
while(rs.next()) {
int id = rs.getInt(1);
String name = rs.getString(2);
String pwd = rs.getString(3);
String nick = rs.getString(4);
}
// 6)关闭连接
connection.close();
ResultSet 常用方法
方法的声明 | 作用 |
---|---|
boolean next() | 通过游标判断是否有下一行数据 |
xx getXx(int index) | 获取该行结果中某个字段的数据,index为编号,index从1开始 |
xx getXx(String name) | 获取该行结果中某个字段的数据,name为字段名称 |
3. JDBC的执行步骤案例(增/删/改)
上述案例为 查询案例
,下面我们通过 增删改
案例,看看两者有什么不同。
// 1)获取数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2)获取连接对象
String url = "jdbc:mysql://localhost:3306/jdbc?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true";
String username = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url, username, password);
// 3)创建执行SQL语句的对象
Statement s = connection.createStatement();
// 4)执行SQL语句
String sql = "insert into user values (1,'zs','123456','小张')"; // 增
// String sql = "update user set nick='老张' where name='zs'"; // 改
// String sql = "delete from user where id=1"; // 删
int rows = s.executeUpdate(sql);
System.out.println("rows = " + rows);
// 5)处理结果集(增删改操作无这一步)
// 6)关闭连接
connection.close();
Statement 常用方法
方法的声明 | 作用 |
---|---|
ResultSet executeQuery(String sql) | 可执行SQL查询操作,并返回ResultSet结果集对象 |
int executeUpdate(String sql) | 可执行增,删,改操作,返回执行SQL后受到影响的行数 |
boolean execute(String sql) | 可执行任何SQL语句,返回一个布尔值,表示是否返回ResultSet 。(只有执行查询才为true) |
4. SQL注入问题
4.1 字符串拼接弊端(sql注入问题)
场景:用户登录业务
/*
用户登录业务
获取用户输入的用户名和密码,在不知道正确密码的前提下使用下面密码可以成功登录
*/
String name = "zs";
String pwd = "x' or '1'='1";
// 1)获取数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2)获取连接对象
String url = "jdbc:mysql://localhost:3306/jdbc?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true";
String username = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url, username, password);
// 3)创建执行SQL语句的对象
Statement s = connection.createStatement();
// 4)执行SQL语句
String sql = "select * from user where name='"+name+"' and pwd='"+pwd+"'";
ResultSet rs = s.executeQuery(sql);
System.out.println(rs);
// 5)处理结果集(增删改操作无这一步)
rs.next();
System.out.println("id = " + rs.getInt("id"));
System.out.println("name = " + rs.getString("name"));
System.out.println("pwd = " + rs.getString("pwd"));
System.out.println("nick = " + rs.getString("nick"));
// 6)关闭连接
connection.close();
4.2 什么是SQL注入
SQL注入是一种非常常见的数据库攻击手段,SQL注入漏洞也是网络世界中最普遍的漏洞之一。
SQL注入是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
5. 如何方式SQL注入
预编译
JDBC中提供了一种解决字符串拼接传递参数的方式(PreparedStatement
),来解决这种比较简单的SQL注入问题,我们称之为预编译。
预编译,我们又可以称之为预处理,这里指的是在SQL语句执行之前,对SQL语句进行编译处理操作。
// 1)获取数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2)获取连接对象
String url = "jdbc:mysql://localhost:3306/jdbc?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true";
String username = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url, username, password);
// 3)创建执行SQL语句的对象
String sql = "select count(*) from user where username=? and password=?";
PreparedStatement ps = connection.prepareStatement(sql);
// setXXX方法(parameterIndex,x) parameterIndex 指的是第几个问号
ps.setString(1,"zs");
ps.setString(2,"123456");
// 4)执行SQL语句
ResultSet rs = ps.executeQuery();
// 5)返回结果/处理结果集
rs.next();
int count = rs.getInt(1);
System.out.println("count = " + count);
if (count > 0) {
System.out.println("登录成功");
} else {
System.out.println("登录失败,用户名或密码不正确");
}
// 6)关闭连接
connection.close();
PreparedStatement 常用方法
方法的声明 | 作用 |
---|---|
void setString(int parameterIndex, String x) | 向预编译的SQL语句中传递参数,第一个参数 parameterIndex 从1开始,指的是第几个 ? 号,第二个参数指的是具体传递的变量 |
ResultSet executeQuery(String sql) | 可执行SQL查询操作,并返回ResultSet结果集对象 |
int executeUpdate(String sql) | 可执行增,删,改操作,返回执行SQL后受到影响的行数 |
boolean execute(String sql) | 可执行任何SQL语句,返回一个布尔值,表示是否返回ResultSet 。(只有执行查询才为true) |
三、数据库连接池在JDBC中的简单应用
Maven项目导入依赖
<!-- Druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
编写数据库连接池配置类/工具类
public class DBUtils {
private static DruidDataSource dds;
static{
dds = new DruidDataSource();
dds.setUrl("jdbc:mysql://localhost:3306/jdbc?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true");
dds.setUsername("root");
dds.setPassword("root");
// 设置连接池中初始化的连接数
dds.setInitialSize(5);
// 设置连接池中最大的连接数
dds.setMaxActive(20);
// ... 这里还可以设置很多数据库连接池的操作
}
public static Connection getConnection() throws SQLException {
Connection connection = dds.getConnection();
return connection;
}
}
测试
public class DruidDemo {
public static void main(String[] args) {
try(Connection connection = DBUtils.getConnection()){
String sql = "update user set pwd=? where name=?";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1,"888888");
ps.setString(2,"zs");
int rows = ps.executeUpdate();
System.out.println("rows = " + rows);
}catch (SQLException e) {
e.printStackTrace();
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/107606.html