JDBC从心出发— 在线教育从后端到APP全链路学习实战

1 概述

客户端操作数据库的方式主要是三种:使用第三方客户端访问MySQL(比如:Navicat、MySQLWorkbench等)、使用MySQL自带的命令方式、通过Java来访问MySQL数据库。
在Java中,数据库存取技术可分为如下几类:

  • JDBC直接访问数据库
  • JDO技术(Java Data Object)
  • 第三方O/R工具,如Hibernate, Mybatis 等。
    JDBC是java访问数据库的基石,JDO, Hibernate等只是更好的封装了JDBC。

1.1 什么是JDBC

JDBC是(Java Database Connectivity)Java访问数据库的标准规范,真正怎么操作数据库还需要具体的实现类,也就是数据库驱动。每个数据库厂商根据自家数据库的通信格式编写好自己数据库的驱动。所以我们只需要会调用 JDBC 接口中的方法即可,数据库驱动由数据库厂商提供
使用JDBC的好处:

  • 1)程序员如果开发访问数据库的程序,只需要会调用JDBC接口中的方法即可,不用关注类是如何实现的。
  • 2)使用同一套Java代码,进行少量的修改就可以访问其他 JDBC 支持的数据库。
    JDBC从心出发— 在线教育从后端到APP全链路学习实战_第1张图片

1.2 JDBC API

JDBC API是一系列的接口,它统一和规范了应用程序与数据库的连接、执行SQL语句,并到得到返回结果等各类操作。声明在java.sql与javax.sql包中

1.2.1 使用JDBC开发使用到的包

会使用到的包 描述
java.sql 所有与JDBC访问数据库相关的接口和类
javax.sql 数据库扩展包,提供数据库额外的功能。如:连接池
数据库的驱动 由各大数据库厂商提供

1.2.2 JDBC的核心API

接口或类 描述
DriverManager类 1) 管理和注册数据库驱动;2) 得到数据库连接对象
DriverManager类 一个连接对象,可用于创建 Statement 和 PreparedStatement 对象
Statement接口 一个 SQL 语句对象,用于将 SQL 语句发送给数据库服务器
PreparedStatement接口 一个 SQL 语句对象,是 Statement 的子接口
ResultSet接口 用于封装数据库查询的结果集,返回给客户端 Java 程序

2 JDBC程序编写步骤

2.1 引入JDBC驱动程序(jar包)

2.1.1 创建演示项目maya_jdbc

JDBC从心出发— 在线教育从后端到APP全链路学习实战_第2张图片JDBC从心出发— 在线教育从后端到APP全链路学习实战_第3张图片
JDBC从心出发— 在线教育从后端到APP全链路学习实战_第4张图片

2.1.2 手动导入Jar包

选择项目—右键—New—Directory
JDBC从心出发— 在线教育从后端到APP全链路学习实战_第5张图片
JDBC从心出发— 在线教育从后端到APP全链路学习实战_第6张图片
拷贝jar包到lib目录下
JDBC从心出发— 在线教育从后端到APP全链路学习实战_第7张图片
将jar添加到Library,选中jar包—右键—Add as Library
JDBC从心出发— 在线教育从后端到APP全链路学习实战_第8张图片

2.2 加载和注册驱动

加载并注册驱动:
加载驱动,把驱动类加载到内存
注册驱动,把驱动类的对象交给DriverManager管理,用于后面创建连接等使用。

加载和注册驱动的方法 描述
Class.forName(数据库驱动实现类) 加载和注册数据库驱动,数据库驱动由 mysql 厂商 “com.mysql.jdbc.Driver”

调用 Class 类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名

//通过反射,加载与注册驱动类,解耦合(不直接依赖)
Class.forName("com.mysql.jdbc.Driver");

==疑问:为什么这样可以注册驱动? ==
因为 Driver 接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用 DriverManager.registerDriver() 方法来注册自身的一个实例,所以可以换一种方式来加载驱动。(即只要想办法让驱动类的这段静态代码块执行即可注册驱动类,而要让这段静态代码块执行,只要让该类被类加载器加载即可)。
JDBC从心出发— 在线教育从后端到APP全链路学习实战_第9张图片

2.3 获取数据库连接

可以通过 DriverManager 类建立到数据库的连接Connection:
DriverManager 试图从已注册的 JDBC 驱动程序集中选择一个适当的驱动程序。

2.3.1 类中的方法

DriverManager类中的静态方法 描述
Connection getConnection(String url, String user, String password) 通过连接字符串,用户名,密码来得到数据 库的连接对象
Connection getConnection(String, Properties info) 通过连接字符串,属性对象来得到连接对象

2.3.2 使用JDBC连接数据库的四个参数

JDBC连接数据库的四个参数 说明
用户名 登录的用户名
密码 登录的密码
连接字符串URL 不同的数据库 URL 是不同的,mysql 的写法jdbc:mysql://localhost:3306/数据库[?参数名=参数值]
驱动类的字符串名 com.mysql.jdbc.Driver

2.3.3 连接数据库的URL地址格式

协议名:子协议://服务器名或IP地址:端口号/数据库名?参数=参数值

例如MySQL写法:
JDBC从心出发— 在线教育从后端到APP全链路学习实战_第10张图片
MySQL的连接URL编写方式:

  • jdbc:mysql://主机名称:mysql服务端口号/数据库名称?参数=值&参数=值
  • jdbc:mysql://localhost:3306/testdb
  • jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=utf8(如果JDBC程序与服务器端的字符集不一致,会导致乱码,那么可以通过参数指定服务器端的字符集)
  • jdbc:mysql://localhost:3306/testdb?user=root&password=123456
//1、加载与注册驱动
Class.forName("com.mysql.jdbc.Driver");

//2、获取数据库连接
String url = "jdbc:mysql://localhost:3306/testdb";
Connection conn = DriverManager.getConnection(url, "root", "123456");

2.4 操作和访问数据库

数据库连接被用于向数据库服务器发送命令和 SQL 语句,并接受数据库服务器返回的结果。
其实一个数据库连接就是一个Socket连接。
在 java.sql 包中有 3 个接口分别定义了对数据库的调用的不同方式:
Statement:用于执行静态 SQL 语句并返回它所生成结果的对象。

  • PrepatedStatement:SQL 语句被预编译并存储在此对象中,然后可以使用此对象多次高效地执行该语句。
    CallableStatement:用于执行 SQL 存储过程

2.4.1 Statement

通过调用 Connection 对象的 createStatement() 方法创建该对象,该对象用于执行静态的 SQL 语句,并且返回执行结果。
Statement中的方法

Statement接口中的方法 描述
int executeUpdate(String sql) 用于发送DML语句,增删改的操作:insert、update、delete;参数:SQL语句;返回值:返回对数据库影响的行数
ResultSet executeQuery(String sql) 用于发送DQL语句,执行查询的操作:select;参数:SQL语句;返回值:查询的结果集

2.4.2 ResultSet

通过调用Statement对象的excuteQuery()方法创建该对。ResultSet对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet 接口由数据库厂商实现。
ResultSet对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过ResultSet对象的next()方法移动到下一行。
ResultSet 接口的常用方法:
JDBC从心出发— 在线教育从后端到APP全链路学习实战_第11张图片

2.4.3 释放资源

Connection、Statement、ResultSet都是应用程序和数据库服务器的连接资源,使用后一定要关闭,可以在finally中关闭。

  • 1)需要释放的对象:ResultSet 结果集,Statement 语句,Connection 连接
  • 2)释放原则:先开的后关,后开的先关。ResultSet->Statement->Connection
  • 3)放在哪个代码块中:finally 块

2.5 案例

创建包cn.maya.test01.jdbc
JDBC从心出发— 在线教育从后端到APP全链路学习实战_第12张图片
JDBC从心出发— 在线教育从后端到APP全链路学习实战_第13张图片
创建类TestJDBC.java
JDBC从心出发— 在线教育从后端到APP全链路学习实战_第14张图片
JDBC从心出发— 在线教育从后端到APP全链路学习实战_第15张图片

2.5.1 增加学生

@Test
public void testAdd() throws Exception{
     
   //1、注册驱动:把驱动类加载到内存,并且初始化这个类
   Class.forName("com.mysql.jdbc.Driver");

   //2、连接数据库(如果JDBC程序与服务器端的字符集不一致,会导致乱码,那么可以通过参数指定服务器端的字符集)
   String url = "jdbc:mysql://localhost:3306/maya?useUnicode=true&characterEncoding=utf8";
   Connection conn = DriverManager.getConnection(url, "root", "root");
   //java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
   //解决这个问题的思路:查看主机名,用户名,密码
   System.out.println(conn.getClass());//获取运行时类型   class com.mysql.jdbc.Connection

   //3、操作数据库
   //这里我要添加一条记录到t_stu
   //(1)编写sql
   String sql = "INSERT INTO t_stu VALUES(NULL,'刘翔飞','男','123456789012345698','1987-09-09','极客玛雅')";

   /*
    * Connection好比网络编程中的Socket
    * Statement好比和服务器进行数据读写的InputStream和OutputStream
    */
   //(2)准备一个Statement
   Statement st = conn.createStatement();

   //(3)执行sql,通过Statement对象把Sql发给服务器,服务器执行Sql后,把结果返回
   //insert ,update,delete语句都是通过这个方法执行
   int len = st.executeUpdate(sql);
   System.out.println(len>0?"添加成功":"添加失败");

   //4、释放资源
   st.close();
   conn.close();
}

2.5.1 学生列表

@Test
public void testSelect() throws Exception {
     
   //1、注册驱动:把驱动类加载到内存,并且初始化这个类
   Class.forName("com.mysql.jdbc.Driver");

   //2、连接数据库(如果JDBC程序与服务器端的字符集不一致,会导致乱码,那么可以通过参数指定服务器端的字符集)
   String url = "jdbc:mysql://localhost:3306/maya?useUnicode=true&characterEncoding=utf8";
   Connection conn = DriverManager.getConnection(url, "root", "root");

   //3、操作数据库
   //(1)编写SQL
   String sql = "SELECT * FROM t_stu";

   //(2)准备一个Statement
   Statement st = conn.createStatement();

   //(3)执行sql,通过Statement对象把Sql发给服务器,服务器执行Sql后,把结果返回
   //select语句用query方法
   ResultSet rs = st.executeQuery(sql);
   while (rs.next()) {
     //是否有下一行
      //取这一行的单元格
      int sid = rs.getInt("sid");
      String sname = rs.getString("sname");
      String gender = rs.getString("gender");
      System.out.println(sid + "\t" + sname + "\t" + gender);
   }

   //4、释放资源
   st.close();
   conn.close();
}

你可能感兴趣的:(jdbc)