1.什么是JDBC?
Java DataBase Connectivity(Java语言连接数据库)
2.JDBC的本质是什么
是一套接口,接口都有调用者和实现者。面向接口调用、面向接口写实现类、这都属于面向接口编程。
为什么要面向接口编程?
解耦合:降低程序的耦合度,提高程序的扩展力。
多态机制就是典型的面向接抽象编程。
建议:
Animal a = new Cat();
Animal a = new Dog();
// 喂养的方法
public void feed(Animal a){// 面向父类型编程
}
不建议:
Dog d= new Dog();
Cat c = new Cat();
3.为什么SUN制定一套JDBC接口?
因为每一个数据库的底层实现不一样,ORACLE数据库有自己的原理,Mysql也有自己的原理,MS SqlServer数据库也有自己的原理
每一个数据库产品都有自己独特的实现原理。
4.JDBC 开发前的准备工作
-
先从官网下载对应的驱动jar包
-
将其配置到环境变量classpath当中
classpath = .;C:\Users\23716\IdeaProjects\My_System\lib\mysql-connector-java-8.0.27-bin.jar
以上配置是针对文本编辑器的,如果使用IDEA 开发则不用配置以上内容
个人实践方法:
-
先从对应品牌的数据库网站连接jar包
-
然后在文件包中建一个lib文件夹,在将所下载的jar包放到该文件夹下面
-
将lib添加到对应模块的环境变量中
5.JDBC 编程六步
-
注册驱动(作用:让java程序知道要连接哪个品牌的数据库)
-
获取连接(表示JVM的进程和数据库进程之间的通道打开了,属于是进程间的通信,重量级的,使用完之后一定要关闭)
-
获取数据库操作对象(专门执行sql语句的对象)
-
执行sql语句(DQL,DML......)
-
处理查询的结果集(只有当第四步执行的是select语句时,才有第五步处理查询结果集)
-
释放资源(使用完资源之后一定要关闭资源。Java和数据库属于是进程间的通信,开启之后一定要关闭)
6.用IDEA连接数据库并进行操作
增删改查如下:
import java.sql.*;
添加操作
//mysql驱动包名 注册驱动 cj时8之后才出现的版本
String DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
//数据库连接地址 获得数据库连接地址
String URL = "jdbc:mysql://localhost:3306/my_student_system";
//用户名,更换成你自己的用户名,此处为root用户
String USER_NAME = "root";
//密码,更换成你自己设定的密码,此处为:admin
String PASSWORD = "123456";
Connection connection = null;
// 开始进行数据库连接时线性进行数据库的注册,连接,获取操作对象,执行sql语句,获取数据集及关闭连接前用try catch围绕,避免载过程中出现连接不上等问题。
try {
//1.加载mysql的驱动类 注册驱动
Class.forName(DRIVER_NAME);
//2.获取数据库连接同时获取操作对象
/*
url:统一资源定位符(网络中某个资源的绝对路径)
URL包括哪几个部分?
协议
IP
PORT
资源名字
https://182.61.200.7:80/index.html
协议 https://
IP 182.61.200.7:
PORT 80
资源名字 index.html
通信协议:
通信协议时通信之前就提前定好的数据传输格式
数据包具体怎么传数据,格式提前就定好的
*/
connection = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
// 3.创建数据库操作对象(Statement专门执行sql语句的)
PreparedStatement prst = connection.prepareStatement(sql);
// 4.mysql查询语句 即MySQL执行语句
String sql = "insert into grades_information values (?,?,?,?,?,?,?)";
prst.setString(1, student.getID());
prst.setString(2, student.getName());
prst.setInt(3, student.getHigh_math());
prst.setInt(4, student.getEnglish());
prst.setInt(5, student.getAlgorithm());
prst.setInt(6, student.getO_s());
prst.setDouble(7, student.getAverage_grade());
JOptionPane.showMessageDialog(null, "添加成功!");
// 5.处理数据集
// 有改动数据库的操作都要添加 prst.executeUpdate() 该语句
prst.executeUpdate();
System.out.println( "执行成功");
// 6.释放资源 prst.close(); connection.close();
// 关闭操作对象
prst.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null) {
try {
// 关闭连接
connection.close();
System.out.println("关闭连接!");
} catch (SQLException e) {
// 关闭失败则抛出异常
e.printStackTrace();
}
}
}
删除操作
//mysql驱动包名
String DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
//数据库连接地址
String URL = "jdbc:mysql://localhost:3306/my_student_system";
//用户名,更换成你自己的用户名,此处为root用户
String USER_NAME = "root";
//密码,更换成你自己设定的密码,此处为:admin
String PASSWORD = "123456";
Connection connection = null;
try {
//加载mysql的驱动类
Class.forName(DRIVER_NAME);
//获取数据库连接
connection = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
//mysql查询语句
Statement statement = connection.createStatement();
String sql2 = "delete from grades_information where ID = "+"\""+ID.getText()+"\"";
int effect = statement.executeUpdate(sql2);
if (effect==0){
JOptionPane.showMessageDialog(null, "不存在该学生信息!");
}else {
JOptionPane.showMessageDialog(null, "已删除该学生信息!");
}
statement.close();
System.out.println("执行成功");
} catch (Exception e) {
e.printStackTrace();
}finally {
if (connection != null) {
try {
connection.close();
System.out.println("关闭连接!");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
查询操作
//mysql驱动包名
String DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
//数据库连接地址
String URL = "jdbc:mysql://localhost:3306/my_student_system";
//用户名,更换成你自己的用户名,此处为root用户
String USER_NAME = "root";
//密码,更换成你自己设定的密码,此处为:admin
String PASSWORD = "123456";
Connection connection = null;
try {
//加载mysql的驱动类
Class.forName(DRIVER_NAME);
//获取数据库连接
connection = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
//mysql查询语句
String id = ID.getText();
String sql = "select * from grades_information where ID = ";
String sql1 = sql.concat("\"").concat(id).concat("\"");
PreparedStatement prst = connection.prepareStatement(sql1);
ResultSet res = prst.executeQuery(sql1);
if(res.isBeforeFirst()) {
String text_message = new String();
while (res.next()) {
text_message += " 学号: "+res.getString(1)+" 姓名: "+res.getString(2)+" 高等数学: "+res.getString(3)+" 大学英语: "+res.getString(4)+" 算法设计与分析: "+res.getString(5)+" 操作系统: "+res.getString(6)
+" 平均成绩: "+res.getString(7)+"\n";
}
JOptionPane.showMessageDialog(null, text_message);
}else{
JOptionPane.showMessageDialog(null, "不存在该学生信息!");
}
// prst.executeUpdate();
System.out.println("执行成功");
prst.close();
} catch (Exception e) {
e.printStackTrace();
}finally {
if (connection != null) {
try {
connection.close();
System.out.println("关闭连接!");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
更改操作
//mysql驱动包名
String DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
//数据库连接地址
String URL = "jdbc:mysql://localhost:3306/my_student_system";
//用户名,更换成你自己的用户名,此处为root用户
String USER_NAME = "root";
//密码,更换成你自己设定的密码,此处为:admin
String PASSWORD = "123456";
Connection connection = null;
try {
//加载mysql的驱动类
Class.forName(DRIVER_NAME);
//获取数据库连接
connection = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
//mysql查询语句
String id = ID.getText();
String sql = "select * from grades_information where ID = ";
String sql1 = sql.concat("\"").concat(id).concat("\"");
PreparedStatement prst = connection.prepareStatement(sql1);
ResultSet res = prst.executeQuery(sql1);
if (res.isBeforeFirst()) {
Student student = new Student(ID.getText(), name.getText(), Integer.parseInt(higher_math.getText()), Integer.parseInt(English.getText()), Integer.parseInt(algorithm.getText()), Integer.parseInt(o_s.getText()));
String sql2 = "UPDATE grades_information set name = '" + student.getName() + "', higher_math = " + student.getHigh_math() + ",English = " + student.getEnglish() + ",Algorithm = " + student.getAlgorithm() + ",o_s = " + student.getO_s() + ",average = " + student.getAverage_grade() + " where ID = " + "\"" + student.getID() + "\"";
PreparedStatement prst2 = connection.prepareStatement(sql2);
prst2.executeUpdate();
prst2.close();
JOptionPane.showMessageDialog(null, "修改成功!");
} else {
JOptionPane.showMessageDialog(null, "不存在该学生信息!");
}
// prst.executeUpdate();
System.out.println("执行成功");
prst.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null) {
try {
connection.close();
System.out.println("关闭连接!");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
7.注册驱动的另一种方式(常用方法)
第一种方式:
这种方式比较常用,因为参数时一个字符串,字符串可以写到xxx.properties文件中。
String DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
Class.forName(DRIVER_NAME);
第二种方式:
try {
DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
} catch (SQLException e) {
e.printStackTrace();
}