JDBC(数据库连接、事务)

学习目标

  1. 能够理解JDBC的概念(很重要)
  2. 能够使用DriverManager类(掌握)
  3. 能够使用Connection接口(掌握)
  4. 能够使用Statement接口(掌握)
  5. 能够使用ResultSet接口(掌握)
  6. 能够说出SQL注入原因和解决方案(掌握)
  7. 能够通过PreparedStatement完成增、删、改、查(掌握)
  8. 能够完成PreparedStatement改造登录案例(掌握)

1、JDBC的概念

客户端操作MySQL数据库的方式

  1. 使用第三方客户端来访问MySQL:SQLyog、Navicat、SQLWave、MyDB Studio、EMS SQL Manager for MySQL
  2. 使用MySQL自带的命令行方式
  3. 通过Java来访问MySQL数据库,今天学习内容

什么是JDBCJava Data Base Connectivity(Java数据库连接) JDBC是Java访问数据库的标准规范
JDBC的作用:JDBC是用于执行SQL语句的Java API(Java语言通过JDBC可以操作数据库)

第2章 JDBC的由来

  1. 直接写代码操作数据库
    JDBC(数据库连接、事务)_第1张图片

    直接写代码操作数据库存在的问题:

    1. 不知道MySQL数据库的操作方式,解析方式
    2. 代码繁琐,写起来麻烦
    3. MySQL和Oracle等其他数据库的操作方式和解析方式不同,每个数据库都要写一套代码
    4. MySQL和Oracle等其他数据库相互切换麻烦
  2. JDBC规范定义接口,具体的实现由各大数据库厂商来实现
    JDBC是Java访问数据库的标准规范。真正怎么操作数据库还需要具体的实现类,也就是数据库驱动。每个数据库厂商根据自家数据库的通信格式编写好自己数据库的驱动。所以我们只需要会调用JDBC接口中的方法即可。数据库驱动由数据库厂商提供。
    JDBC(数据库连接、事务)_第2张图片

JDBC的好处:

  1. 我们只需要会调用JDBC接口中的方法即可,使用简单(不需要关注驱动中具体的代码)
  2. 使用同一套Java代码,进行少量的修改就可以访问其他JDBC支持的数据库

JDBC会用到的包:

  1. java.sql:JDBC访问数据库的基础包,在JavaSE中的包。如:java.sql.Connection
  2. javax.sql: JDBC访问数据库的扩展包
  3. 数据库的驱动,各大数据库厂商来实现。如:MySQL的驱动:com.mysql.jdbc.Driver

驱动jar包和JDBC是接口与实现的关系

JDBC四个核心对象
这几个类都是在java.sql包中

  1. DriverManager: 用于注册驱动、以及获取Connection连接对象
  2. Connection: 表示与数据库创建的连接
  3. Statement: 执行SQL语句的对象、将SQL语句发送到mysql服务器进行执行。
  4. ResultSet: 结果集或一张虚拟表,查询数据的时候查询到的所有结果全部在ResultSet对象中
    JDBC(数据库连接、事务)_第3张图片

第3章 JDBC获取连接

Connection表示Java程序与数据库之间的连接,只有拿到Connection才能操作数据库。

JDBC获取连接步骤
1.导入驱动Jar包
2.注册驱动
3.获取连接

3.1 导入驱动Jar包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-McHaardq-JDBC(数据库连接、事务)_第4张图片
JDBC(数据库连接、事务)_第5张图片

JDBC(数据库连接、事务)_第6张图片

更简单的将jar包添加进工程的方法介绍(重要)

JDBC(数据库连接、事务)_第7张图片

3.2 注册驱动(JDBC4.0之后不用手动加载驱动)

我们Java程序需要通过数据库驱动才能连接到数据库,因此需要注册驱动。
MySQL的驱动的入口类是:com.mysql.jdbc.Driver
JDBC(数据库连接、事务)_第8张图片

3.2.1 API介绍

java.sql.DriverManager类用于注册驱动。提供如下方法注册驱动

static void registerDriver(Driver driver)DriverManager 注册给定驱动程序。 

3.2.2 使用步骤

1.DriverManager.registerDriver(驱动对象); 传入对应参数即可

3.2.3 案例代码

public class Demo01 {
   
	public static void main(String[] args) throws Exception {
   
		// 注册驱动
		DriverManager.registerDriver(new com.mysql.jdbc.Driver());
	}
}

通过查询com.mysql.jdbc.Driver源码,我们发现Driver类“主动”将自己进行注册

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
   
    static {
   
        try {
   
            // 自己自动注册
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
   
            throw new RuntimeException("Can't register driver!");
        }
    }
    public Driver() throws SQLException {
   
    }
}

JDBC(数据库连接、事务)_第9张图片

注意:使用DriverManager.registerDriver(new com.mysql.jdbc.Driver());,存在两方面不足

  1. 硬编码,后期不易于程序扩展和维护
  2. 驱动被注册两次

使用Class.forName("com.mysql.jdbc.Driver");加载驱动,这样驱动只会注册一次

public class Demo01 {
	public static void main(String[] args) throws Exception {
		Class.forName("com.mysql.jdbc.Driver"); // 后期可以将"com.mysql.jdbc.Driver"字符串写在文件中.
	}
}

演示:Class.forName("包名.类名");会走这个类的静态代码块
JDBC(数据库连接、事务)_第10张图片

通常开发我们使用Class.forName() 加载驱动。Class.forName("com.mysql.jdbc.Driver");会走Driver类的静态代码块。在静态代码块中注册一次驱动。
JDBC(数据库连接、事务)_第11张图片

总结:注册MySQL驱动使用Class.forName("com.mysql.jdbc.Driver");

3.3 获取连接

3.3.1 API介绍

java.sql.DriverManager类中有如下方法获取数据库连接

static Connection getConnection(String url, String user, String password) 
连接到给定数据库 URL ,并返回连接。 

3.3.2 参数说明

  1. String url:连接数据库的URL,用于说明连接数据库的位置
  2. String user:数据库的账号
  3. String password:数据库的密码

连接数据库的URL地址格式:协议名:子协议://服务器名或IP地址:端口号/数据库名?参数=参数值
在这里插入图片描述

MySQL写法:jdbc:mysql://localhost:3306/day24
如果是本地服务器,端口号是默认的3306,则可以简写:jdbc:mysql:///day24

3.3.3 注意事项

如果数据出现乱码需要加上参数: ?characterEncoding=utf8,表示让数据库以UTF-8编码来处理数据。
如: jdbc:mysql://localhost:3306/day24?characterEncoding=utf8

3.3.4 使用步骤

1.DriverManager.getConnection(url, user, password); 传入对应参数即可

3.3.5 案例代码

public class Demo01 {
   
	public static void main(String[] args) throws Exception {
   
		Class.forName("com.mysql.jdbc.Driver");
		
		// 连接到MySQL
		// url: 连接数据库的URL
		// user: 数据库的账号
		// password: 数据库的密码
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day17", "root", "root");
		System.out.println(conn);
	}
}

3.3.6 案例效果

1.连接成功
JDBC(数据库连接、事务)_第12张图片

2.连接失败
在这里插入图片描述

第4章 JDBC实现对单表数据增、删、改、查

我们要对数据库进行增、删、改、查,需要使用Statement对象来执行SQL语句。

4.1 准备数据

-- 创建分类表
CREATE TABLE category (
  cid INT PRIMARY KEY AUTO_INCREMENT,
  cname VARCHAR(100)
);
-- 初始化数据
INSERT INTO category (cname) VALUES('家电');
INSERT INTO category (cname) VALUES('服饰');
INSERT INTO category (cname) VALUES('化妆品');

4.2 JDBC实现对单表数据增、删、改

4.2.1 API介绍

4.2.1.1 获取Statement对象API介绍

java.sql.Connection接口中有如下方法获取到Statement对象

Statement createStatement() 
创建一个 Statement 对象来将 SQL 语句发送到数据库
4.2.1.2 Statement的API介绍
  1. boolean execute(String sql)
    此方法可以执行任意sql语句。返回boolean值,表示是否返回ResultSet结果集。仅当执行select语句,且有返回结果时返回true, 其它语句都返回false;
    这个方法一般只用于执行DDL语句,而DDL我们一般是直接在工具中使用就可以了。项目中一般不会有执行DDL的需求
    
  2. int executeUpdate(String sql)
    根据执行的DML(INSERT、UPDATE、DELETE)语句,返回受影响的行数
    
  3. ResultSet executeQuery(String sql)
    根据查询语句返回结果集,只能执行SELECT语句
    

    注意:在MySQL中,只要不是查询就是修改。
    executeUpdate:用于执行增删改
    executeQuery:用于执行查询

4.2.2 使用步骤

  1. 注册驱动
  2. 获取连接
  3. 获取Statement对象
  4. 使用Statement对象执行SQL语句
  5. 释放资源

4.2.3 案例代码

public class Demo03 {
   
	public static void main(String[] args) throws Exception {
   
		Class.forName("com.mysql.jdbc.Driver");

		Connection conn = DriverManager.getConnection("jdbc:mysql:///day24", "root", "root");
		System.out.println(conn);
		// 从连接中拿到一个Statement对象
		Statement stmt = conn.createStatement();

		// 1.插入记录
		String sql = "INSERT INTO category (cname) VALUES ('手机');";
		int i = stmt.executeUpdate(sql);
		System.out.println("影响的行数:" + i);

		// 2.修改记录
		sql = "UPDATE category SET cname='汽车' WHERE cid=4;";
		i = stmt.executeUpdate(sql);
		System.out.println("影响的行数:" + i);

		// 3.删除记录
		sql = "DELETE FROM category WHERE cid=1;";
		i = stmt.executeUpdate(sql);
		System.out.println("影响的行数:" + i);
		
		// 释放资源
		stmt.close();
		conn.close();
	}
}

4.2.4 案例效果

JDBC(数据库连接、事务)_第13张图片

4.3 JDBC实现对单表数据查询

ResultSet用于保存执行查询SQL语句的结果。
我们不能一次性取出所有的数据,需要一行一行的取出。

ResultSet的原理:

  1. ResultSet内部有一个指针,刚开始记录开始位置
  2. 调用next方法, ResultSet内部指针会移动到下一行数据
  3. 我们可以通过ResultSet得到一行数据 getXxx得到某列数据
    JDBC(数据库连接、事务)_第14张图片

ResultSet获取数据的API
其实ResultSet获取数据的API是有规律的get后面加数据类型。我们统称getXXX()
JDBC(数据库连接、事务)_第15张图片

使用JDBC查询数据库中的数据的步骤

  1. 注册驱动
  2. 获取连接
  3. 获取到Statement
  4. 使用Statement执行SQL
  5. ResultSet处理结果
  6. 关闭资源

案例代码

public class Demo04 {
   
	public static void main(String[] args) throws Exception {
   
		Class.forName("com.mysql.jdbc.Driver");
		
		

你可能感兴趣的:(MYSQL,JDBC,数据连接池,jdbc,mysql,java)