目录
前言:
1.什么是Java的JDBC编程
2.JDBC的数据库驱动包的导入过程
3.JDBC代码的编写
3.1创建并初始化一个数据源
3.2和数据库服务器建立连接
3.3构造SQL语句
3.4执行SQL语句
3.5释放必要的资源
3.6整体代码的展示及演示
3.7代码的优化
3.8 查询操作的实现
结束语:
前言:
1.什么是Java的JDBC编程
我们之前学习的SQL语句都是在MYSQL的客户端进行编程的,但是在我们实际开发的过程中,我们都是通过代码来操作的,很少会手动在客户端里输入SQL语句。我们这里的JDBC就是Java Database Connectivity,java数据库连接,是一种用于执行SQL语句的Java API,他是Java中的数据库连接规范,这个API由java.sql.*,javax.sql.*包中的一些类和接口组成,它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问。
这里我们解释一下什么是API,它的全称是Application Programming Interface。简单的理解就是给你一个软件你能对他干啥,基于它提供的这些功能你就可以写一些其他代码了。
各种数据库比如MySQL、Oracle、SQL Sever在开发的时候,就会提供一组编程接口(API)。
那么这里小编要问一下大家,大家认为这些API是不是一样的呢?
答案是:否。
所以这也就给广大的程序猿带来了很多麻烦,此时就有一位大佬站了出来,将大家都组织在了一起,这个大佬就是我们的Java,它提供了一个新的API,此时就出现了JDBC。那么之前的那些API要想使用JDBC就得通过数据库厂商提供的一个程序也就是数据驱动包,来完成对API的转换,也就是对原有API的一个包装,然后再提供成JDBC的形状。示意图如下所示:
此时Java程序猿想要进行数据库的开发,就需要在你的项目中导入数据的驱动包,才能进行编码。
JDBC的优势:
- Java语言访问数据库操作完全面向抽象接口编程。
- 开发数据库应用不用限定在特定的数据库厂商的API。
- 程序的可移植性大大增强。
2.JDBC的数据库驱动包的导入过程
我们首先要获取数据库的驱动包,那么我就可以在mysql的官方网站上获取,或者是Gitup上获取,还可以在maven中央仓库中获取。这个maven就像是我们的应用商店一样里面托管了各种软件程序包。这样我们通过maven就可以下载到我们的软件程序包了。
注意:我们要下载的版本,在大范围上不可以高于我们的数据的大范围版本,大范围的意思就是我最前面的数字,小范围的我们可以随意。
1.搜索框中搜索mysql。
2.点击第二个。
3.寻找自己匹配的系列,(这里小编的数据库用的是5系列的所以小编就下载5系列的啦)
4.找到jar包进行下载。
这里的jar包就相当于是我们在电脑上创建出来的一个压缩包,将很朵文件都放在了里面。我们以后在发布程序的时候也是将所有的程序打包成一个jar包来进行发布的。
5.导入到项目中
此时直接复制粘贴到我们的项目中去。
我们在项目中先创建出一个lib包,然后再将其放入到我们的lib包中。
6.将这个目录标记成项目的库,此时idea就可以自动识别jar包了,从而就可以调用里面的类来编写代码了。
注意:
经过上面的这几步之后我们就可在idea中进行编码了,上面的步骤是我们每次新创建一个项目的时候都得这样搞一遍!!!
3.JDBC代码的编写
实现JDBC编码的基本步骤:
- 创建并初始化一个数据源。
- 和数据库服务器建立连接。
- 构造SQL语句。
- 执行SQL语句。
- 释放必要的资源。
这里小编解释一下什么是数据源,数据源就是描述数据库服务器在哪里。
3.1创建并初始化一个数据源
我们一般通过下面的代码来进行初始化一个数据源。
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("");
这里我们需要注意的是我们在选择DataSource的时候idea会给我们提供两个包的DataSource注意我一定要选择 javax.sql 下面的。
此处的DataSource内置了数据库连接池,可以复用连接,提高连接服务器的效率。
此时会有同学发现我在新建一个对象的时候我们使用的是DataSource而不是直接使用MySQLDataSource来进行对象的创建,那么为什么不直接使用呢?原因是因为在Java这个圈子中已经习惯使用这种向上转型,然后再向下转型了。要是直接使用MySQLDataSource创建也是可以的。如下所示:
MysqlDataSource mysqlDataSource = new MysqlDataSource();
mysqlDataSource.setUrl("");
这里我们在来解释一下代码中出现的这个setUrl是什么意思,setUrl是唯一资源定位符,用来描述网络上的某个资源所在的位置。这里不管是写作setUrl还是setURL都是可以的。
接下来我们就要往里面加描述一个资源的位置了。
//1. 创建并初始化一个数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0:3306/demo1?characterEncoding=utf8&useSSL=false");
这里小编解释一下资源定位符里面的这段代码的意思,如下图所示:
上述的这个代码只是设置数据源,描述数据库服务器在哪,还没有和数据服务器建立真正的连接。
我们还得加上密码和用户名。
//1. 创建并初始化一个数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/demo1?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
3.2和数据库服务器建立连接
上面那么一步完成之后,我们只是相当于获得了数据库服务器的地址,接下来我们就需要和数据库服务器建立连接了,具体操作我们来看下述代码。
//2. 和数据库服务器建立连接
Connection connection = dataSource.getConnection();
这里我们在idea上编写的时候会发现getConnection()有报错,如下所示:
这里我们就要对其进行受查异常的显示处理了。
这里我们还需要注意的是我们在接收这个连接的时候我们使用的是Connection来进行接收的,这里我们会发现有两个,我们应该选择java.sql包下面的。
3.3构造SQL语句
在此之前我们先来在我们的MySQL客户端来创建出一个student表来。
然后我们在idea中通过SQL语句来进行一个插入操作的编写。
//3. 构造SQL语句
String sql = "insert into student value(1, '张三')";//编写SQL语句
PreparedStatement statement = connection.prepareStatement(sql);//对上述的代码进行一个预编译
注意:
即使咱们使用代码来操作数据库,还是得靠SQL语句,只不过我们这里换成代码来构造SQL,我们之前学习的SQL各种语法任然有效。
这里我们看到了一个新的语法叫PreparedStatement,他是对代码预编译的意思,就是将我们上述代码进行一个预解析。那么这里我们为什么要多此一步呢?如果我们请求是个SQL字符串,服务器是可以处理的,服务器就需要对SQL进行解析,理解这段代码的含义并执行这段代码,但是如果是同时有成千上万条请求的话,让服务器自己进行预编译同时在进行执行的话压力就会很大,但是我们如果是提前让客户端进行一个预编译的话,服务器的任务量就会大大降低,这就像是我们在食堂吃饭一样,我们吃完饭之后,就自己把自己的碗筷送到餐具回收出,然后再由食堂的保洁来进行处理,这样就会大大降低保洁工人的工作量,从而也提高了食堂运作的效率。
3.4执行SQL语句
经过上述的一系列的操作我们实现了数据源初始化,数据库的连接,SQL语句的编写以及SQL语句的预编译操作,接下来我们就可以执行这段SQL语句了,如下所示:
//4. 执行SQL语句
int ret = statement.executeUpdate();//执行SQL语句
System.out.println(ret);//打印一下执行之后的结果,看是否成功。
上面我们采用了statement里面的executeUpdata()方法这个意思就是将上述预编译好的SQL语句发送给数据库服务器,由服务器来作出响应。这里我们使用了ret来进行接收,如果返回值是1那就说明我们的操作执行成功,否则执行失败。
还有一点就是我们executeUpdata()方法是针对insert、delete、update这三个操作的,针对于select操作我们使用的是executeQuery()方法。这个我们在后续的过程中慢慢给大家交代。
3.5释放必要的资源
在最后一步,当我执行完所有的代码之后,我们就要对我们不在使用的资源进行释放,以便于其他资源的使用。
//5. 释放必要的资源
statement.close();
connection.close();
这里我们看到我们上述在创建对象的时候是先创建了connection然后再创建了statement这个对象,但是释放资源的时候是反着释放的。先释放的是后创建的,然后再释放最先创建的对象。
我们这里给大家打个比方如下面的图所示:
我们截进去的时候是先开大门然后再开二门,然后如果我们要出来的话就要先锁二门再锁大门,这就像是我们之前所说的一句俗语“大门不出,二门不迈”,与我们上述对资源的关闭十分的相似。
3.6整体代码的展示及演示
代码展示:
package JDBC;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
//JDBC代码的使用
public class Test1 {
public static void main(String[] args) throws SQLException {
//JDBC 需要通过一下步骤来完成开发
//1. 创建并初始化一个数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/demo1?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
// MysqlDataSource mysqlDataSource = new MysqlDataSource();
// mysqlDataSource.setUrl("");
//2. 和数据库服务器建立连接
Connection connection = dataSource.getConnection();
//3. 构造SQL语句
String sql = "insert into student value(1, '张三')";//编写SQL语句
PreparedStatement statement = connection.prepareStatement(sql);//对上述的代码进行一个预编译
//4. 执行SQL语句
int ret = statement.executeUpdate();//执行SQL语句
System.out.println(ret);//打印一下执行之后的结果,看是否成功。
//5. 释放必要的资源
statement.close();
connection.close();
}
}
结果展示:
注意:由于小编这里运行了两次代码所以在客户端里查询的时候就会显示出来两条。
3.7代码的优化
上面我们在写SQL语句的时候是直接将id和姓名写进去了,那么如果我们想要让客户自己输入的话我们又该怎么实现呢?
同样我们先是初始化一个数据源—>然后我们再建立数据库之间的连接—>其次我们在构造SQL语句,只不够这里我们需要稍微的对代码进行一点处理,我们让用户自己输入,如下所示:
//3.从控制台读取用户的输入内容
System.out.println("请输入学生姓名:");
String name = scanner.nextLine();
System.out.println("请输入学号id:");
int id = scanner.nextInt();
然后我们就需要进行接收:
//4. 构造SQL语句
String sql = "insert into student value(?,?)";//编写SQL语句
PreparedStatement statement = connection.prepareStatement(sql);//对上述的代码进行一个预编译
statement.setInt(1,id);
statement.setString(2,name);
注意:
这里面的 ?是一个占位符,在下面调用的statement里面如果是整形则使用setInt如果是字符型则使用的是setString,里面的1和2代表的是在上述占位符中所对应的第几个位置。
代码整体展示:
package JDBC;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) throws SQLException {
Scanner scanner = new Scanner(System.in);
//JDBC 需要通过一下步骤来完成开发
//1. 创建并初始化一个数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/demo1?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
//2. 和数据库服务器建立连接
Connection connection = dataSource.getConnection();
//3.从控制台读取用户的输入内容
System.out.println("请输入学生姓名:");
String name = scanner.nextLine();
System.out.println("请输入学号id:");
int id = scanner.nextInt();
//4. 构造SQL语句
String sql = "insert into student value(?,?)";//编写SQL语句
PreparedStatement statement = connection.prepareStatement(sql);//对上述的代码进行一个预编译
statement.setInt(1,id);
statement.setString(2,name);
//这个打印需要加到拼接数据之后
System.out.println(statement);
//5. 执行SQL语句
int ret = statement.executeUpdate();//执行SQL语句
System.out.println("ret = " + ret);//打印一下执行之后的结果,看是否成功。
//6. 释放必要的资源
statement.close();
connection.close();
}
}
结果展示:
3.8 查询操作的实现
在上诉中我们看到返回的结果都是一个整型,表示的是我们插入的数据是否成功,几行受到了影响。但是在查询中我们的返回结果就不单单是一个整形了而是ResultSet对象。
什么是ResultSet对象呢?我们可以将其想象成一张表,在最开始的时候光标指向的是我们表的最上面随着光标移动到next,将整张表都遍历完成之后就会返回false。
具体代码如下所示:
while (resultSet.next()) {
//把resultSet想象成一个表格,同时表格里有一个光标,初识情况下光标指向表的最上面
//每次调用next,光标向下走一行
//当光标指向某一行的时候,就可以通过getXXX 来获取到当前这一行里面的数据了。
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id = " + id + ", name = " + name);
}
修改SQL语句:
//3. 构造SQL语句
String sql = "select * from student";//编写SQL语句
PreparedStatement statement = connection.prepareStatement(sql);
记得在执行SQL语句的时候查询操作所对应的statement方法是executeQuery()
//4. 执行SQL语句
ResultSet resultSet = statement.executeQuery();//执行SQL语句
全部代码展示:
package JDBC;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
//查询操作的JDBC
public class Test3 {
public static void main(String[] args) throws SQLException {
Scanner scanner = new Scanner(System.in);
//JDBC 需要通过一下步骤来完成开发
//1. 创建并初始化一个数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/demo1?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
//2. 和数据库服务器建立连接
Connection connection = dataSource.getConnection();
//3. 构造SQL语句
String sql = "select * from student";//编写SQL语句
PreparedStatement statement = connection.prepareStatement(sql);//对上述的代码进行一个预编译
//4. 执行SQL语句
ResultSet resultSet = statement.executeQuery();//执行SQL语句
//5. 遍历结果集合
while (resultSet.next()) {
//把resultSet想象成一个表格,同时表格里有一个光标,初识情况下光标指向表的最上面
//每次调用next,光标向下走一行
//当光标指向某一行的时候,就可以通过getXXX 来获取到当前这一行里面的数据了。
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id = " + id + ", name = " + name);
}
//6. 释放必要的资源
resultSet.close();
statement.close();
connection.close();
}
}
结果展示:
结束语:
好啦这节有关于Java的JDBC的编程就分享到这里啦!后续中小编还会继续带着大家一起迈进一个新的阶级JavaEE初阶,大家继续跟紧小编的步伐,一起往前冲!!!希望这节对大家认识Java的JDBC编程有一定的帮助,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!)