🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
文章目录
🚀一、JDBC快速入门
🔎1.jdbc的概念
JDBC是一种Java程序调用关系型数据库管理系统(RDBMS)的API。JDBC是Java Database Connectivity的缩写,它提供了一种标准的Java API,用于连接和操作数据库。使用JDBC,Java程序可以与不同类型的数据库进行通信,如Oracle、MySQL、SQL Server等。JDBC的主要目的是为Java程序员提供一个标准的接口,让他们无需了解各种数据库的不同API和查询语言,就可以连接和操作数据库。JDBC包含了一组标准的Java接口和类,可以通过这些接口和类来完成数据库连接、SQL查询、事务等操作。
🔎2.jdbc的本质
JDBC(Java Database Connectivity)是Java语言对数据库进行操作的一组API(应用程序接口)。它提供一种标准的方法,使得Java应用程序能够访问任意数据库,而无需关注底层数据库系统的具体实现细节。JDBC的本质是一组用于连接和操纵不同类型数据库的API,它可以为Java应用程序提供与多种数据库(如Oracle、MySQL、SQL Server等)进行交互的能力。通过JDBC,Java应用程序可以连接到数据库、执行SQL语句、处理结果集等操作。
🔎3.jdbc的快速入门程序
快速入门程序如下:
-
首先,需要下载并安装JDBC驱动程序,并将其添加到项目的类路径中。这里以MySQL的驱动程序为例,下载地址为https://dev.mysql.com/downloads/connector/j/。
-
在Java文件中引入相关的类库:
import java.sql.*;
- 建立与数据库的连接:
import java.sql.*;
public class jdbc {
public static void main(String[] args) throws Exception {
// 定义数据库的连接信息
String driverClass = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/db14?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&useSSL=false";
String username = "root";
String password = "123456";
Connection conn = null;
try {
// 加载驱动程序
Class.forName(driverClass);
// 建立数据库连接
conn = DriverManager.getConnection(url, username, password);
// 执行SQL查询
Statement stmt = conn.createStatement();
//stmt.executeUpdate("INSERT INTO student VALUES (NULL,'愚公2',23,'1999-09-23');");
ResultSet rs = stmt.executeQuery("SELECT * FROM student");
while (rs.next()) {
System.out.println(rs.getString("NAME"));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭数据库连接
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
这个程序建立了一个连接到MySQL数据库的连接,并执行了一个简单的查询。最后,关闭数据库连接。
注意,这个程序中的数据库连接信息是写死的,实际应用中应该将其配置到外部文件中,以便修改配置信息时不需要重新编译程序。
🚀二、JDBC API 详解
下面是JDBC API的常用类和接口的表格展示:
类/接口 | 说明 |
---|---|
DriverManager | JDBC驱动管理器,用于加载JDBC驱动程序并获取Connection对象 |
Connection | JDBC连接接口,使用该接口可以连接数据库,管理事务和处理SQL语句 |
Statement | 用于执行包含SQL语句和参数的预编译的静态SQL语句 |
PreparedStatement | 继承自Statement接口,用于执行包含预编译的参数化SQL语句 |
CallableStatement | 继承自PreparedStatement接口,用于执行存储过程 |
ResultSet | 用于获取执行SELECT语句返回的结果集 |
ResultSetMetaData | 用于获取ResultSet结果集的元数据信息,如列名、数据类型、长度等 |
DatabaseMetaData | 用于获取数据库的元数据信息,如数据库名、表名、列名、主键等 |
Savepoint | 用于处理事务中的回滚操作,可以设置事务回滚点 |
SQLException | 用于处理JDBC访问数据库时的异常信息 |
JDBC API的示例:
import java.sql.*;
public class jdbc {
public static void main(String[] args) throws Exception {
// 定义数据库的连接信息
String driverClass = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/db14?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&useSSL=false";
String username = "root";
String password = "123456";
Connection conn = null;
// 加载驱动程序
Class.forName(driverClass);
// 建立数据库连接
conn = DriverManager.getConnection(url, username, password);
// 3、创建Statement对象,用于执行SQL语句
Statement stmt = conn.createStatement();
// 4、执行SQL语句
String sql = "SELECT * FROM student";
ResultSet rs = stmt.executeQuery(sql);
// 5、遍历结果集
while (rs.next()) {
int id = rs.getInt("sid");
String name = rs.getString("NAME");
int age = rs.getInt("age");
Date birthday = rs.getDate("birthday");
System.out.println("id=" + id + ", name=" + name + ", age=" + age +",birthday=" + birthday);
}
// 6、关闭连接对象和Statement对象
rs.close();
stmt.close();
conn.close();
}
}
上述示例中,首先注册MySQL的JDBC驱动程序,然后获取数据库连接对象,创建Statement对象执行SQL语句,最后遍历结果集并关闭连接对象和Statement对象。
🚀三、JDBC案例student学生表的CRUD
🔎1.数据准备
- 数据库和数据表
-- 创建db14数据库
CREATE DATABASE db14;
-- 使用db14数据库
USE db14;
-- 创建student表
CREATE TABLE student(
sid INT PRIMARY KEY AUTO_INCREMENT, -- 学生id
NAME VARCHAR(20), -- 学生姓名
age INT, -- 学生年龄
birthday DATE -- 学生生日
);
-- 添加数据
INSERT INTO student VALUES (NULL,'张三',23,'1999-09-23'),(NULL,'李四',24,'1998-08-10'),(NULL,'王五',25,'1996-06-06'),(NULL,'赵六',26,'1994-10-20');
- 实体类
- Student类,成员变量对应表中的列
- 注意:所有的基本数据类型需要使用包装类,以防null值无法赋值
package com.itheima02.domain;
import java.util.Date;
public class Student {
private Integer sid;
private String name;
private Integer age;
private Date birthday;
public Student() {
}
public Student(Integer sid, String name, Integer age, Date birthday) {
this.sid = sid;
this.name = name;
this.age = age;
this.birthday = birthday;
}
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "Student{" +
"sid=" + sid +
", name='" + name + '\'' +
", age=" + age +
", birthday=" + birthday +
'}';
}
}
🔎2.需求一:查询全部
- 持久层
/*
查询所有学生信息
*/
@Override
public ArrayList<Student> findAll() {
ArrayList<Student> list = new ArrayList<>();
Connection con = null;
Statement stat = null;
ResultSet rs = null;
try{
con = JDBCUtils.getConnection();
//3.获取执行者对象
stat = con.createStatement();
//4.执行sql语句,并且接收返回的结果集
String sql = "SELECT * FROM student";
rs = stat.executeQuery(sql);
//5.处理结果集
while(rs.next()) {
Integer sid = rs.getInt("sid");
String name = rs.getString("name");
Integer age = rs.getInt("age");
Date birthday = rs.getDate("birthday");
//封装Student对象
Student stu = new Student(sid,name,age,birthday);
//将student对象保存到集合中
list.add(stu);
}
} catch(Exception e) {
e.printStackTrace();
} finally {
//6.释放资源
JDBCUtils.close(con,stat,rs);
}
//将集合对象返回
return list;
}
- 业务层
/*
查询所有学生信息
*/
@Override
public ArrayList<Student> findAll() {
return dao.findAll();
}
- 控制层
/*
查询所有学生信息
*/
public void findAll() {
ArrayList<Student> list = service.findAll();
for(Student stu : list) {
System.out.println(stu);
}
}
🔎3.需求二:条件查询
- 持久层
/*
条件查询,根据id查询学生信息
*/
@Override
public Student findById(Integer id) {
Student stu = new Student();
Connection con = null;
Statement stat = null;
ResultSet rs = null;
try{
con = JDBCUtils.getConnection();
//3.获取执行者对象
stat = con.createStatement();
//4.执行sql语句,并且接收返回的结果集
String sql = "SELECT * FROM student WHERE sid='"+id+"'";
rs = stat.executeQuery(sql);
//5.处理结果集
while(rs.next()) {
Integer sid = rs.getInt("sid");
String name = rs.getString("name");
Integer age = rs.getInt("age");
Date birthday = rs.getDate("birthday");
//封装Student对象
stu.setSid(sid);
stu.setName(name);
stu.setAge(age);
stu.setBirthday(birthday);
}
} catch(Exception e) {
e.printStackTrace();
} finally {
//6.释放资源
JDBCUtils.close(con,stat,rs);
}
//将对象返回
return stu;
}
- 业务层
/*
条件查询,根据id查询学生信息
*/
@Override
public Student findById(Integer id) {
return dao.findById(id);
}
- 控制层
/*
条件查询,根据id查询学生信息
*/
public void findById() {
Student stu = service.findById(3);
System.out.println(stu);
}
🔎4.需求三:新增数据
- 持久层
/*
添加学生信息
*/
@Override
public int insert(Student stu) {
Connection con = null;
Statement stat = null;
int result = 0;
try{
con = JDBCUtils.getConnection();
//3.获取执行者对象
stat = con.createStatement();
//4.执行sql语句,并且接收返回的结果集
Date d = stu.getBirthday();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String birthday = sdf.format(d);
String sql = "INSERT INTO student VALUES ('"+stu.getSid()+"','"+stu.getName()+"','"+stu.getAge()+"','"+birthday+"')";
result = stat.executeUpdate(sql);
} catch(Exception e) {
e.printStackTrace();
} finally {
//6.释放资源
JDBCUtils.close(con,stat);
}
//将结果返回
return result;
}
- 业务层
/*
添加学生信息
*/
@Override
public int insert(Student stu) {
return dao.insert(stu);
}
- 控制层
/*
添加学生信息
*/
public void insert() {
Student stu = new Student(5,"周七",27,new Date());
int result = service.insert(stu);
if(result!=0) {
System.out.println("添加成功");
}else {
System.out.println("添加失败");
}
}
🔎5.需求四:修改数据
- 持久层
/*
修改学生信息
*/
@Override
public int update(Student stu) {
Connection con = null;
Statement stat = null;
int result = 0;
try{
con = JDBCUtils.getConnection();
//3.获取执行者对象
stat = con.createStatement();
//4.执行sql语句,并且接收返回的结果集
Date d = stu.getBirthday();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String birthday = sdf.format(d);
String sql = "UPDATE student SET sid='"+stu.getSid()+"',name='"+stu.getName()+"',age='"+stu.getAge()+"',birthday='"+birthday+"' WHERE sid='"+stu.getSid()+"'";
result = stat.executeUpdate(sql);
} catch(Exception e) {
e.printStackTrace();
} finally {
//6.释放资源
JDBCUtils.close(con,stat);
}
//将结果返回
return result;
}
- 业务层
/*
修改学生信息
*/
@Override
public int update(Student stu) {
return dao.update(stu);
}
- 控制层
/*
修改学生信息
*/
public void update() {
Student stu = service.findById(5);
stu.setName("周七七");
int result = service.update(stu);
if(result != 0) {
System.out.println("修改成功");
}else {
System.out.println("修改失败");
}
}
🔎6.需求五:删除数据
- 持久层
/*
删除学生信息
*/
@Override
public int delete(Integer id) {
Connection con = null;
Statement stat = null;
int result = 0;
try{
con = JDBCUtils.getConnection();
//3.获取执行者对象
stat = con.createStatement();
//4.执行sql语句,并且接收返回的结果集
String sql = "DELETE FROM student WHERE sid='"+id+"'";
result = stat.executeUpdate(sql);
} catch(Exception e) {
e.printStackTrace();
} finally {
//6.释放资源
JDBCUtils.close(con,stat);
}
//将结果返回
return result;
}
- 业务层
/*
删除学生信息
*/
@Override
public int delete(Integer id) {
return dao.delete(id);
}
- 控制层
/*
删除学生信息
*/
public void delete() {
int result = service.delete(5);
if(result != 0) {
System.out.println("删除成功");
}else {
System.out.println("删除失败");
}
}
🚀四、JDBC工具类
🔎1.工具类的抽取
- 配置文件(在src下创建config.properties)
url=jdbc:mysql://localhost:3306/db14
username=root
password=123456
- 工具类
/*
JDBC工具类
*/
public class JDBCUtils {
//1.私有构造方法
private JDBCUtils(){};
//2.声明配置信息变量
private static String driverClass;
private static String url;
private static String username;
private static String password;
private static Connection con;
//3.静态代码块中实现加载配置文件和注册驱动
static{
try{
//通过类加载器返回配置文件的字节流
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("config.properties");
//创建Properties集合,加载流对象的信息
Properties prop = new Properties();
prop.load(is);
//获取信息为变量赋值
driverClass = prop.getProperty("driverClass");
url = prop.getProperty("url");
username = prop.getProperty("username");
password = prop.getProperty("password");
//注册驱动
Class.forName(driverClass);
} catch (Exception e) {
e.printStackTrace();
}
}
//4.获取数据库连接的方法
public static Connection getConnection() {
try {
con = DriverManager.getConnection(url,username,password);
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
//5.释放资源的方法
public static void close(Connection con, Statement stat, ResultSet rs) {
if(con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stat != null) {
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Connection con, Statement stat) {
close(con,stat,null);
}
}
🚀感谢:给读者的一封信
亲爱的读者,
我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。
如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。
我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。
如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。
再次感谢您的阅读和支持!
最诚挚的问候, “愚公搬代码”