JDBC入门


一、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();
        }
    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JDBC,即Java数据库连接,是Java语言操作数据库的标准API。从入门到熟练使用JDBC,需要掌握以下几个方面的功能。 1. 数据库连接:通过JDBC可以与各种数据库建立连接,如MySQL、Oracle、SQL Server等。首先要了解数据库的连接URL、用户名和密码等信息,然后使用`DriverManager`类的`getConnection()`方法建立与数据库的连接。 2. SQL语句执行:使用JDBC可以执行SQL语句对数据库进行增、删、改、查等操作。通过`Connection`接口的`createStatement()`方法创建执行SQL语句的`Statement`对象,然后使用该对象的`executeUpdate()`方法执行更新语句,或者使用`executeQuery()`方法执行查询语句,获取结果集。 3. 事务控制:在一些复杂的业务场景中,需要保证事务的一致性和完整性。JDBC通过`Connection`接口的`setAutoCommit()`方法设置是否自动提交事务,`commit()`方法提交事务,`rollback()`方法回滚事务。 4. 预编译SQL语句:预编译SQL语句可以提高SQL执行效率,减少数据库的负担。使用`PreparedStatement`接口可以先预编译SQL语句,然后再执行多次绑定不同参数值的操作。 5. 批处理操作:当需要执行一批相同类型的SQL语句时,使用批处理可以提高执行效率。通过`Statement`或`PreparedStatement`的`addBatch()`方法添加批处理操作,再使用`executeBatch()`方法执行批处理。 6. 结果集处理:JDBC通过`ResultSet`接口表示查询的结果集,可以通过该接口的方法获取结果集的数据,如使用`next()`方法遍历结果集的每一行,使用`getInt()`、`getString()`等方法获取具体的字段值。 7. 连接池管理:在高并发访问数据库的情况下,使用连接池可以减少连接创建的开销和资源的消耗。通过一些开源的连接池框架,如C3P0、Druid等,可以配置连接池的属性,提供可复用的数据库连接。 总结起来,JDBC入门到熟练使用,需要理解数据库连接、SQL语句执行、事务控制、预编译SQL语句、批处理操作、结果集处理和连接池管理等功能,并能熟练运用API进行操作。不断实践和积累经验,才能掌握JDBC的使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值