JDBC基础

JDBC基础



一、JDBC简介

 JDBC(Java Database Connectivity),Java数据库连接,就是使用Java语言操作关系型数据库的一套API。
 本质就是Java官方定义的一套操作所有关系型数据库的规则,即接口


二、JDBC编程基础步骤

  1. 注册驱动
  2. 获取连接
  3. 定义SQL
  4. 获取执行SQL的对象
  5. 执行SQL
  6. 处理结果
  7. 释放资源

下面是一个简单的示例:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class test {
    public static void main(String[] args) throws Exception {
        // 1、注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

        // 2、获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/jdbc_test";
        String username = "root";
        String password = "123456";
		// MySQL所设置的username和password

        Connection c = DriverManager.getConnection(url, username, password);

        // 3、定义SQL
        String sql = "update tb set name = 'Berry' where id = 2";

        // 4、获取执行SQL的对象
        Statement sta = c.createStatement();

        // 5、执行SQL
        int count = sta.executeUpdate(sql);
		// 此处返回了执行SQL语句影响的行数

        // 6、处理结果
        System.out.println(count);

        // 7、释放资源
        sta.close();
        c.close();
		// 资源的释放遵循从里到外的原则
    }

}

三、JDBC中的API

1、DriverManager(驱动管理类)

作用:

  1. 注册驱动
  2. 获取数据库连接

 注册驱动所使用的语句 Class.forName(“com.mysql.cj.jdbc.Driver”); 在 Driver 的源码中存在一部分静态代码块,其随着类的加载自动执行。

静态代码块如下:

package com.mysql.cj.jdbc;

import java.sql.DriverManager;
import java.sql.SQLException;

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }

    static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }
}

 如果安装的是MySQL 5之后的驱动jar包,ClassforName()行代码可以省略,Java会自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类。

获取数据库连接所使用的方法为:

getConnection(String url, String username, String password)

其中 url 的格式为:

jdbc:mysql://(jdbc的协议)127.0.0.1(ip地址/域名localhost):3306(端口号)/jdbc_test(数据库名称)?参数键值对1&参数键值对2

如果连接的是本机MySQL服务器且MySQL服务默认端口默认为3306,则url可简写为:
jdbc:mysql:///数据库名称?参数键值对


2、Connection(数据库连接对象)

作用:

  1. 获取执行SQL的对象
    包括普通执行SQL的对象(createStatement() )、预编译SQL的执行SQL对象(prepareStatement(sql) )、执行存储过程的对象(prepareCall(sql) )
  2. 管理事务
  • setAutoCommit(boolean autoCommit):true为自动提交事务;false为手动提交事务,即开启事务
  • commit():提交事务
  • rollback():回滚事务

下面是一个简单的示例:

首先创建一个名为 ‘tb’ 的初始表格如下图:

然后执行以下代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class test {
    public static void main(String[] args) throws Exception {
        //获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/jdbc_test";
        String username = "root";
        String password = "123456";
        Connection c = DriverManager.getConnection(url, username, password);

        //定义SQL
        String sql1 = "update tb set number = 0 where id = 1";
        String sql2 = "update tb set number = 1 where id = 2";

        //获取执行SQL的对象
        Statement sta = c.createStatement();

        //开启事务
        c.setAutoCommit(false);

        //使用try-catch块,在出现异常时进行事务回滚
        try {
            //执行SQL
            int a = sta.executeUpdate(sql1);
            System.out.println(a);

            //添加一个异常
            int n = 10 / 0;

            int b = sta.executeUpdate(sql2);
            System.out.println(b);

        } catch (Exception e) {
            e.printStackTrace();
            //回滚事务
            c.rollback();
        }

        //提交事务
        c.commit();

        //释放资源
        sta.close();
        c.close();
    }

}

代码执行的结果为:

a 的值已经打印,说明 sql1 语句已执行。但由于出现异常,事务回滚至开启事务前的状态,因此表格中的数据不会发生改变:


3、Statement

作用:

  • 执行SQL语句
// 执行DML、DDL语句,返回值为语句影响的行数,DDL语句执行成功后也可能返回0
int -> executeUpdate(sql);

// 执行DQL语句,返回值为ResultSet结果集对象
ResultSet -> executeQuery(sql);

// 既可以执行DML、DDL语句,返回值为false;也可以执行DQL语句,返回值为true
boolean -> execute(sql);

4、ResultSet

作用:

  • 封装了DQL查询语句的结果
// 获取查询结果
boolean -> next(); // 将光标向前移动一行并判断该行是否为有效行,若当前行有数据则返回true

// 获取查询数据
getValuetype(参数); // 参数为int -> 列编号,从1开始,或String -> 列名

下面以前文中的表格 ‘tb’ 示例:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class test {
    public static void main(String[] args) throws Exception {
        //获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/jdbc_test";
        String username = "root";
        String password = "123456";
        Connection c = DriverManager.getConnection(url, username, password);

        //定义SQL
        String sql = "select * from tb";

        //获取执行SQL的对象
        Statement sta = c.createStatement();

        //执行SQL
        ResultSet rs = sta.executeQuery(sql);

        //处理结果
        while(rs.next()){
            String name = rs.getString("name");
            int num = rs.getInt("number");
            System.out.println(name + '\t' + num);
        }

        //释放资源
        rs.close(); // 记得释放 ResultSet
        sta.close();
        c.close();
    }

}

执行后的结果为:


5、PreparedStatement

作用:

  • 预编译SQL语句并执行:预防SQL注入问题。(SQL注入:通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。)
// 获取PreparedStatement对象
PreparedStatement -> prepareStatement(sql);

// 设置参数值
setValuetype(参数1,参数2);

同样以表格 ‘tb’ 进行简单示例:

import java.sql.*;
import java.util.Scanner;

public class test {
    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入id和number:");
        int id = scanner.nextInt();
        int number = scanner.nextInt();
        //获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/jdbc_test";
        String username = "root";
        String password = "123456";
        Connection c = DriverManager.getConnection(url, username, password);

        //定义SQL
        String sql = "select * from tb where id = ? and number = ?"; // SQL语句中的参数值使用 ? 占位符替代

        //获取PreparedStatement对象
        PreparedStatement psta = c.prepareStatement(sql);

        //设置参数值
        psta.setInt(1,id); // 参数1为 ?位置的编号,从1开始,参数2为 ?的值
        psta.setInt(2,number);

        //执行SQL
        ResultSet rs = psta.executeQuery();

        //处理结果
        if (rs.next()){
            System.out.println("查询成功!");
        }else{
            System.out.println("查询失败!");
        }

        //释放资源
        rs.close(); // 记得释放 ResultSet
        psta.close();
        c.close();
    }

}

简单测试:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值