mysql jdbc驱动_JDBC认识与实践

一、什么是JDBC?

Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。

b3ba3d9a842447cc98af043e7698bf22.png
JDBC思维导图

二、JDBC应用流程

以下是我们使用JDBC进行数据访问时的常规步骤,如果感觉理解起来有一点云里雾里也没关系,可以看看后面的代码自己实践体会一下。

1. 加载驱动类

DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 

2. 创建数据库连接

String url = "jdbc:mysql://localhost:3306/databasename"; 
Connection connection = DriverManager.getConnection(url, "username", "password"); 

3. 创建数据库操作通道

Statement statement = connection.createStatement(); 

4. 执行数据操作,返回结果集

ResultSet resultSet = statement.executeQuery("sql statement"); 

5. 解析并处理结果集

resultSet.getInt(1);//获取结果集的第1列(必须能够以int类型接收) 
resultSet.getString(2);//获取结果集的第2列(必须能够以String类型接收) 
resultSet.getDate(3);//获取结果集的第3列(必须能够以Date类型接收) 

6. 关闭数据接口(注意关闭顺序)

resultSet.close(); 
statement.close(); 
connection.close(); 

三、绑定statement的数据访问示例

假定我们新建了一个数据库名为test,里面有一张表user,里面的结构和数据如下图所示:

1a38bdaf47d7835aae6cacf5d16a2247.png

1.使用Statement进行数据访问

废话不多说,直接贴代码:

import java.sql.*;public class MysqlTest {private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/";private static final String DATABASE_NAME = "test";private static final String DATABASE_USERNAME = "root";private static final String DATABASE_PASSWORD = "root";public static void main(String[] args) {try {//1.注册数据库驱动DriverManager.registerDriver(new com.mysql.jdbc.Driver());//Class.forName("com.mysql.jdbc.Driver");System.out.println("注册驱动成功!");} catch (Exception e1) {System.out.println("注册驱动失败!");e1.printStackTrace();return;}String url = DATABASE_URL + DATABASE_NAME;Connection conn = null;try {//2.创建并获取数据库连接conn = DriverManager.getConnection(url, DATABASE_USERNAME, DATABASE_PASSWORD);//3.设置statement对象Statement stmt = conn.createStatement();System.out.println("创建Statement成功!");//4.通过statement执行SQL语句并获取结果ResultSet rs = stmt.executeQuery("select id,username from user order by id desc limit 0, 3");while (rs.next()) {//5.对结果集进行解析处理System.out.println(rs.getInt(1) + "," + rs.getString(2));}//6.释放资源。顺序:ResultSet→Statement→Connectionrs.close();stmt.close();} catch (SQLException e) {e.printStackTrace();} finally {try {if (null != conn) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}}
}

具体的逻辑在注释中写的比较清楚了,就不多加赘述了。

运行后结果如下:

5,John
4,Peter
3,Jack

这里有一个小tip:使用Statement无法防止SQL注入攻击。对SQL注入攻击如果感兴趣的话可以走传送门:

sql注入_百度百科​baike.baidu.com
ef4e33ed34b4c559a19080c8b86015d0.png

2.使用PreparedStatement进行数据访问

PreparedStatement是继承了Statement的接口。它与Statement的最大不同之处是,PreparedStatement会对SQL语句先做预编译,以防止SQL注入

//An object that represents a precompiled SQL statement.
public interface PreparedStatement extends Statement {
}

来看看使用PreparedStatement进行数据访问的代码示例,与使用Statement的代码非常相似,小有不同:

import java.sql.*;public class MysqlTest {private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/";private static final String DATABASE_NAME = "test";private static final String DATABASE_USERNAME = "root";private static final String DATABASE_PASSWORD = "root";public static void main(String[] args) {try {//1.注册数据库驱动DriverManager.registerDriver(new com.mysql.jdbc.Driver());//Class.forName("com.mysql.jdbc.Driver");System.out.println("注册驱动成功!");} catch (Exception e1) {System.out.println("注册驱动失败!");e1.printStackTrace();return;}String url = DATABASE_URL + DATABASE_NAME;Connection conn = null;try {//2.创建并获取数据库连接conn = DriverManager.getConnection(url, DATABASE_USERNAME, DATABASE_PASSWORD);//3.设置preparedStatement对象PreparedStatement stmt = conn.prepareStatement("select id,username from user order by id desc limit ?,?");System.out.println("创建PreparedStatement成功!");//4.为preparedStatement绑定参数stmt.setInt(1, 0);stmt.setInt(2, 3);//4.通过preparedStatement执行SQL语句并获取结果ResultSet rs = stmt.executeQuery();while (rs.next()) {//5.对结果集进行解析处理System.out.println(rs.getInt(1) + "," + rs.getString(2));}//6.释放资源。顺序:ResultSet→preparedStatement→Connectionrs.close();stmt.close();} catch (SQLException e) {e.printStackTrace();} finally {try {if (null != conn) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}}
}

这里运行结果和使用Statement的相同:

5,John
4,Peter
3,Jack

四、传统JDBC存在的问题

通过我们实际的JDBC代码实践,可以体会到以下几点:

1.频繁创建释放连接,系统开销大

2.SQL语句硬编码在Java代码中,不易维护

3.结果集解析复杂

4.……

所以这才引入了我们的ORM框架:

孑辞:STEP5.1 初识MyBatis​zhuanlan.zhihu.com
43b1d3f4545a28c1232ee39cfea25fca.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

画布实现拼图原理

1. 页面布局 1.1 bg: 背景提示图,使用半透明效果,移动图片后显示,层级最低,z-index:-1; 1.2 cvs: 当前画布,层级默认0; 1.3 content: 覆盖在画布之上 z-index:1; 1.3.1 currentCheckpoint: 显示当前关卡数…

晚归的码农老公

呃,我是本号主的贤内助,我们的儿子叫楠哥~由于疫情的影响,我们已经很久没有带楠楠回他外婆家玩了,只能用电话跟外婆聊聊家常。每一次通话结束,他外婆总会加问一句,启发回来了吧。我们每次的回答都是&#x…

100篇文章(5)

On Libraries’ Service Library are very important to students’campus life. However,many students’complain that libraries in their universities cannot meet their needThe first problem is nearly of all school libraries is their limited space.There always …

python绘制图像的参数_图像绘制.draw.line():系统错误:新样式getargs格式,但参数不是tup...

我在这个问题上看到了多个问题,但没能找到问题的答案。基本上,我只想在图像上画一条线,从python中的外部文件中获取坐标。我的代码是:import Image, ImageDrawimport sysimport csvim Image.open("screen.png")draw I…

Rockchip USB转485

#RS232 / RS485 简介#RS232#RS485#R485与RS232比较#开发#DTS配置#驱动开发#POSIX规范API#HAL层以上APP层#APK call JNI#APP#调试#log开启#RS232/RS485/RS422常见问题#RS232 / RS485 简介#RS232RS-232是美国电子工业联盟(EIA)制定的串行数据通信的接口标…

100篇范文(7)

How should college students spend their spare time? College is a place where students arrange their own studies and take part in all kinds of activities as they like.Thus,plenty of time is left at college students’disposal.How should student spend their…

高嘌呤食物搜索引擎_“高嘌呤”的食物已发现,尿酸高的人,要尽量挑着吃!...

导语:在我们的生活中又出现了一种现象,越来越频发,也是越来越倾向于年轻化,那么就是高尿酸,现在高尿酸已经被列为了我们国家的第四高,身体内的嘌呤含量是一部分,那么另一部分也是来源于我们平时…

罗老师带货了

相对比其他事情,我对罗老师带货很感兴趣,也许这样说,我对罗老师这个人比较感兴趣。罗老师是一个经过大风大浪的男人,经过了各种风雨,终于找到自己的位置,也决定在这个位置上发光发热了。我觉得他会像冯提莫…

缓存优化过程中的一些思考

最近一段时间在做双十一的优化,对于缓存的使用和改造渐渐有了一些思考,记录一下 缓存的使用、选择 * 读简单,写复杂的业务最好放在写入端 * 读复杂,写简单的业务逻辑放在读取端 * 根据业务的类型,选择是使用集中式缓存…

【Linux笔记】LED驱动程序

前言 上一篇我们分享了字符设备驱动框架:【Linux笔记】驱动基础篇,当时分享的是hello驱动程序。学STM32我们从点灯开始,学Linux驱动我们自然也要点个灯来玩玩,尽量在从这些基础例程中榨取知识,细抠、细抠,为…

oracle trigger 延迟执行_一文详解Spring任务执行和调度

一、概述Spring框架分别使用TaskExecutor和TaskScheduler接口提供异步执行和任务调度的抽象。Spring还提供了这些接口的实现,这些接口支持线程池或将其委托给应用服务器环境中的CommonJ。二、TaskExecutorSpring 2.0 开始引入的新的抽像。Executors 是线程池的Java …

[转]命令行在IIS添加虚拟目录

来自:http://www.jb51.net/softjc/29702.htmlMkwebdir -c LocalHost -w "Default Web Site" –v CommonImages,D:\Images 附:这些管理性脚本是IIS自带的.缺省被安装在了C:\Inetpub\AdminScripts下. 让用户密码永不过期: net accounts /maxpwage:unlimi转…

数据库(2)

文章目录数据表操作完整性约束AUTO_INCREMWNTNOT NULL非空唯一性约束UNIQUE KEY(KEY可省略)修改表结构的方式修改表名添加字段删除字段修改字段添加默认值删除默认值添加主键删除主键添加唯一删除唯一修改表的存储引擎设置自增长的值删除数据表DML插入数…

oc51--循环retain

// main.m // 循环retain#import <Foundation/Foundation.h> #import "Person.h" #import "Dog.h"int main(int argc, const char * argv[]) {Person *p [Person new];Dog *d [Dog new];// 如果A对用要拥有B对象, 而B对应又要拥有A对象, 此时会形…

中resource文件夹的作用_冲突与碰撞:OpenStack中的虚拟机和裸机

冲突与碰撞&#xff1a;OpenStack中的虚拟机和裸机要虚拟化还是非虚拟化&#xff1f;如果您追求性能&#xff0c;那么就没有争议——裸机仍然胜过虚拟机&#xff1b;特别是对于I/O密集型应用程序。但是&#xff0c;除非您可以保证充分利用它&#xff0c;否则是有代价的。在本文…

看看大神是如何计算32位数中‘1’的个数

偶然看到一份代码&#xff0c;代码是计算一个int数中 ‘1’ 的个数的&#xff0c;当然&#xff0c;可能这不是什么值得讨论的事情&#xff0c;但如果你看看大神如何写这段代码的&#xff0c;就觉得这个是一个需要了解的知识。int count_bits(int x) {register int xxx;xxxx-((…

MySQL运算符,函数,索引,图形化管理工具

文章目录运算符算术运算符比较运算符逻辑运算符MySQL运算符数字函数字符串函数日期时间函数条件函数系统信息函数加密函数其他常用函数MySQL索引索引的概念索引的分类创建索引创建表时创建索引在已经存在的表上创建索引删除索引MySQL图形化管理工具PHPMyAdminSQLyog运算符 算术…

python list存储方式_python list存储

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…

Linux下的gpio,gpiod

GPIO 应该是每个嵌入式设备都避免不了的。最近在做项目的时候&#xff0c;也遇到这方面的问题&#xff0c;所以简单总结一下现在内核里面多了gpiod的来控制gpio口&#xff0c;相对于原来的形式&#xff0c;使用gpiod的好处是我们申请后不进行free也没有什么问题。但是你要是使用…

剖析大神代码,计算整型里面1的个数

昨天的文章&#xff0c;可能很多人看了不知道怎么回事&#xff0c;确实&#xff0c;我也是看了之后一头雾水。先给出个简单的例子#include "stdio.h"int count_bits4(char x) {x (x&0x55) ((x>>1)&0x55);x (x&0x33) ((x>>2)&0x33);x…