序
欢迎来到全网最完整的Java系列教程!!!
本教程将包含基础知识、进阶知识、常用框架等,循序渐进地分享Java中必须掌握的知识和技术。跟着老K的教程每天学习一点,你会发现入门Java没有想象中那么难。
说到Java的常见框架,JDBC一定是榜上有名。虽然大多数人会使用mybatis来做Java应用和MySQL之间的数据交互,但了解JDBC依然是一个Java工程师必备的基本功。
本期教程内容,我们就要通过实战,向大家介绍一下JDBC这个框架。
如果你正在学习Java,不妨收藏这篇文章,或者关注我,定期收获与Java有关的知识和项目信息!
1. 准备工作
1.1 下载安装JDK和IDEA
这应该是Java基础中的基础了,就不做详细展开了,有需要的小伙伴可以到我之前的文章了解相关知识:
全网最完整的免费java教程讲义(一)——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文件读写的逻辑是一致的,可以参考:「Java进阶」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的知识点和实例演示就先分享到这里。
本期的内容较多,建议可以收藏这篇文章,多读几遍慢慢消化。
如果你对老K分享的内容有任何疑问,欢迎随时在评论区留言或者私信我。
正在学习的小伙伴记得给老K一个赞哦,你的支持是我持续输出课程内容最大的动力!
阅读推荐
我也分享过关于如何学习Java的文章,有需要的小伙伴可以点击下方链接获取:
IT大佬推荐!学习Java的最优路径 分享多个阶段的学习资源 建议收藏
结束语
我是专注于开发领域的@老K玩代码,会持续生产关于如何学习编程语言的优质内容。
如果你想学习Java编程,或者想精进你的Java编程能力,可以关注我。
如果你对开发、编程有任何疑问或者有想了解的内容,而我暂时没有写到的,也欢迎随时来找我聊聊。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/5327.html