JDBC
在学习JDBC之前,我们需要了解一个概念——驱动。
什么是驱动呢?
驱动是驱动程序的缩写,是指直接工作在各种硬件设备上的软件,其“驱动”这个名称也十分形象的指明了它的功能。正是通过驱动程序,各种硬件设备才能正常运行,达到既定的工作效果。例如声卡驱动、显卡驱动等等,所以数据库,也当然会有驱动。
我们的程序也会通过数据库驱动,和数据库“打交道”。
而SUN公司为了简化开发人员的(对数据库的统一)操作,提供了一个(Java操作数据库)规范,俗称JDBC,这些规范的实现由具体的厂商去做,对于开发人员来说,我们只需要掌握JDBC接口的操作即可!
Java中,要想操作数据库,首先需要导入Java默认就有的java.sql包和javax.sql包之外,还需要导入一个数据库驱动包mysql-connector-java-8.0.26,下载地址:https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.26
测试JDBC程序
首先还是通过一些例子来学习JDBC,首先创建一个测试数据库:
-- JDBC
CREATE DATABASE jdbcStudy CHARACTER SET utf8 COLLATE utf8_general_ci
USE jdbcStudy
DROP TABLE `users`
CREATE TABLE `users`(
`id` INT NOT NULL,
`name` VARCHAR(40),
`password` VARCHAR(40),
`email` VARCHAR(60),
`brith` DATE
);
INSERT INTO `users`(`id`,`name`,`password`,`email`,`brith`)
VALUES
(1,'张三','123456','127*****236@qq.com','1999-06-20'),
(2,'李四','123456','128*****351@qq.com','1997-08-30'),
(3,'王五','123456','126*****234@qq.com','1996-07-12');
然后导入我们刚刚下载的数据库驱动:新建一个project后,创建一个lib文件夹,然后驱动文件移动至该文件夹——
编写测试代码:
// 测试
public class JDBCFirstDemo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1. 加载驱动(注意,MySQL8.0之前的版本的字符串为"com.mysql.jdbc.Driver")
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 用户信息和url(问号之后的参数分别是:支持中文,设置字符编码为utf8,设置安全链接)
String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
String name = "root";
String password = "12345";
// 3. 连接成功,数据库对象 connection代表数据库
Connection connection = DriverManager.getConnection(url, name, password);
// 4. 执行SQL的对象 Statement是执行SQL的对象
Statement statement = connection.createStatement();
// 5. 执行SQL的对象去执行SQL,可能存在结果,查看返回结果
String sql = "SELECT * FROM `users`";
ResultSet resultSet = statement.executeQuery(sql); // 返回的结果集,结果集中封装了我们全部的查询出来的结果
while(resultSet.next()) {
System.out.println("id=" + resultSet.getObject("id"));
System.out.println("name=" + resultSet.getObject("name"));
System.out.println("password=" + resultSet.getObject("password"));
System.out.println("email=" + resultSet.getObject("email"));
System.out.println("birth=" + resultSet.getObject("birth"));
}
// 6. 释放连接
resultSet.close();
statement.close();
connection.close();
}
}
如果上述代码报错,可以试着将useSSL修改为false,或者再url后面添加时区字段serverTimezone=UTC,如果还是报错,建议这边再检查一下代码或者是问万能的百度~
总结一下步骤:
1、加载驱动
2、连接数据库DriverManager
3、获得执行SQL对象Statement
4、获得返回的结果集
5、释放连接
扩展:为什么在第一个步骤中,Class不需要返回对象呢?首先我们观察一下整体的代码,并不需要返回这个Class对象,其次呢,在原本的写法中,是有一个DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());的写法,意思是注册驱动,但是我们查看Driver类的源代码可以发现,它执行了一个静态代码类,而该类里面已经执行了一次注册驱动,所以再写这串代码就显得有些多余了。
关于Connection:
Connection connection = DriverManager.getConnection(url, name, password);
// connection代表数据库,我们可以在这里进行一些数据库级别的操作,例如设置数据库自动提交,以及事务的提交和事务回滚等
connection.setAutoCommit(true);
connection.commit();
connection.rollback();
关于url:
// MySQL -- 端口号默认为3306
String url = "jdbc:mysql://localhost:3306/jdbcstudy?" +
"useUnicode=true&characterEncoding=utf8&useSSL=true";
//协议://主机地址:端口号/数据库名?参数1&参数2&参数3...
//Oralce -- 端口号默认为1521
// jdbc:oralce:thin:@localhost:1521:sid
关于Statement: