> 文档中心 > JDBC的了解

JDBC的了解

同一套JAVA代码,操作不同的关系型数据库

文章目录

    • JDBC了解
        • JDBC概念
        • JDBC本质
        • JDBC好处
    • JDBC的操作
    • JDBC API详解
        • DriverManager
        • Connection
        • Statement
        • ResultSet
        • PreparedStatement
        • PreparedStatement原理

JDBC了解

JDBC概念

JDBC 就是使用Java语言操作关系型数据库的一套API
全称:( Java DataBase Connectivity ) Java 数据库连接

JDBC本质

  • 官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
  • 各个数据库厂商去实现这套接口,提供数据库驱动jar包
  • 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

JDBC好处

  • 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
  • 可随时替换底层数据库,访问数据库的Java代码基本不变

JDBC的操作

  • 第一步:编写Java代码
  • 第二步:Java代码将SQL发送到MySQL服务端
  • 第三步:MySQL服务端接收到SQL语句并执行该SQL语句
  • 第四步:将SQL语句执行的结果返回给Java代码

编写代码步骤

  1. 创建工程,导入驱动jar包
  2. 注册驱动
  3. 获取连接
    Java代码需要发送SQL给MySQL服务端,就需要先建立连接
    Class.forName(“com.mysql.jdbc.Driver”);
    Connection conn =
    DriverManager.getConnection(url, username,
    password);
  4. 定义SQL语句
  5. 获取执行SQL对象
    执行SQL语句需要SQL执行对象,而这个执行对象就是
    Statement对象
  6. 执行SQL
  7. 处理返回结果
  8. 释放资源
import java.sql.Connection;import java.sql.DriverManager;import java.sql.Statement;public class JDBCtest1 {    public static void main(String[] args) throws Exception { //1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2.获取连接 String url = "jdbc:mysql://127.0.0.1:3306"; //固定写法 String username = "root"; String passwd = "123456"; Connection conn = DriverManager.getConnection(url, username, passwd); //3.定义sql String sql = "update students.demo set sage = 99 where sname = '懒羊羊';"; //4.获取执行sql的对象statement Statement stmt =conn.createStatement(); //5.执行sql语句 ---返回受影响行数 int count = stmt.executeUpdate(sql); //6.处理结果 System.out.println(count); //7.释放资源 stmt.close(); conn.close();    }}

JDBC API详解

DriverManager

DriverManager(驱动管理类)作用:注册驱动、获取数据库连接
注册驱动
registerDriver方法是用于注册驱动的,但是我们之前做的入门
案例并不是这样写的。而是如下实现:

Class.forName(“com.mysql.jdbc.Driver”); //可以加载Driver 类。

我们查询MySQL提供的Driver类,看它是如何实现的,源码如下:

int count = stmt.executeUpdate(sql); //受影响的行数

获取数据库连接

static Connection—getConnection(url, username, passwd);
url : 连接路径

  • 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2… 示例:jdbc:mysql://127.0.0.1:3306/students
    如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对配置 useSSL=false 参数,禁用安全连接方式,解决警告提示

user :用户名
poasswd :密码

Connection

Connection(数据库连接对象)作用:获取执行 SQL 的对象、管理事务
获取执行对象
普通执行SQL对象

Statement createStatement()

预编译SQL的执行SQL对象:防止SQL注入

PreparedStatement prepareStatement(sql)

执行存储过程的对象

CallableStatement prepareCall(sql)

Connection对应的MySQL事务管理

开启事务 : BEGIN; 或者 START TRANSACTION;
提交事务 : COMMIT;
回滚事务 : ROLLBACK;
Connection接口中定义了3个对应的方法:
void setAutoCommit (boolean autoCommit);

  • autoCommit 表示是否自动提交事务,true表示自动提交事务,false表示手动提交事务。开启事务需要将该参数设为为false。

void commit();

void rollback();

Statement

Statement对象的作用就是用来执行SQL语句。而针对不同类型的SQL语句使用的方法也不一样。

执行DDL、DML语句

int executeUpdate(sql); //返回值:1.DML语句影响的行数>0 2.DDL语句执行后,执行成功也可能返回0;

执行DQL语句

ResultSet executeQuery(sql); //返回值: ResultSet结果集对象

ResultSet

封装了SQL–DQL查询语句的结果

获取查询结果

boolean next();

  • 将光标从当前位置向前移动一行
    判断当前行是否为有效行
    方法返回值说明:
    • true : 有效航,当前行有数据
      false : 无效行,当前行没有数据

xxx getXxx(参数):获取数据
xxx : 数据类型;如: int getInt(参数) ;String getString(参 数)
参数

  • int类型的参数:列的编号,从1开始
    String类型的参数: 列的名称

PreparedStatement

预编译SQL语句并执行:预防SQL注入问题
sql注入

SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。

select * from table where username = ‘sads’ and password = ’ ’ or ‘1’ = ‘1’;

获取 PreparedStatement 对象

// SQL语句中的参数值,使用?占位符替代
String sql = “select * from user where username = ? and password = ?”;
// 通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);

设置参数值

PreparedStatement对象:setXxx(参数1,参数2):给 ? 赋 值

参数

  • 参数1: ?的位置编号,从1 开始
    参数2: ?的值
    pstmt.setString(1,name);
    pstmt.setString(2,pwd);

执行SQL语句

executeUpdate(); 执行DDL语句和DML语句
executeQuery(); 执行DQL语句
注意:
调用这两个方法时不需要传递SQL语句,因为获取SQL语句执行对象时已经对SQL语句进行预编译了。

PreparedStatement原理

PreparedStatement 好处:
预编译SQL,性能更高
防止SQL注入:将敏感字符进行转义

  • 将sql语句发送到MySQL服务器端
  • MySQL服务端会对sql语句进行如下操作
    检查SQL语句
    检查SQL语句的语法是否正确。
  • 编译SQL语句。将SQL语句编译成可执行的函数。
    检查SQL和编译SQL花费的时间比执行SQL的时间还要长。如果我们只是重新设置参数,那么检查SQL语句和编译SQL语句将不需要重复执行。这样就提高了性能。
  • 执行SQL语句