前言
我们学习过许多编程语言,例如C、C++、java等语言,那么我们能不能使用这种编程语言来操作数据库呢?实际上,我们很少会直接操作数据库,大部分情况下,我们使用代码来操作数据库,使用代码也是需要依赖于SQL语句。
注:在学习本博文,需要学会MySQL数据库的基本的操作。
一.JDBC的认识
1.1JDBC的来源
数据库有很多种类,而不同的数据库都需要进行编程时,都需要使用数据库驱动包 ,不同的数据库,对应不同的编程语言提供了不同的数据库驱动包。例如:MySQL提供了Java的驱动包mysql-connector-java,需要基于Java操作MySQL即需要该驱动包;基于Java操作Oracle数据库则需要Oracle的数据库驱动包ojdbc。
可是在实际而言,很多公司使用的数据库都不一样,那难道我需要掌握所有的数据库驱动包嘛?那岂不是需要投入大量的世界成本?因此在Java中出现了JDBC,它可以为多种数据库提供统一访问。
如此一来就不需要掌握各种驱动包的用法,只需掌握JDBC的用法。
注:JDBC只存在于Java,而C++没有。
1.2JDBC的概念
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,这个API由 java.sql.*,javax.sql.* 包中的一些类和接口组成。
JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发者能够编写数据库的程序。简单地说,JDBC 可做三件事:与数据库建立连接、发送 操作数据库的语句并处理结果。
二.JDBC的导包
第一步:创建项目
第二步:下载MySQL驱动包,下载途径:MySQL驱动包下载 已下载可以跳过此步骤
点击进去,会发现很多版本,下载的版本需要与MySQL服务器版本一致(小版本无所谓,大版本要一致)。
点击对应版本下载页面:
第三步:将下载的驱动包导入到项目的目录当中
创建一个Directory目录,自命名,直接将mysql-connector-java-版本号.jar 复制到其中
第四步:右击jar包,点击Add as Library,从而进行最后的导包。
三.JDBC的四步操作
目前已经导包成功,我们先要加载MySQL的驱动类或者创建数据源=>知道数据库服务器的位置,使Java连接上MySQL数据库,因此我们需要建立数据库的连接,接着便是需要相关的类进行操作SQL语句。 使用JDBC操作数据库的主要步骤如下图:
- 创建数据源并连接
数据的连接方式虽然有2种,但是在实际情况下,我们经常使用创建数据源来连接,并且DriverManager类来获取的Connection连接,是无法重复利用的,DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接是可以复用的
//1.创建数据源 DataSource是JDBC接口、 MySQLDataSource是MySQL驱动包提供的类 DataSource dataSource=new MysqlDataSource(); //获取数据库的库名 ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/tq02? characterEncoding=utf8&useSSL=false"); //数据库服务器的账户和密码 ((MysqlDataSource) dataSource).setUser("root"); ((MysqlDataSource) dataSource).setPassword("2222"); // 2. 和数据库服务器建立连接~~ Connection connection = dataSource.getConnection();
虽然可以直接创建MySQLDataSource类,不需要通过向上转型,但是通过向上转型,可以降低MySQL驱动包和项目代码之间的耦合关系,避免更换数据库时的太大的成本。
url:唯一资源定位符,使用url描述网络上一个资源位置,MySQL本质是服务器,相当于网络上的资源。
Connection类使用的是java.sql的,其他的不行,并且getConnection()异常,需要进行处理(throws或者try.....catch)。
- 构造SQL语句
构造语句有2种方法,
- 直接构造,输入sql语句,固定数据写法
- 使用占位符("?")来代替具体的参数值,数据不固定。
直接写法实例:
// 3.构造SQL语句 String sql = "insert into student values(1, "tq02")"; PreparedStatement statement = connection.prepareStatement(sql); String sql2 = "select * from student "; PreparedStatement statement = connection.prepareStatement(sql2);
使用占位符实例:
// 3.构造SQL语句 Scanner scanner = new Scanner(System.in); System.out.println("请输入学号: "); int id = scanner.nextInt(); System.out.println("请输入姓名: "); String name = scanner.next(); //使用?来表示占位符,后期由用户输入获取 String sql = "insert into student values(?, ?)"; PreparedStatement statement = connection.prepareStatement(sql); // 1代表第一个问号、2代表第二个问号 statement.setInt(1, id); statement.setString(2, name);
解析:JDBC提供了Statement(语句)对象,把String转换为Statement再发给服务器执行,但是一般而言会使用PreparedStatment对象来代替Statement
原因:Statement是原封不动将sql语句发送到数据库服务器,而PreparedStatment则会先解析一遍sql语句,判断语法格式是否正确,再发送到数据库服务器,从而降低服务器的负担
- 执行sql语句
执行sql语句需要使用到2个方法:
- ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象。
- int executeUpdate(String sqlString):用于执行INSERT、UPDATE或 DELETE语句以及SQL DDL语句,返回一个操作的行数
注:查询出来的结果全在ResultSet对象中,需要进行遍历得到结果。
使用executeUpdate()实例:
// 构造SQL语句 String sql = "insert into student values(1, "tq02")"; PreparedStatement statement = connection.prepareStatement(sql); // 执行 SQL 语句~. 返回值就是 "这次操作影响到几行" int n = statement.executeUpdate(); System.out.println("n = " + n);
使用executeQuery()实例:
//创建SQL语句 String sql = "select * from student "; PreparedStatement statement = connection.prepareStatement(sql); // 执行查询操作, 要使用 executeQuery. 返回值是一个 ResultSet 类型的对象. 表示了一个 "表格" //表格中存放的是查询出来的结果 ResultSet resultSet = statement.executeQuery(); // 遍历结果集合 while (resultSet.next()) { // 获取到这一行的 学号 列 int id = resultSet.getInt("id"); // 获取到这一行的 姓名 列 String name = resultSet.getString("name"); System.out.println("id: " + id + ", name: " + name); }
- 释放必要的资源,关闭连接
最后一步了,sql语句执行完毕之后,需要进行释放,创建的语句对象和连接对象都会持有一些计算机资源,当不用了,需要释放。Java当中虽然会有“垃圾回收”机制,可自动释放内存,但是,计算机资源不仅仅是内存。
// 5. 释放必要的资源. 关闭连接. resultSet.close(); connection.close(); statement.close();
注:释放资源,关闭顺序和创建顺序相反。
三.JDBC常用的类和方法
3.1常用类
- java..sql.DriverManager:用于管理JDBC驱动程序的类,负责加载和注册驱动程序。
- java.sql.Connection:表示与数据库的连接,用于创建和执行SQL语句。
- java.sql.Statement:用于执行静态SQL语句并返回结果的对象。
- java.sql.PreparedStatement:继承自Statement,用于执行预编译的SQL语句,可以提高性能和安全性。
- java.sql.ResultSet:表示数据库结果集的数据表,用于存储查询结果。
- javax.sql.DataSource:提供了连接池的功能,用于管理数据库连接。
- java.sql.SQLException:处理与数据库连接和操作相关的异常。
3.2常见方法
1. DriverManager类的getConnection()方法
通过传入数据库的URL、用户名和密码来获取一个Connection对象,从而连接数据库
2.Statement对象的executeQuery()方法
执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象。
3.Statement对象的executeUdpdate()方法
执行增、删、改的sql语句,返回的行数
4.ResultSet对象的next()方法
遍历结果集中的每一行数据,并使用getXXX方法获取每一列的值。
5. Connection对象的setAutoCommit()方法
设置是否自动提交事务,使用commit方法提交事务,使用rollback方法回滚事务。
6. Connection、Statement和ResultSet对象的close()方法
关闭数据库连接、释放资源。
JDBC的并不难,难的是理解,只要看懂了操作步骤,其他的也能顺其自然的理解到位。
---------懒惰的tq02