说到Java的常见框架,JDBC一定是榜上有名。
虽然大多数人会使用Mybatis来做Java应用和MySQL之间的数据交互,但了解JDBC依然是一个Java工程师的基本功。
本篇文章,就来介绍一下JDBC这个框架,最后内会附上代码实例。
1. 准备工作
1.1 下载安装JDK和IDEA
这应该是Java基础中的基础了,就不做详细展开了,有需要的小伙伴可以留言沟通。
1.2 下载mysql-connector-j
JDBC,是Java DataBase Connectivity
的首字母缩写,它是MySQL对各个平台、语言的驱动程序,具体文件包可以从MySQL的官网下载:https://dev.mysql.com/downloads/
我们学习java,需要下载和安装的自然是java的版本——connector/j:
点击图中相应链接,在新页面中,运行系统选择Ubuntu Linux
:
在刷新后的页面中,选择合适的安装包:
重要说明: 下载版本不是越新越好,新版本可能会存在兼容和解压问题,如果遇到打不开,可以换另外几个版本
DEB Package
试试。
1.3 下载mysql-connector-j
我们之后会用到的JDBC框架就在这个mysql-connector-j的安装包里。
用解压工具,将jar包解压,找到该路径下的文件./data.jar/./usr/share/java/mysql-connector-j-8.0.xx.jar
将该路径下的mysql-connector-j-8.0.xx.jar
文件复制到java项目下即可。
一般我们会在项目根目录下新建一个"lib"文件夹,将
mysql-connector-j-8.0.xx.jar
包拷贝到该文件夹下。
1.4 引用绑定jdbc
本例以IDEA编译器的配置为例,其它平台的引用绑定,我会在后续的文章里逐步更新。有需要的小伙伴可以先关注我哦!
在IDEA中新建项目后,在菜单栏里选择File
->Project Structure
:
依上图逐个点击按钮,点击JARs or Directories
,打开资源管理器窗口,找到我们刚才从MySQL官网下载下来的mysql-connector-j-8.0.xx.jar
,点击确定完成引用和绑定。
1.5 MySQL数据库
这里仅作为提示:后续的内容是建立在配置好MySQL数据库的基础上。
由于MySQL本身就是一项独立技术,所以在此不展开介绍。
有需要的话,我会在后续的文章介绍MySQL,或者专门开辟一个关于MySQL知识分享的专栏,大家可以关注一下。
2. 代码实现
2.1 基本逻辑实现
完成了上述准备工作,我们就可以开始落实代码了。
JDBA的使用,本质上和I/O文件读写的逻辑是一致的:
- 实例化驱动和数据库连接
- 查询对象
- 关闭连接
在IDEA项目中,新建一个文件,并将下述代码复制进去,运行学习:
import java.sql.*;
public class JDBCDemo {
public static void main(String[] args) {
// 1. 实例化资源
// 1.1 注册JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 1.2 创建数据库连接实例
String url = "jdbc:mysql://localhost:3306/database?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
String user = "root";
String pswd = "root";
Connectionconn = DriverManager.getConnection(url, user, pswd);
// 2. 查询对象
// 2.1 实例话查询声明,以及查询语句
Statement st = conn.createStatement();
String query = "select * from table1";
ResultSet rs = st.executeQuery(query);
// 2.2. 查询结果
while (rs.next()) {
int uid = rs.getInt(1);
System.out.println(uid);
}
// 3. 关闭连接,释放资源
conn.close();
}
}
说明:
- 上例中的url、user、pswd是连接数据库的参数,分别是路径、用户名、密码;
- 稍微对上例中的url(数据库路径)的语法做一下解释:
驱动名:SQL方言名://服务器:端口号/数据库名?连接参数
,一般连接参数按照上例写即可; String query
是MySQL查询语句,请结合自己的MySQL数据库编写查询语句。
2.2 完整代码实现
上例中的代码,没有做异常处理,为的是减低代码的阅读难度,帮助小伙伴理清JDBC实例的脉络,完整代码应该是这样的:
import java.sql.*;
public class JDBCDemo {
public static void main(String[] args) {
Connection conn = null;
try {
// 1. 实例化资源
// 1.1 注册JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 1.2 创建数据库连接实例
String url = "jdbc:mysql://localhost:3306/database?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
String user = "root";
String pswd = "root";
conn = DriverManager.getConnection(url, user, pswd);
// 2. 查询对象
// 2.1 实例话查询声明,以及查询语句
Statement st = conn.createStatement();
String query = "select * from table1";
ResultSet rs = st.executeQuery(query);
// 2.2. 查询结果
while (rs.next()) {
int uid = rs.getInt(1);
System.out.println(uid);
}
} catch (ClassNotFoundException | SQLException e) {
throw new RuntimeException(e);
} finally {
// 3. 关闭连接,释放资源
try {
if (conn != null & !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
}
说明:
finally
代码块中的if
判断,是避免conn
空指针异常导致关闭连接失败的情况。
2.3 防SQL注入攻击
不过,上述代码会有一定风险,可能会有SQL注入攻击的风险。为了避免SQL注入攻击的风险,我们只需要做一个调整即可,详见下例:
import java.sql.*;
public class JDBCDemo {
public static void main(String[] args) {
Connection conn = null;
try {
// 1. 实例化资源
// 1.1 注册JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 1.2 创建数据库连接实例
String url = "jdbc:mysql://localhost:3306/database?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
String user = "root";
String pswd = "root";
conn = DriverManager.getConnection(url, user, pswd);
// 2. 查询对象
// 2.1 实例话查询声明,以及查询语句
String query = "select * from table1";
PreparedStatement st = conn.prepareStatement(query);
ResultSet rs = st.executeQuery(query);
// 2.2. 查询结果
while (rs.next()) {
int uid = rs.getInt(1);
System.out.println(uid);
}
} catch (ClassNotFoundException | SQLException e) {
throw new RuntimeException(e);
} finally {
// 3. 关闭连接,释放资源
try {
if (conn != null & !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
}
说明:
- 在这里,我们将
Statement st = conn.createStatement();
更改为PreparedStatement st = conn.prepareStatement(query);
即可; PreparedStatement
是Statement
的子类,但它会对传入的查询语句进行解析,然后再向数据库发起请求,从而避免SQL注入攻击的风险。
关于JDBC的知识点和实例演示就先分享到这里。
感谢你看到这里。如果你对分享的内容有任何疑问,欢迎随时在评论区留言交流。