第一种:使用MySQL客户端
通过MySQL Client输入用户名和密码进行数据库连接,连接成功之后通过SQL语句向数据库发送命了(insert,update,delete,select),数据库接收命名之后对SQL语句进行(安全性分析,语法分析,语法编译,生成一个SQL语句执行计划并执行,返回一个结果集给客户端),客户端得到数据库返回的结果集![2021-03-29_095943]
第二种:使用Java代码进行数据库操作
除了使用MySQL客户端之外,还提供使用Java代码操作数据库的途径,已得到数据返回结果集,Java就对这套操作数据库过程提供了一个规范,只要满足这套规范就可以对数据库进行CRUD操作,这个套规范就叫做 Java Database Connectivity 简称JDBC
PS:JDBC操作是数据库的原始操作也是基础,在后续学习MyBatis这个框架的时候也是以JDBC为基础进行二次封装提供数据库操作方式
什么是JDBC
JDBC是一种用于执行SQL语句的Java API,它可以为多种关系型数据库提供一套统一的访问,它是由一组用Java语言编写的类和接口组成,JDBC属于一套规范(属于一套接口),每个数据库产商都会在这个基础之上一共自身连接数据库的方式,这个方式就叫做"数据库连接驱动"
JDBC就是编写一条可以直接用Java代码连接数据库并发送SQL语句让数据库执行,并接受数据库操作之后的的返回值,连接数据库JDBC是不提供连接数据库的驱动,数据库的驱动就需要由各大数据库厂商进行提供
MySQL的连接驱动
1. mysql-connector-java-5.1.x --->这个版本驱动适合MySQL5.x版本的数据库
2. mysql-connector-java-8.0.x --->这个版本驱动适合MySQL8.x版本的数据库
JDBC的核心API
类型
|
类的全限定名称(包名+类名)
|
说明
|
class
|
java.sql.DriverManager
|
管理多个数据库驱动连接的类,提供获取数据库连接方式
|
class
|
java.sql.SQLException
|
JDBC连接数据库时抛出所有异常根异常
|
interface
|
java.sql.Connection
|
代表一个数据库连接对象
|
interface
|
java.sql.Statement
|
代表一个SQL语句对象并发送语句到数据库
|
interface
|
java.sql.ResultSet
|
代表一个查询语句的结果集对象
|
特别注意:
开发JDBC程序时使用都是java原生sql包,所以使用类和接口都是出至于java.sql包下,千万不到导入com.mysql开头包下类或接口,因为这个包是各大数据库厂商提供的驱动连接里面的实现类和接口,并不是作为JDBC开发所使用
开发第一个JDBC连接程序
步骤(使用的是IDEA编译器)
1.现在IDEA中先创建一个工程
2.在IDEA创建好的功能内部创建一个文件夹名字lib(Library缩写)代表我们要使用jar包
3.将MySQL的连接驱动jar拷贝粘贴到lib文件夹的内部
4.需要将lib文件夹中MySQL的驱动连接jar添加到工程中才可以使用
4.1先找到当前MySQL驱动包并选中
4.2在选中驱动包的位置单机鼠标右键
4.3在出现的选项卡中 选择 add as Library 出现一个弹窗 ,点击OK即可
5.编写Java代码使用JDBC完成对数据库的连接操作
package com.qfedu.JDBC.FirstJDBCTest;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Objects;
public class JDBCConnectionTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydb1",
"root",
"123456"
if(Objects.isNull(connection)){
System.out.println("连接失败:"+connection);
}else{
System.out.println("连接成功:"+connection);
JDBC是随着Java版本更新而更新,现在最新版本JDBC4.0,提供一种全新的连接方式
可以省略不写加载驱动连接 Class.forName("com.mysql.jdbc.Driver");
直接使用DriverManager获取Connection连接对象
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydb1",
"root",
"123456"
if(Objects.isNull(connection)){
System.out.println("连接失败:"+connection);
}else{
System.out.println("连接成功:"+connection);
PS:个人是比较推荐使用标准方式进行连接
JDBC操作之DDL
需求:通过JDBC程序创建一个Student表,表中有是三个列(id 主键自增长列 name 字符串长度20 age 年龄)
刚刚通过JDBC已经成功的连接了数据库,如果将书写好的SQL语句发送给MySQL执行并且接受返回的信息
JDBC提供了一个专门用来存储和发送SQL语句的接口,这个接口可以接收SQL语句并发送到MySQL上让其执行并得到执行执行之后的返回效果
Statement静态语句
为什么要叫静态语句?
提前写好的SQL语句,语句中参数也是提前写好的,管这个样语句叫做静态语句,而存储这个静态语句的对象就是Statement对象,我们也称之为Statement静态语句对象
Statement接口说明:
这个接口中针对DDL语句操作提供了两个核心方法
int executeUpdate(String sql) 这个方法可以执行SQL中DDL和DML语句操作,这个方法有一个返回值是int类型,通过这个方法的返回值就可以判断DDL和DML语句是否执行操作成功,这个方法值返回的是在MySQL中通过DDL或DML语句操作受到影响行数,只需要判断返回值是否>0就是得知操作是否成功
void close() 在使用JDBC连接数据库并发送SQL语句执行是一个长连接操作,所以需要关闭
因为Statement是接口无法直接创建语句对应,那么如何获取到语句对象?
需要使用到Connection的连接对象,调用提供createStatement()方法获取Statement对象
package com.qfedu.JDBC.DDL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class CreateTable {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydb1",
"root",
"123456"
String sql = "create table student(" +
"id int primary key auto_increment," +
"name varchar(20)," +
"age int" +
")";
Statement statement = connection.createStatement();
int i = statement.executeUpdate(sql);
System.out.println("返回值是:"+i);
statement.close();
connection.close();
JDBC操作之DML操作
DML语句就是对表进行增加insert、删除delete和修改update操作,而且使用Statemnet这个对象的方法都是一样的即"executeUpdate",这个语句会提供返回值如果>0证明操作成功,如果<0证明操作失败
需求:通过JDBC向Student表中添加一条数据
package com.qfedu.JDBC.DML;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class InsertIntoTable {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydb1",
"root",
"123456"
String sql = "insert into student(name,age) values('乔峰',36)";
Statement statement = connection.createStatement();
int i = statement.executeUpdate(sql);
if(i > 0){
System.out.println("数据插入成功");
}else{
System.out.println("数据插入失败");
需求:通过JDBC操作修改Student中数据将"乔峰"修改为"萧峰"
package com.qfedu.JDBC.DML;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class UpdateTable {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydb1",
"root",
"123456"
String sql = "update student set name = '萧峰' where id = 1";
Statement statement = connection.createStatement();
int i = statement.executeUpdate(sql);
if(i>0){
System.out.println("数据修改成功");
}else{
System.out.println("数据修改失败");
statement.close();
connection.close();
需求:通过JDBC将Student表中"萧峰"删除
package com.qfedu.JDBC.DML;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class DeleteTable {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydb1",
"root",
"123456"
String sql = "delete from student where name = '萧峰'";
Statement statement = connection.createStatement();
int i = statement.executeUpdate(sql);
if(i>0){
System.out.println("数据删除成功");
}else{
System.out.println("数据删除失败");
statement.close();
connection.close();
JDBC操作之DQL
DQL是数据库查询语言,在JDBC中也可以完成DQL语言的操作,在书写DQL语言时进行数据库查询,数据库会返回一个"虚拟表"给客户端以展示数据,那么我们提供JDBC代码查询MySQL数据库返回这个"虚拟表"如何操作?
现在编写JDBC程序都是使用Statement语句语句对象来执行SQL语句,DDL和DML使用方式是executeUpdate,DQL执行语句的方法是什么?
查询StatementAPI查询执行DQL语句方法:
ResultSet executeQuery(String sql) 这个方法是执行DQL语言的方法,这个方法返回了一个ResultSet对象
查询ResultSetAPI发现
ResultSet翻译过来叫做"结果集",它是我们使用DQL语言执行查询之后得到结果,ResultSet就是虚拟表的映射,通过DQL语言执行完毕之后得到"虚拟表","虚拟表"中内容就会被存储在ResultSet这个结果集对象中,所以我们只需要通过ResultSet结果集对象进行操作就可以获取的通过DQL语言查询出来的数据了
通过DQL语言查询出来数据不可能只要一条,可能会多态,既然ResultSet是"虚拟表"的映射,那么ResultSet中就存储在多条数据,如果将ResultSet中的数据取出来?官方为文档中就有了说明,其实ResultSet和我们之前在JavaSE阶段在学习集合时和迭代器是一样的,ResultSet维护一个"光标",只需要移动这个"光标",就可以获取到ResultSet中存储的数据了
ResultSet中核心方法
next() 移动ResultSet的光标,判断是否还有下一行数据,如果有数据则返回true,如果没有没有数据返回false
在读取ResultSet数据时,是以行为单位进行读取,需要以列的方式获取行内数据
getXXXXXX(int columnIndex) 读取光标所在行内列的数据
PS:XXXXXX代表你要获取列的数据类型,例如:列时int类型 读取数据时候就是getInt
参数的传递指定列的 "位置值" 读取对应列的数据,是从左向右读取,左边第一个列就是数字[1],向右主键递增+1
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
//使用JDBC操作查询student表中所有数据
public class selectTable {
public static void main(String[] args)throws Exception{
//1.加载注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydb1",
"root",
"123456"
//3.书写静态SQL语句
String sql = "select * from student";
//4.创建静态语句对象发送SQL语句并接收返回结果集
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
//5.遍历获取resultSet对象中存储的具体数据
while(resultSet.next()){//移动光标判断是否还有下一行数据
//循环体的内部读取行内数据,即每一列的数据
//5.1使用参数为"列位置"的方式获取列中数据
int id = resultSet.getInt(1);//相当于读取列id的值
//5.2使用参数为 "列名" 的方式获取列中数据
String name = resultSet.getString("name");//相当读取列name的值
int age = resultSet.getInt(3);//相当于读取列age的值
System.out.println("id:"+id+"\tname:"+name+"\tage:"+age);
resultSet.close();
statement.close();
connection.close();
复制代码