JDBC入门

导读:本篇文章讲解 JDBC入门,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com


一、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的执行步骤

  1. 注册驱动
  2. 获取数据库连接对象
  3. 创建执行SQL语句对象
  4. 执行SQL语句(StatementPreparedStatement)
  5. 处理结果集(ResultSet 一般在查询时才会有这一步)
  6. 关闭连接

常用接口解释

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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!