JDBC
JDBC详解
JDBC通过Java代码来操作数据库。
-
实际工作中大部分数据库操作都是通过代码来完成的
-
各种编程语言都能够操作数据库,主要原因是因为数据库提供了各个语言版本的API,调用这些API就能操作数据库。
-
不同的数据库提供的API不太一样,这样导致使用不同的数据库就需要写多份代码。解决这个问题的办法就是把各种数据库的API再次抽象封装一层,封装出一套统一的API,其中Java里面,这样的封装就是由Java标准库来完成,此时这一套封装,就称为JDBC
- JDBC就是Java标准库提供的API,通过这一组API就可以操作任何数据库
- 数据库的JDBC驱动:相当于Java标准库定制一个标准的API,然后数据库厂商按照这套标准来提供一组接口
JDBC开发
JDBC API是标准库自带,直接就能用
MySQL的JDBC驱动,不是系统自带的,需要额外下载
中央仓库: Maven Repository: Search/Browse/Explore (mvnrepository.com)
MySQL的JDBC驱动
- 8.x系列
- 5.x系列 (bit使用
这里下载的是对应的jar包,jar包相当于.class文件的压缩包
import com.mysql.jdbc.JDBC4PreparedStatement;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
import javax.sql.DataSource;
/**
* Created by 伦敦看日出
* Description:
* User: yyt
* Date: 2023-3-21
* Time: 15:56
*/
public class Test {
public static void main(String[] args) throws SQLException {
// testInsert();
// testDelete();
testSelect();
}
// 1.尝试插入
public static void testInsert() throws SQLException {
// A:创建数据库源,把数据库的位置信息设置进去
// 1.DataSource这个概念表示数据库在哪,来源于标准库的一个interface
// 2.MysqlDataSource来源于下载的MySQL jar包
DataSource dataSource = new MysqlDataSource();
// 3.建立于数据库的连接,ip 端口 数据名 | 这里涉及到向下转型
//characterEncoding指定编码方式 | useSSL=false 关闭加密
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java101?characterEncoding=utf8&useSSL=false");
// 4.输入用户名于密码 root | 1234
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("1234");
// B:连接数据库,进行真正的网络通信
// 5. 如果连接上了返回一个Connection实例,否则抛出一个异常
// Connection在标准库和MySQL都有,这里使用的是标准库的:导入import java.sql.Connection;
// 抛出异常 throws SQLException 不然getConnection会有波浪线爆红
Connection connection = dataSource.getConnection();
//动态变化:拼接SQL,但是不安全,不太建议使用
// 让用户输入表中的信息
Scanner scanner = new Scanner(System.in);
System.out.println("请输入学号:");
int id = scanner.nextInt();
System.out.println("请输入姓名:");
String name = scanner.next();
// C.构造一个SQL语句,为插入做准备
// 通过其它语言操作数据库,本质上还是使用SQL
// 这里不需要使用use,通过上述操作已经直接连接到了对应的数据库
// String sql = "insert into student values(1,'张三')";
// String sql = "insert into student values("+ id +",'"+ name +"')";
// 下面这里的?表示占位符,后续使用PreparedStatement将其替换成具体的值
String sql = "insert into student values(?,?)";
// 使用一个SQL还不够,要想使用SQL,还需要一个专门的对象,PreparedStatement
// Connection自身知道服务器的位置(从DataSource过来),
// 通过Connection创建出了prepareStatement,此时prepareStatement也知道服务器的位置了
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id);
statement.setString(2,name);
System.out.println("sql:" + statement);
// D.执行SQL
// 客户端把SQL通过网络请求,发送给mysql服务器
// MySQL服务器来解析这个SQL请求,执行具体操作,返回响应结果
// 此处使用 executeUpdate 来完成数据库内容的变更 | 变更包括 insert,update,delete
// 返回值表示这个操作影响到的行数
int row = statement.executeUpdate();
System.out.println("ret: "+ row);
// E.执行完SQL,回收资源
statement.close();
connection.close();
}
// 2.尝试删除
public static void testDelete() throws SQLException{
// 1.创建数据源,把数据库的位置信息,设置进去
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java101?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("1234");
// 2.和数据库建立连接
Connection connection = dataSource.getConnection();
// 3.构造SQL
Scanner scanner = new Scanner(System.in);
System.out.println("请输入需要删除的id: ");
int id = scanner.nextInt();
String sql = "delete from student where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id);
// 4.执行SQL
int row = statement.executeUpdate();
System.out.println("row= " + row);
// 5.释放资源
statement.close();
connection.close();
}
// 3.尝试修改
public static void testUpdate() throws SQLException {
// 1.创建数据源,把数据库的位置信息设置进去
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java101?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("1234");
// 2.和数据库建立连接
Connection connection = dataSource.getConnection();
// 动态修改代码
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要修改的id: ");
int id = scanner.nextInt();
System.out.println("请输入要修改的name: ");
String name = scanner.next();
// 3.构造SQL
String sql = "update student set name = ? where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, name);
statement.setInt(2,id);
// 4.执行SQL
int row = statement.executeUpdate();
System.out.println("row= "+ row);
// 5.释放资源
statement.close();
connection.close();
}
// 4.尝试查找
public static void testSelect() throws SQLException {
// 1.创建数据源,将数据库的位置信息设置进去
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java101?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("1234");
// 2.和数据库建立连接
Connection connection = dataSource.getConnection();
// 3.构造SQL
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
//4.执行SQL
ResultSet resultSet = statement.executeQuery();
// 5.遍历结果集合
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id: "+ id + ", name: "+ name);
}
// 6.释放资源
resultSet.close();
statement.close();
connection.close();
}
}