
目录
实际开发中,SQL 是很少手动输入的,绝大多数的 SQL 都是通过代码,自动执行的,这个时候就需要让其他编程语言来操作数据库了。
而 MySQL 是一个客户端/服务器架构的语言,根据 MySQL 提供的 API 写个数据库客户端是非常容易的。
比如 Oracle,SQLServer,SQLite 等数据库都有 API。
但是不同的数据库所提供的 API 是不一样的,他们的开发团队各不相同,所以 API 那么多,对于程序猿的学习成本就越高,于是在 Java 的圈子里,就把这些 API 统一编程一套,指定成标准!就称为 JDBC。
目前 JDBC 这套 API 已经成了 Java 标准库的一部分,由于 Java 的影响力还是很大的,以自身作为标准,各种数据库厂商,都提供了能够适应 JDBC 相关的驱动包!
所以我们只需要掌握了 JDBC 这套 API,无论操作哪个数据库,操作的代码都是不变,基本相同的。
即 JDBC 最主要的就是屏蔽了不同数据库原生 API 之间的差异,而是使用 JDBC 这一套 API 接口来规范了所有数据库的编程操作。
在使用 JDBC 之前,需要先安装对应数据库的驱动包,比如博主用的是 MySQL 5.7,那么下载对应的驱动包就是 mysql-connector-java-5.1.47.jar,这个驱动包可以到博主主页去获取!也可也去 Oracle 官网去下载哦!
下载好对应的驱动包后,我们就把 jar 包导入到项目中:

首先创建一个存放 jar 包的目录, 随后把这个 jar 包拷贝进来:

接着右键新建的目录(包含 jar 包),选中对应的 Add as Libray... 将目录创建成依赖目录,直接单击 OK,此时 IDEA 就能解析出 jar 包里包含的内容了!
JDBC 这里的 api 看起来蛮多的,但实际上都非常简单,都是固定套路!
● 描述数据库的位置和用户密码
// 创建数据源
DataSource dataSource = new MysqlDataSource();
// 描述了数据库服务器所在位置, 当前固定写法
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root"); // 设置登录账户名
((MysqlDataSource)dataSource).setPassword("211016"); // 设置登录密码
这样一段代码,就设置好了数据库服务器所在的地址,要操作的数据库用户和用户密码.
至于 setUrl 这里面的字符串含义,我们下面也来一一解析下:
- "jdbc:mysql" :这个 url 是给 jdbc 中的 mysql 来使用的
- "127.0.0.1" :服务器所在的 IP 地址,此处的 IP 是环回IP,表示主机自己
- "3306" : 这个是端口号,mysql 安装时候配置的,默认是 3306
- "demo" :要访问的数据库名
- "characterEncoding" :描述了请求的字符编码方式,一般情况下都是 utf8
- "useSSL = false" :关闭加密功能,这里不做展开介绍
上述的内容,在后续讲述网络知识的时候,还会见到,这里只是简单的了解即可。
JDBC 支持两种风格的代码,一种是 DataSource,一种是 DriverManager.
- DataSource 相比于 DriverManager 内置了数据库连接池,可以重复利用连接(比如:线程池,字符串常量池....)
- DriverManager 使用的时候,需要借助反射,数据不常规的编程手段,博主文章中采用的是 DataSource!
● 与数据库建立连接
上述的操作,只是描述了数据库服务器在哪里,并没有真正建立起连接来,下面我们进行连接操作,才是真正开始通过网络去与数据库服务器进行通信!
// 令当前客户端与描述的数据库服务器建立连接, 会抛出 SQLException 异常
Connection connection = dataSource.getConnection();
● 构造 sql 语句
String sql = "select id, name, sex from student";
PreparedStatement statement = connection.prepareStatement(sql);
通过 connection.prepareStatement 方法构造出一个对象,PreparedStatement 类型的,其实这个对象背后做了很多事情,比如会对 sql 语句进行一些预处理....
上述的写法是直接写死了,如果是查询操作还好,那如果是要执行新增操作呢?也是直接写死吗?
String sql = "insert into student values(4, '小丽', '女')";
更多的时候,插入的数据的动态的,那要怎么写呢?可以使用 PerparedStatement 来通过占位符替换的方式,从而实现动态 sql 的构造:
String sql = "insert into student values(?, ?, ?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);
statement.setString(2, name);
statement.setString(3, sex);
这里每个 ? 的位置是通过1开始计算的,setInt(1, 4),就是将第一个 ? 位置的数据插入成 4,后面的以此类推。
构造出指定的 sql 语句后,就可以通过 statement 这个引用来执行了
● 执行 sql 语句
ResultSet result = statement.executeQuery(); // 查询操作
// int ret = statement.executeUpdate(); -> 新增, 修改, 删除操作
excuteQuery 执行后,会返回一个结果集,如果是 executeUpdate 则返回这个操作影响到几行。
● 处理结果集
while (result.next()) {
int id = result.getInt("id");
String name = result.getString("name");
String sex = result.getString("sex");
System.out.printf("student : id = %d, name = %s, sex = %s\n", id, name, sex);
}

● 断开连接
result.close();
statement.close();
connection.close();
JDBC 使用步骤总结:
- 创建数据源并连接
- 创建 sql 语句
- 使用操作命令来执行 sql
- 处理结果
- 释放资源
JDBC 在实际工作中,可能并不会直接使用,上述的代码大家也能看到,写起来还是比较麻烦的,因此就有了一些库和框架,针对 JDBC 进行了进一步的封装,让我们使用起来更方便,比如后续会学习到的 Mybatis 这种...
其实 JDBC 并不难,就是几个固定的套路,如果要是应付考试,还是需要自己多建几个表利用 JDBC 使用一些复杂查询,多练习练习,如果是工作中,用 JDBC 就不多了,会使用更方便的框架,如果你是一个很有自己想法的同学,可以基于 JDBC 进行修改,搭建一套属于自己的框架出来...
MySQL 数据库基础(完) ❀
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin
我创建了一个由于“在运行时执行的单例元类定义”而无法编码的对象(这段代码的描述是否正确?)。这是通过以下代码执行的:#defineclassXthatmyusesingletonclassmetaprogrammingfeatures#throughcallofmethod:break_marshalling!classXdefbreak_marshalling!meta_class=class我该怎么做才能使对象编码正确?是否可以从对象instance_of_x的classX中“移除”单例组件?我真的需要一个建议,因为我们的一些对象需要通过Marshal.dump序列化机制进行缓存。
我正在查看Ruby日志记录库Logging.logger方法并从sourceatgithub提出问题与这段代码有关:logger=::Logging::Logger.new(name)logger.add_appendersappenderlogger.additive=falseclass我知道类 最佳答案 这实际上删除了方法(当它实际被执行时)。这是确保close不会被调用两次的保障措施。看起来好像有嵌套的“class 关于Ruby元编程问题,我们在StackOverflow上找到一
使用Paperclip,我想从这样的URL抓取图像:require'open-uri'user.photo=open(url)问题是我最后得到一个像“open-uri20110915-4852-1o7k5uw”这样的文件名。有什么方法可以更改user.photo上的文件名?作为一个额外的变化,Paperclip将我的文件存储在S3上,所以如果我可以在初始分配中设置我想要的文件名就更好了,这样图像就会上传到正确的S3key。像这样:user.photo=open(url),:filename=>URI.parse(url).path 最佳答案
我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi
我正在开发一个xcode自动构建系统。在执行一些预构建验证时,我想检查指定的证书文件是否已被撤销。我了解securityverify-cert验证其他证书属性但不验证吊销。我如何检查撤销?我正在用Ruby编写构建系统,但我对任何语言的想法都持开放态度。我阅读了这个答案(Openssl-Howtocheckifacertificateisrevokedornot),但指向底部的链接(DoesOpenSSLautomaticallyhandleCRLs(CertificateRevocationLists)now?)进入的Material对我的目的来说有点过于复杂(用户上传已撤销的证书是一