1、JDBC的认识
学了这么久的 MySQL,我们一直采用的都是 MySQL 软件自带的客户端(黑框框),来进行跟MySQL服务器进行交互。但是在实际开发中我们很少在黑框框中手动输入SQL,大多数都是通过代码自动执行SQL的。既然大多数都是通过代码自动执行SQL的,那么就需要让其他编程语言来操作数据库服务器。
既然需要让其他编程语言来操作数据库服务器,那么首先就得让其他语言先写一个数据库客户端,然后让数据库客户端与数据库服务器进行交互,这样就可以通过代码自动执行SQL了
MySQL 提供了很多的 API,通过MySQL 提供的API可以让我们比较方便的实现一个MySQL客户端。MySQL的API原本是C语言风格的,但是考虑到 MySQL 使用的非常广泛,也提供了一些其他语言版本的API,但是其他版本的 API 本质上还是调用的是C语言风格的 API 也就是跨语言进行调用
Oracle、SQLServer、SQLite 等数据库都有各自API,不同的数据库 API 也是不同的。学习数据库编程,得学那么多API,这样不就提高了咱们程序猿学习的成本了么
于是在 Java 圈子里,就有大佬把这些API统一成了一套,这套API就是JDBC,JDBC这套API已经成为了Java 标准库的一部分了,由于 Java 影响力很大,以自身作为标准,此时各种数据库厂商都提供了能够适应 JDBC 相关的“驱动包”(驱动包就相当于API 的具体实现)。此时只有掌握了JDBC这套API,无论操作哪个数据库,操作的代码都是基本相同的
JDBC:屏蔽了不同数据库元素API之间的差异,使用同一套API接口规范了所有数据库的编程操作
有了 Java这个标杆之和,后面的语言都纷纷跟进,Python,GO,C#这些语言也都开始做类似的事情了
2、JDBC的使用
2.1 下载对应数据库的驱动包
JDBC屏蔽了不同数据库原生API之间的差距,使用同一套API接口来规范了所有数据库的编程操作
驱动包是数据库厂商实现的,所有我们要去官网或中央仓库中下载
我们这里就主要讲解如何去Maven中央仓库中下载:
第一步:输入Maven中央仓库链接(大家可以关注下述公众号,发送Maven即可获取哦!)
第二步:在 Maven 中央仓库搜索框中搜索mysql
第三步:找到 MySQL Connector Java
第四步:找到 5.1 开头的版本
第五步:点击 jar,即可下载
下载完成后,本地指定存储位置就有一个这样的文件:
这个文件的后缀为.jar,这是一个Java的压缩包
2.2 把 jar 包导入到项目中
第一步:在项目中创建一个目录,把.jar拷贝进去
第二步:将lib目录,添加为依赖库,依赖目录名字可以随便取
2.3 编写数据库代码
JDBC 里面的 API 虽然很多,但是都是固定套路。JDBC里面的很多关键API都是 interface 接口,它们都是由具体的数据库驱动包来提供对应的实现类
接下来我们就用 JDBC 编程来实现 MySQL 的增删查改
用 JDBC 编程进行增删查改,是对指定库中指定表进行操作的,所以在JDBC编程之前需要考虑对数据库中的哪个库,哪个表进行操作,然后再进行 JDBC 编程
2.3.1 增加
public static void main(String[] args) throws SQLException {
//1.创建数据源,描述数据库服务器在哪
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=utf8&useSSL=false");
//设置数据库所在位置,当前固定写法
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("111111");
//2.连接,选中后 Alt + Enter 将受查异常抛给调用者处理
Connection connection = (Connection) dataSource.getConnection();
//3.构造 SQL 语句
String sql = "insert into student value(?,?)";
Scanner scanner = new Scanner(System.in);
System.out.print("请输入id:");
int id = scanner.nextInt();
System.out.print("请输入name:");
String name = scanner.next();
//JDBC 中还需要搭配一个特定的对象,来描述这里的 SQL 的情况
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id);
statement.setString(2,name);
//4.执行 SQL,针对增删改,使用 executeUpdate ,针对查,使用 executeQuery
//返回结果的含义是,这个操作影响了几行
int ret = statement.executeUpdate();
if (ret != 0) {
System.out.println("增加成功");
}
//5.断开连接,释放资源
statement.close();
connection.close();
}
代码解析:
1.创建数据源,描述数据库服务器在哪
DataSource dataSource = new MysqlDataSource();
向上转型,DataSource 是一个 interface 的接口类,我们下载的驱动包中的MysqlDataSource实现了这个DataSource接口类
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=utf8&useSSL=false");
向下转型,调用MysqlDataSource里面的 setUrl 方法来描述数据库服务器在哪
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("111111");
root:root是 mysql 自带的用户名,也可以配置成其他的,如果没有配置成其他的默认就是 root
111111:这个是登录数据库的密码
问题:为什么不直接用 MysqlDataSource dataSource = new MysqlDataSource(),这样不就不需要向下转向了么,为什么要先向上转型再向下转型呢?
答:因为 MysqlDataSource 是 MySQL 驱动包中的,DataSource 是 JDBC 中的。不同的驱动包中实现DataSource 的类是不同的,代码中使用 DataSorce 类型的实例,可以避免 MysqlDataSource 这个名字扩散到代码的各个地方,未来要换数据库只需要改动创建数据源代码即可
2.连接操作
上面的数据源的创建操作,只是描述了服务器在哪,并没有真正进行访问。只有连接了,才能真正的开始通过网络进行通信
Connection connection = (Connection) dataSource.getConnection();
Conection:意为“连接”
在连接的时候会有受查异常,我们直接按键盘上的 Alt+Enter 键抛给调用者处理
3.构造SQL
连接建立后,我们就可以构造SQL来操作数据库了
String sql = "insert into student value(?,?)";
Scanner scanner = new Scanner(System.in);
System.out.print("请输入id:");
int id = scanner.nextInt();
System.out.print("请输入name:");
String name = scanner.next();
先用字符串类型存储命令,把输入的实参通过变量来存储
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id);
statement.setString(2,name);
再搭配一个特定的对象,来描述这里的 SQL 的情况,将实参替换到SQL语句中
4.执行SQL
int ret = statement.executeUpdate();
if (ret != 0) {
System.out.println("增加成功");
}
增删改操作使用 executeUpdate来执行 ,查操作使用 executeQuery来执行
返回结果的含义是,这个操作影响了几行
5.断开连接,释放资源
statement.close();
connection.close();
先释放里面的资源,再释放外面的资源
2.3.2 查询
public void selData() throws SQLException {
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("111111");
Connection connection = (Connection) dataSource.getConnection();
String selSql = "select * from student order by id asc";
PreparedStatement statement = connection.prepareStatement(selSql);
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
Student student = new Student();
student.setId(resultSet.getInt("id"));
student.setName(resultSet.getString("name"));
System.out.println(student);
}
System.out.println("查询成功");
resultSet.close();
statement.close();
connection.close();
}