使用JDBC访问mysql, JDBC 是 Java DataBase Connectivity (Java 数据连接)技术的简称,是一种可用于执行 SQL 语句的
Java API。
加载mysql数据库驱动Class.forName("com.mysql.cj.jdbc.Driver");
的这一步骤不需要写代码了, java会通过SPI机制
自动去发现驱动并加载驱动,初学者知道有这回事即可
- 在maven的
pom.xml
文件中添加mysql数据库驱动的依赖包
<!-- mysql驱动包 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.4.0</version>
</dependency>
要学会在maven中心仓库寻找第三方的依赖包,
上面这个依赖在maven仓库的地址是点击直达
- 在mysql数据库中, 创建数据库
test
创建用户表user
,id
为主键字段,唯一标识一行数据,包含了常用的三种数据类型,字符串类型长度使用默认的255,
添加一些用于测试的数据
-- 创建数据库test
create database if not exists test;
-- 建用户表
CREATE TABLE `user` (
`id` int NOT NULL,
`username` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`createtime` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
);
-- 插入表数据
INSERT INTO `test`.`user` (`id`, `username`, `email`, `createtime`) VALUES (51, '测试用户1', 'ceshi1@google.com', '2024-08-05 11:04:18');
INSERT INTO `test`.`user` (`id`, `username`, `email`, `createtime`) VALUES (60, 'vip用户', 'vip1@qq.com', '2024-08-01 11:05:12');
- 使用jdbc代码查询数据库
import java.sql.*;
import java.time.LocalDateTime;
public class JdbcTest {
public static void main(String[] args) {
// 数据库连接配置, 包括 ip,端口,用户名,密码, (数据库驱动的类路径,如 com.mysql.cj.jdbc.Driver ,此处只使用了一种数据库所以不需要)
String databaseUrl = "jdbc:mysql://127.0.0.1:3306/test";
String databaseUsername = "root";
String databasePassword = "root";
// 要执行的查询sql
String selectSql = "select * from user";
Connection connection = null;
Statement statement = null;
try {
// 获取数据库连接
connection = DriverManager.getConnection(databaseUrl, databaseUsername, databasePassword);
statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(selectSql);
// 获取 sql执行结果的元数据, 也就是数据格式, 如查询结果包含的那些字段名,字段类型等
ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount = metaData.getColumnCount();
// 注意索引从1开始,
System.out.println("查询结果包含的字段开始: ");
for (int i = 1; i <= columnCount; i++) {
String columnName = metaData.getColumnName(i);
String columnTypeName = metaData.getColumnTypeName(i);
String columnClassName = metaData.getColumnClassName(i);
System.out.println("字段名: " + columnName + " ,数据库类型: " + columnTypeName + ", 对应的java类型: " + columnClassName);
}
System.out.println("查询结果包含的字段结束");
// 按行读取查询结果, 就像一个指针, 调用一次next()方法, 指针指向下一行并返回true, 如果没有下一行则返回false, while循环结束
System.out.println("按行打印查询的结果: ");
while (resultSet.next()) {
// 根据建表语句,可以知道 查询的结果为user表的所有字段: id,username,email,createtime ,所以我们可以这样获取结果
// 获取指定字段的值, 对应sql查询结果的字段, 不同方法会把值转换为对应的类型返回, 如 getInt 会把字段的值转换为int对象返回
int id = resultSet.getInt("id");
String username = resultSet.getString("username");
String email = resultSet.getString("email");
// 对数据库时间字段可以转换为很多种java类型, 如下, java8之后, 所有对时间的处理都推荐转换为LocalDateTime对象进行运算
java.sql.Date date = resultSet.getDate("createtime");
java.sql.Time time = resultSet.getTime("createtime");
java.sql.Timestamp timestamp = resultSet.getTimestamp("createtime");
// 转换为LocalDateTime对象
LocalDateTime localDateTime = resultSet.getObject("createtime", LocalDateTime.class);
// 输出数据
System.out.println("id: " + id + " ,username: " + username + " ,email: " + email + " ,createtime: " + localDateTime);
// 如果要执行其他selectSql,查的表或查的字段变了, 那么上面的获取字段值的代码显然每次都要改变, 所以我们开动🧠
// 更通用的获取查询结果
for (int i = 1; i <= columnCount; i++) {
String columnName = metaData.getColumnName(i);
String columnClassName = metaData.getColumnClassName(i);
try {
Object columnValue = resultSet.getObject(i, Class.forName(columnClassName));
System.out.print(columnName + ": " + columnValue + " ,");
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
System.out.println();
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
// 关闭资源
if (connection != null) {
try {
connection.close();
} catch (SQLException ignore) {
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException ignore) {
}
}
}
}
}
cook
- 把查询的结果放入
List<Map<String, Object>>
类型的对象, 每一行是列表中的一个元素, 字段名为哈希表的key,字段值为哈希表的value