提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
前面我们都是在MySQL的编辑界面上敲代码,而这节课我们就要把SQL代码在我们的Idea上进行编写。废话不多说开始我们的旅程!
提示:以下是本篇文章正文内容,下面案例可供参考
一、什么是JDBC
实际开发中,SQL是很少手动输入的,绝大部分的SQL都是通过代码,自动执行的,这个时候就需要让其他编程语言(本节是使用Java)来操作数据库。
而MySQL是一个客户端/服务端架构的语言,根据MySQL提供API写个数据库客户端时非常容易的。
比如Oracle,SQLServer,SQLite等数据库都有API。
但是不同的数据库提供的API是不一样的,他们的开发团队不相同,所以API那么多,对于程序员的学习成本就越高,于是在Java的圈子里,就把这些API同一编程一套,指定成标准!就被称为JDBC。
目前JDBC这套API已经成了Java标准库的一部分,由于Java的影响力还是很大的,以自身作为标准,各种数据库厂商,都提供了能够适应JDBC相关的驱动包!
所以我们只需要掌握了JDBC这套API,无论操作哪个数据库,操作的代码都是不变的,基本相同。
即JDBC最主要的就是屏蔽了不同数据库原生API之间的差异,
而是使用了JDBC这一套API接口实现来规范了所有的数据库的编程操作。
二、JDBC的使用
JDBC这里的api看起来蛮多很复杂,但实际上都是固定套路,非常简单,多练就记住了。
- 描述数据库的连接和用户密码

这样一段代码,就设置好了数据库服务器连接,要操作的数据库用户和密码。
至于setURL这里面的字符串含义,我们下面也来一一解析:
**"jdbc:mysql":**这个url是给jdbc中的MySQL
来使用的
**"127.0.0.1":**服务器所在的IP地址,此处的IP时环回IP,表示主机自己。
**"3306":**这个时端口号,MySQL安装时候配置的,默认时3306.
"javatest": :要访问的数据库名。**"characterEncoding=utf8" :**描述了请求的字符编码方式,我的MySQL版本时8.0.33的,一般情况都是utf8
**"useSSL=false":**关闭加密功能,这里不做展开介绍。
上述的内容,在后续讲述网络知识的时候,还会见到,这里只是简单的了解即可。
JDBC支持两种风格的代码,一种是DataSource,一种是DriverManger.
- DataSource 相比于DriverManger内置了数据库连接池,可以重复利用连接
(比如:线程池,字符串常量池......)- DriverManger使用的时候,需要借助反射,数据不常规的编程手段,博主文章中采用的是DataSource ,
想要看DriverManger.我会在最后的代码总结时展示
。
- 于数据库建立连接
上述的操作,只是描述了数据库服务器在哪里,并没有真正建立起连接来,下面我们进行连接操作,才是真正开始通过网络去与数据库服务器进行通信。

- 构造SQL语句

通过connection.prepareStatement方法构造出一个对象,PreparedStatement类型的,其实这个对象背后做了很多事,比如会对SQL语句进行一些预处理......
上面的写法是直接写死了,如果是查询操作还好,那如果是要执行新增操作呢?也是直接写死吗?
更多的时候,插入的数据是动态的,,那要怎么写呢?可以使用PerparedStatement来通过占位符替换的方式,从而实现动态SQL的构造:


这里每个?的位置都是通过1开始计算的,setString(1,sn)就是将第一个?位置的数据插入成sn(学号),后面的以此类推。
构造出指定的SQL语句后,就可以通过statement这个引用来执行了。
- 执行SQL语句

excuteQuery执行后,会返回一个结果集,如果是excuteUpdate则返回这个操作影响的几行。
- 遍历结果集


- 断开连接


- 依次释放资源,关闭连接

JDBC 使用步骤总结:
1.创建DataSource ->描述了数据库服务器在哪里(url,user,password)
2.建立连接; dataSource.getConnection();
3.拼装SQL语句
Statement或者Preparement
4.执行SQL execute方法/executQuery/execuUpdate
5.遍历结果集合
ResultSet,迭代器遍历
6.依次释放,关闭资源
1)ResultSet,2)Statement,3)Connection
JDBC在实际工作中,可能并不会直接使用,上述的代码大家也能看到,写起来还是比较麻烦的,因此就有了一些库和框架,针对JDBC进行了进一步的封装,让我们使用起来更方便,比如后续会学习到的Mybatis这种......
代码实例
sql
//这是DataSource
public static void main(String[] args) {
//1.定义MySQL数据源对象
MysqlDataSource mysqlDataSource = new MysqlDataSource();
//设置数据库连接
mysqlDataSource.setURL("jdbc:mysql://127.0.0.1:3306/javatest?characterEncoding=utf8" +
"&allowPublicKeyRetrieval=true&useSSL=false");
//用户名
mysqlDataSource.setUser("root");
//密码
mysqlDataSource.setPassword("Wm127369#");
//定义JDBC的数据源对象
DataSource dataSource = mysqlDataSource;
//定义连接对象
Connection connection = null;
//定义预处理SQL执行对象
PreparedStatement statement = null;
//定义结果集
ResultSet resultSet = null;
try {
//1通过数据源获取数据库连接
connection = dataSource.getConnection();
//2.获取预处理SQL执行对象
//定义要执行的SQL
String sql = "select student_id,sn,name,mail,class_id from student where name = ?";
statement = connection.prepareStatement(sql);
//接收用户的输入
System.out.println("请输入学生的姓名:");
Scanner scanner = new Scanner(System.in);
String name = scanner.next();
//3.用真实值替换占位符
statement.setString(1,name);
//4.执行SQL,获取结果集
resultSet = statement.executeQuery();
//5.遍历结果集
while (resultSet.next()){
long stuId = resultSet.getLong("student_id");
String stuSn = resultSet.getString(2);
String stuName = resultSet.getString(3);
String stuMail = resultSet.getString(4);
long classId = resultSet.getLong(5);
System.out.println(MessageFormat.format("学生编号 = {0},学号 = {1},学生姓名{2},邮箱 = {3},班级编号 = {4}",stuId,stuSn,
stuName,stuMail,classId));
}
}catch (SQLException e){
e.printStackTrace();
}finally {
//依次释放资源,关闭连接
if (resultSet !=null){
try {
resultSet.close();
}catch ( SQLException e){
e.printStackTrace();
}
}
if (statement !=null){
try {
statement.close();
}catch ( SQLException e){
e.printStackTrace();
}
}
if (connection !=null){
try {
connection.close();
}catch ( SQLException e){
e.printStackTrace();
}
}
}
}
//这是DriverManager
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
ResultSet resultSet =null;
try {
//1.加载数据库厂商提供的驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取数据库连接
connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/java113?characterEncoding=utf8" +
"&allowPublicKeyRetrieval=true&useSSL=false", "root", "Wm127369#");
//3.创建Statement对象
statement = connection.createStatement();
//4.定义SQL并执行SQL语句
System.out.println("请输入学生姓名:");
Scanner scanner = new Scanner(System.in);
//接收用户输入
String name = scanner.next();
String sql = "select id,name,chinese,math,english from exam where name ='"+name + "'";
statement.executeQuery(sql);
//5.执行SQL,获取查询结果
resultSet = statement.executeQuery(sql);
//6.对结果进行遍历,获取结果集
while (resultSet.next()){
long stuId = resultSet.getLong(1);
String stuName = resultSet.getString(2);
float stuChinese = resultSet.getFloat(3);
float stuMath = resultSet.getFloat(4);
float stuEnglish = resultSet.getFloat(5);
System.out.println(MessageFormat.format("学生编号={0},学生姓名 = {1}, 语文成绩 = {2},数学成绩 = {3},英语成绩 = {4}",stuId,
stuName,stuChinese,stuMath,stuEnglish));
}
}catch (SQLException e){
e.printStackTrace();
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}finally {
//依次释放资源,关闭连接
if (resultSet !=null){
try {
resultSet.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if (statement !=null){
try {
statement.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if ( connection !=null){
try{
connection.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
}
总结
其实JDBC并不难,就是几个固定的套路,如果是应付考试,还是需要直接多建几个表利用JDBC使用一些复杂查询,多练习练习,如果是工作中,用JDBC就不多了,会使用更方便的框架,如果你是一个很有想法的同学,可以基于JDBC进行修改,搭建一套属于直接的框架来......
MySQL数据库基础就此结束!