2024.4.10 Wednesday
目录
- 10.JDBC
- 10.1.数据库驱动
- 10.1.1.驱动
- 10.1.2.JDBC
- 10.1.3.第一个JDBC程序
- 10.1.3.1.创建一个普通项目
- 10.1.3.2.导入数据库驱动
- 10.1.3.3.编写测试代码
- 10.1.3.4.DriverManager
- 10.1.3.5.URL
- 10.1.3.6.Connection
- 10.1.3.7.Statement执行SQL的对象
- 10.1.3.8.ResultSet查询的结果集,封装了所有的查询结果
- 10.1.3.9.释放资源
10.JDBC
10.1.数据库驱动
10.1.1.驱动
为了使用Java操作数据库需要使用JDBC(驱动)。类比其他驱动:(使用)声卡、显卡的前提是有驱动。
(数据库厂商提供驱动)
程序会通过数据库驱动和数据库打交道
10.1.2.JDBC
10.1.2.1.SUN公司为了简化开发人员的操作(对数据库的统一操作),提供了一个规范——Java操作数据库的规范:JDBC
10.1.2.2.这些规范的实现由具体厂商实现
10.1.2.3.开发人员只需要掌握JDBC接口的操作
10.1.3.第一个JDBC程序
创建测试数据库
CREATE DATABASE `p37jdbc` CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `p37jdbc`;
CREATE TABLE `users`(
`id` INT PRIMARY KEY,
`NAME` VARCHAR(40),
`PASSWORD` VARCHAR(40),
`email` VARCHAR(60),
birthday DATE
);
INSERT INTO `users`(`id`,`NAME`,`PASSWORD`,`email`,`birthday`)
VALUES('1','zhangsan','123456','zs@sina.com','1980-12-04'),
('2','lisi','123456','lisi@sina.com','1981-12-04'),
('3','wangwu','123456','wangwu@sina.com','1979-12-04')
10.1.3.1.创建一个普通项目
打开IDEA创建一个新项目(不使用任何预设的类型)
10.1.3.2.导入数据库驱动
-
如何选择jar包以及下载地址:https://blog.csdn.net/m0_62085973/article/details/132740542
(jar包高版本兼容mysql低版本) -
新建一个directory(如下图)
-
将对应的jar包复制粘贴进刚刚创建的文件夹
-
设置为library
会跳出弹框,点击OK即可在lib文件夹中看到多个文件生成
10.1.3.3.编写测试代码
-
选择合适的文件存放位置
解决无法创建多级文件夹的方法:
点齿轮,把compact Middle Packages 这个选项取消勾选,则能在文件夹内再创建文件夹
然后在其中lesson->one->后创建一个新的class,即为jdbcFirstDemo(命名为此),其中装填下一个小模块的代码,以查询并显示数据库‘p37jdbc’中的id、name、password等信息。
修改后的存放地址:
-
代码
package lesson.one;
import java.sql.*;
//第一个JDBC程序
public class jdbcFirstDemo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.加载驱动
Class.forName("com.mysql.cj.jdbc.Driver"); //固定写法:加载驱动
//2.用户信息和url
String url = "jdbc:mysql://localhost:3306/p37jdbc?useUnicode=true & characterEncoding=utf8 & useSSL=true";
//jdbc:mysql://localhost:3306/为固定格式,p37jdbc指数据库名称,?用于连接参数,
// useUnicode=true指可支持中文编码,&连接,characterEncoding=utf8设置中文字符为utf-8,useSSL=true使用安全的链接
String username = "root";
String password = "123456";
//3.连接成功,返回一个数据库对象,Connection代表数据库
Connection connection = DriverManager.getConnection(url, username, password);
//4.执行SQL的对象,Statement执行SQL的对象
Statement statement = connection.createStatement();
//5.(用4)执行SQL,可能存在结果->查看返回结果
String sql = "SELECT * FROM users";
//用执行SQL的对象去执行
//执行statement.executeQuery(sql):查询。会返回一个结果集,该结果集中封装了查询出的全部结果
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("psw=" + resultSet.getObject("PASSWORD"));
System.out.println("email=" + resultSet.getObject("email"));
System.out.println("birthday=" + resultSet.getObject("birthday"));
System.out.println("==============================");
}
//6.释放连接(按照获取顺序反向释放)
resultSet.close();
statement.close();
connection.close();
}
}
- 结果
- 步骤总结
- 加载驱动
- 连接数据库DriverManager
- 获取执行sql的对象 Statement
- 获得返回的结果集
- 释放连接
以下是对jdbcFirstDemo文件的详细解释
10.1.3.4.DriverManager
//不用这行,会导致注册次数变成2次 DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Class.forName("com.mysql.cj.jdbc.Driver"); //固定写法:加载驱动
(Driver的源码是静态判断,详细可打开Driver.class查看)
10.1.3.5.URL
//""内固定格式模板
//(jdbc):jdbc:mysql://主机地址:端口号/数据库名?参数1&参数2&参数3
//(oracle):jdbc:oracle:thin:@localhost:1521:sid
//默认端口号:mysql是3306,oracle是1521
String url = "jdbc:mysql://localhost:3306/p37jdbc?useUnicode=true & characterEncoding=utf8 & useSSL=true";
//更详细的解释:jdbc:mysql(协议)://localhost:3306/为固定格式,p37jdbc指数据库名称,?用于连接参数, useUnicode=true指可支持中文编码,&连接,characterEncoding=utf8设置中文字符为utf-8,useSSL=true使用安全的链接
10.1.3.6.Connection
//connection代表数据库
connection.rollback(); //事务回滚
connection.commit(); //事务提交
connection.setAutoCommit(); //数据库设置自动提交
10.1.3.7.Statement执行SQL的对象
String sql = "SELECT * FROM users";
//statement执行SQL的对象 & preparedStatement执行SQL的对象
statement.executeQuery(sql); //执行查询操作,返回resultSet结果集
statement.execute(sql); //执行任何SQL语句
statement.executeUpdate(sql); //执行更新(插入、删除),返回受影响的行数
10.1.3.8.ResultSet查询的结果集,封装了所有的查询结果
- 获得指定的数据类型
//在列类型未知时使用,括号内是被检索的语句
resultSet.getObject(sql);
//已知列类型后使用以下的相应类型
resultSet.getString(sql);
resultSet.getInt(...);
resultSet.getFloat(...);
resultSet.getDate(...);
- 遍历:指针
//移动光标
resultSet.beforeFirst(); //至最前端
resultSet.afterLast(); //至最后端
resultSet.next(); //移动到下一个数据
resultSet.previous(); //移动到前一行
resultSet.absolute(具体行数); //移动到指定行
10.1.3.9.释放资源
resultSet.close();
statement.close();
connection.close(); //耗资源,用完关闭