目录
一、JDBC五问
1.本质:一堆接口(java.sql.*),在Java中写sql语句。
2.作用:通过接口来实现Java与各大数据库之间的连接,降低了代码间的耦合度;
3.JDBC整个程序的结构中有三拨人?
- sun公司,负责制定JDBC接口。即:java.sql.*;
- JDBC接口下的实现类,由数据库厂商编写。例如MySQL数据库的实现类:这些jar包的专业术语:mysql的驱动
- Java程序员,面向JDBC接口写代码。
4.JDBC开发前的准备工作?
mysql的驱动jar包,需要配置到classpath当中。
classpath = . ; 需要用的jar包的路径(要使用里面的类就需要让jvm的类加载器知道在哪找)
. :表示在当前路径下找。原因:自己还有写的Java程序。
解释:类加载器从当前路径下加载class,如果当前路径下没有找到,就去指定的路径下加载。
5.JDBC编程6步:
- 注册驱动(通知Java程序即将连接的数据库种类)。
- 获取数据库连接(Java进程和数据库进程开启连接)。
- 获取数据库操作对象(此对象用来执行sql语句)。
- 执行sql语句(执行CRUD操作)。
- 处理查询结果集(如果第四步是select语句,才会执行此步,否则没有)。
- 释放资源(JDBC进行的是进程间的通信,占用很多资源)。
二、第一个JDBC程序(IDEA)
1.准备好一个数据库
这个我使用的工具是Navicat(其它工具也可以),我新建了三个表,给出建表以及数据代码(不要问数据库怎么建表啊喂,这个很基础的啦!):
-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`Cno` char(4) NOT NULL,
`Cname` char(40) NOT NULL,
`Cpno` char(4) DEFAULT NULL,
`Credit` smallint(6) DEFAULT NULL,
PRIMARY KEY (`Cno`),
KEY `Cpno` (`Cpno`),
CONSTRAINT `course_ibfk_1` FOREIGN KEY (`Cpno`) REFERENCES `course` (`Cno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES ('1', '数据库', '5', '4');
INSERT INTO `course` VALUES ('2', '数学', null, '2');
INSERT INTO `course` VALUES ('3', '信息系统', '1', '4');
INSERT INTO `course` VALUES ('4', '操作系统', '6', '3');
INSERT INTO `course` VALUES ('5', '数据结构', '7', '4');
INSERT INTO `course` VALUES ('6', '数据处理', null, '2');
INSERT INTO `course` VALUES ('7', 'python语言', '6', '4');
-- ----------------------------
-- Table structure for sc
-- ----------------------------
DROP TABLE IF EXISTS `sc`;
CREATE TABLE `sc` (
`Sno` char(9) NOT NULL,
`Cno` char(4) NOT NULL,
`Grade` smallint(6) DEFAULT NULL,
PRIMARY KEY (`Sno`,`Cno`),
KEY `Cno` (`Cno`),
CONSTRAINT `sc_ibfk_1` FOREIGN KEY (`Cno`) REFERENCES `course` (`Cno`),
CONSTRAINT `sc_ibfk_2` FOREIGN KEY (`Sno`) REFERENCES `student` (`Sno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of sc
-- ----------------------------
INSERT INTO `sc` VALUES ('2015121', '1', '90');
INSERT INTO `sc` VALUES ('2015121', '2', '75');
INSERT INTO `sc` VALUES ('2015121', '3', '72');
INSERT INTO `sc` VALUES ('2015122', '2', '69');
INSERT INTO `sc` VALUES ('2015122', '3', '92');
INSERT INTO `sc` VALUES ('2015123', '1', '56');
INSERT INTO `sc` VALUES ('2015123', '2', '87');
INSERT INTO `sc` VALUES ('2015125', '3', '68');
INSERT INTO `sc` VALUES ('2015126', '5', '98');
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`Sno` char(9) NOT NULL,
`Sname` char(20) DEFAULT NULL,
`Ssex` char(2) DEFAULT NULL,
`sage` int(11) DEFAULT '18',
`Sdept` char(20) DEFAULT NULL,
PRIMARY KEY (`Sno`),
UNIQUE KEY `Sname` (`Sname`),
KEY `indexsno` (`Sno`,`Sname`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('2015121', '李勇', '男', '20', 'CS');
INSERT INTO `student` VALUES ('2015122', '刘晨', '女', '19', 'CS');
INSERT INTO `student` VALUES ('2015123', '王敏', '女', '18', 'MA');
INSERT INTO `student` VALUES ('2015124', '张丽', '女', '19', 'IS');
INSERT INTO `student` VALUES ('2015125', '马朝阳', '男', '22', 'IS');
INSERT INTO `student` VALUES ('2015126', '张天', '男', '20', 'MA');
INSERT INTO `student` VALUES ('2015127', '张欢欣', '女', '20', 'IS');
INSERT INTO `student` VALUES ('2015128', '张天明', '男', '20', 'MA');
INSERT INTO `student` VALUES ('2015129', '王欢', '女', '20', 'IS');
2.在IDEA创建一个空的Java项目并导入数据库驱动
去Maven仓库下载mysql的驱动jar包,放到新建的lib文件夹下。
Add as Library:添加到项目的库里面。
在Maven仓库直接搜索就可以搜索到,后面的版本对应的是直接电脑上安装的MySQL版本(我电脑MySQL是5.02版本,所以下载的就是5.02包),下载完成后将.jar文件放到项目的lib文件夹里(新项目没有lib文件夹自己新建一个lib,然后右键add as Library更改为资源目录)
3.编写测试代码
import java.sql.*;
/**
* @author pengpeng
* @Date 2022/4/8-19:09
*/
public class JdbcUtil {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
// 1.加载驱动
Class.forName("com.mysql.jdbc.Driver"); // 固定写法,加载驱动
// 2.用户信息和url
// useUnicode=true 支持中文编码
// characterEncoding=utf8 设定中文字符集为utf-8
// useSSL=true 使用安全的连接
String url = "jdbc:mysql://localhost:3306/studentcourse?useUnicode=true&" +
"characterEncoding=utf8&useSSL=true&useJDBCCompliantTimezoneShift=true&" +
"useLegacyDatetimeCode=false&serverTimezone=UTC";
String username = "root";
String password = "root";
// 3.连接成功,返回数据库对象(驱动管理,获得连接)
Connection connection = DriverManager.getConnection(url,username,password);
// 4.获得SQL对象 Statement:执行sql的对象
Statement statement = connection.createStatement();
// 5.执行SQL的对象
String sql = "select * from course";
ResultSet resultSet = statement.executeQuery(sql); // 返回的结果集,封装了所有的结果
while (resultSet.next()){
System.out.print(" Cno: " + resultSet.getObject("Cno"));
System.out.print(" Cname: " + resultSet.getObject("Cname"));
System.out.print(" Cpno: " + resultSet.getObject("Cpno"));
System.out.print(" Credit: " + resultSet.getObject("Credit"));
System.out.println();
}
// 6.释放连接
resultSet.close();
statement.close();
connection.close();
}
}
注意点:
- Class.forName()里面低版本就是这个,高版本mysql和jdbc中间还会有个cj,具体看jar包里面具体的路径。
- username和password对应的是电脑MySQL的用户名和密码。
查询结果:
url的简便版:
jdbc:mysql://localhost:3306/studentcourse?useUnicode=true&
characterEncoding=utf8&useSSL=true&serverTimezone=UTC
4.代码功能分析
1.加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
2.获取用户信息
url:
mysql --3306
jdbc:mysql://localhost:3306/数据库名
oracle --1521
jdbc:oracle:thin:@localhost:1521:sid
3.连接数据库对象
Connection connection = DriverManager.getConnection(url,username,password);
connection:数据库对象
数据库设置自动提交:connection.setAutoCommit()
事务提交:connection.commit()
事务回滚:connection.rollback()
4.获得SQL对象
Statement statement = connection.createStatement();
Statement:执行SQL的对象
statement.executeQuery();// 执行查询操作,返回结果集
statement.execute();// 执行所有的sql操作
statement.executeUpdate();// 执行更新、删除、插入。返回受影响的行数
5.释放资源
释放资源必须操作,因为这些资源特别占内存,特别是Connection