《JDBC》
目录
一、JDBC简介
Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。
驱动jar包下载
- 访问maven仓库:https://mvnrepository.com,搜索mysql jdbc,进入mysql-connector-java版本选择界面;
- 选择与已安装mysql版本对应的最新子版本,点击进入下载界面;
- 点击jar文件下载链接。
执行结果
二、JDBC操作数据库
核心步骤
- 加载驱动;
- 获取数据库连接;
- 获取SQL执行器;
- 执行SQL并返回结果集;
- 关闭资源。
核心API
- DriverManager:驱动管理器,可创建数据库连接;
- Connection:数据库连接;
- Statement:sql执行器;
- PreparedStatement:预编译sql执行器(效率更高更安全);
- executeQuery():执行查询,返回结果集;
- executeUpdate():执行增删改,返回受影响的行数;
- ResultSet:结果集;
- ResultSetMetaData:元数据(包含表头信息);
环境准备
- 新建Java项目,src目录下新建lib包,将jdbc驱动复制到lib下;
- 鼠标右键lib包——>Add As Libray…
执行结果
案例一
package com.hpr.test;
import java.sql.*;
public class JdbcTest {
//1.加载驱动
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
//url格式(jdbc:mysql://服务器地址:端口/数据库,同时可指定字符集、时区等参数)
String url = "jdbc:mysql://localhost:3306/test?characterEncoding=utf8&serverTimeZone=Asia/Shanghai";
String username = "root";
String password = "123456";
Connection conn;
try {
//2.获取连接
conn = DriverManager.getConnection(url, username, password);
//3.获取PreparedStatement对象(SQL执行器)
String sql = "select * from teacher where teacher_id>? and age<?";
PreparedStatement ps = conn.prepareStatement(sql);
//参数注入(给sql中?设置值)
ps.setObject(1, 101);
ps.setObject(2, 40);
//4.执行sql返回结果集
ResultSet rs = ps.executeQuery();
//处理结果集(如打印输出)
while (rs.next()) {
System.out.println(rs.getInt("teacher_id") + "——" +
rs.getString("teacher_name"));
}
//5.资源关闭(倒着关)
rs.close();
ps.close();
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
三、JDBC工具类
主要目的:简化步骤,高级封装,方便调用。
- JdbcUtil
package com.hpr.util;
import java.sql.*;
import java.util.*;
public class JdbcUtil {
//连接参数
private static final String url = "jdbc:mysql://localhost:3306/test?characterEncoding=utf8&serverTimeZone=Asia/Shanghai";
private static final String username = "root";
private static final String password = "123456";
//1.加载驱动
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 查询方法(将结果集转化为List<Map<String,Object>>)
*
* @param sql 要执行的sql
* @param params 要注入的参数
* @return 结果集
*/
public static List<Map<String, Object>> executeQuery(String sql, Object... params) {
List<Map<String, Object>> result = new ArrayList<>();
try {
//2.获取连接
Connection conn = DriverManager.getConnection(url, username, password);
//3.获取sql执行器
PreparedStatement ps = conn.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
ps.setObject(i + 1, params[i]);
}
//4.执行sql,返回结果集
ResultSet rs = ps.executeQuery();
while (rs.next()) {
//将每条记录转化为一个Map
Map<String, Object> map = new LinkedHashMap<>();
//获取表头
ResultSetMetaData md = rs.getMetaData();
for (int i = 0; i < md.getColumnCount(); i++) {
map.put(md.getColumnName(i + 1), rs.getObject(md.getColumnName(i + 1)));
}
//添加到结果集
result.add(map);
}
//5.资源关闭
rs.close();
ps.close();
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return result;
}
/**
* 增删改方法(返回受影响的行数)
*
* @param sql 要执行的sql
* @param params 要注入的参数
* @return 结果集
*/
public static int executeUpdate(String sql, Object... params) {
int count = 0;
try {
//2.获取连接
Connection conn = DriverManager.getConnection(url, username, password);
//3.获取sql执行器
PreparedStatement ps = conn.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
ps.setObject(i + 1, params[i]);
}
//4.执行sql,返回结果
count = ps.executeUpdate();
//5.资源关闭
ps.close();
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
//判断并返回结果
return count;
}
}
- 测试
public static void main(String[] args) {
//查询测试
String sql1 = "select * from teacher where teacher_id>? and age<?";
List<Map<String, Object>> result = JdbcUtil.executeQuery(sql1, 101, 40);
result.forEach(System.out::println);
//新增测试
//String sql2 = "insert into teacher(teacher_name,age,phone_number) value (?,?,?)";
//int count = JdbcUtil.executeUpdate(sql2, "F老师", 30, "18829304290");
//System.out.println(count);
}
总结
重点
- JDBC相关概念;
- JDBC操作数据库五大步骤;
- JDBC工具类。
难点
- JDBC工具类。