
文章目录
在实际的开发中,我们大多数都是通过代码来自动执行的,这就需要我们通过编程语言来操作数据库服务器。

MySQL客户端就是我们使用的黑框框,那么需要用编程语言去适实现客户端,MySQL也为我们提供了很多API去帮助我们实现客户端。
但是不同的数据库就会有不同的API,我们要想使用那个数据库就必须掌握这个数据库的API,比如今天我在公司A使用的是MySQL的数据库,去公司B使用的Oracle的数据库,就要重新学习Oracle的API,这样十分麻烦。
这时候java为我们提供了一套统一的标准JDBC。
JDBC: JDBC(Java DataBase Connectivity Java数据库连接)就是使用java语言操作关系型数据库的一套API

JDBC是(sun公司)定义的一套操作所有关系型数据库的规则,然后每个数据库厂商根据这个规则去实现这套规则,提供数据库驱动jar包,然后我们可以使用JDBC去操作,真正执行的是数据库驱动jar包中的实现类。
我们在这里展示MySQL的驱动包。
点击: 中央仓库

在上面搜索MySQL,然后点击MySQL Connector java

我们可以往下滑选择版本,我们的MySQL是什么版本这里我们对应相应的版本。

然后点击jar。

当我们在文件夹看到相应的jar,证明我们的驱动就下载完整。

我们在创建的文件下建一个空目录,一般命名为lib。

然后我们把刚才下载好的驱动jar包拉到lib目录,或者ctrl C + V

然后右键lib选择Add as Library…


当我们发现目录下有这些文件,证明我们的驱动就导入好了。

我们在写jdbc的代码时,看起来挺复杂,实际都是有固定的模板。

这大概就是JDBC操作数据库的具体流程,接下来,我们一一揭示各个API
DriverManager(驱动管理器)是由SUN公司实现的,提供了基本的获取连接方式。主要作用是管理注册到DriverManager中的JDBC驱动程序,并根据需要使用JDBC驱动程序建立与数据服务器的连接网络。频繁的进行数据库连接会产生很大的开销。

我们这里通过反射来将驱动加载到内存,这里我们可以发现我们并没有去使用DriverManager而是使用的Driver.

我们可以发现Driver类中有一个静态代码块中去使用了DriverManager.
因为DriverManager去连接服务器是使用反射去进行的,是非常规操作,多次连接时效率比较低,这里我们不进行详细介绍,我们正常情况下使用的是DataSource的方法去描述服务器。
DataSource dataSource = new MysqlDataSource();

我们可以发现DataSource是JDBD里的API,大部分都是抽象的无法实例化,MysqlDataSource是驱动包提供的类。
在这里我们用DataSource去接收MysqlDataSource对象,更好的实现了高内聚,当然用MysqlDataSource接收也是可以的。
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/zd?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
URL:唯一资源地址符

User:用户名
用户名固定为root,也可以通过配置来修改。
Password:登录数据库的密码
这个密码是我们在安装数据库时,手动设置的,大家一定要记清楚。
此时我们数据源创建的操作,只是去描述了下服务器在那里,访问那个数据库,编码方式是什么,登陆账号密码是什么等等,但还没有真正进行连接访问,下来我们进行连接操作,真正开始通过网络进行通信。

大家要注意我们这里使用的ConnectionAPI是java.sql包下的。
Connection是网络通信中的核心概念,叫做"连接"

我们在获取连接时,发现爆红了,我们看一下提示信息,没有处理的异常,这里我们需要手动的处理一下这个异常throws抛一下这个异常。
//2.与服务器建立连接
Connection connection = dataSource.getConnection();
我们需要注意的是我们不是new Connection对象,而是用刚才创建的数据源去获取。
Connection管理事务
这里可以通过Connection对象调用事务方法
//开启事务
connection.setAutoCommit(boolean autoCommit);//是否自动提交事务,true是,false否
//提交事务
connection.commit();
//回滚事务
connection.rollback();
Statament的作用:
执行sql语句:
int executeUpdate(sql);//返回受影响的行数
ResultSet executeQuery(sql);//返回ResultSet结果集对象
//3.写SQL语句
String sql = "insert into student values(001,'小张')";
//4.获取一个执行sql的对象
Statement statement = connection.createStatement();
//5.执行sql,并接收返回结果
int ret = statement.executeUpdate(sql);
//6.断开连接,释放资源
statement.close();
connection.close();

我们可以发现成功插入了,受影响的为一行。
我们可以发现一些这样的弊端: sql语句是写死的,没有对sql语句进行处理,速度慢。
释放资源的时候和开启资源是相反的,先开启的后释放。
ResultSet:是我们执行查询语句的返回结果集。
boolean next(); //判断当前行是否有效,移动光标
xxx getXxx(参数名);//获取指定列数据

我们的next()相当于一个光标由上到下遍历表,get方法是获取指定列的数据。
//3.写SQL语句
String sql = "select * from student";
//4.获取一个执行sql的对象
Statement statement = connection.createStatement();
//5.执行sql,并接收返回结果
ResultSet ret = statement.executeQuery(sql);
while(ret.next()) {
int id = ret.getInt("id");
String name = ret.getString("name");
System.out.println("id: "+id+" name: "+name);
}
//6.断开连接,释放资源
ret.close();
statement.close();
connection.close();

我们可以发现可以将查询的结果打印出来。

我们需要有几个注意的点,我们执行查询sql的时候是执行的executeQuery方法,增删改执行的是executeUpdate方法。

我们在接受时,类型为该列的数据类型,方法传入的是该列的名称。

ResultSet也是资源,我们在使用完之后也要进行释放。

PreparedStatement是可以预防SQL注入问题(SQL注入是通过操作输入来修改事先定义好的SQL语句,到达用代码对服务器攻击的方法)
我们在插入的时候sql语句相当于是直接写死了,那能不能我们手动的去输入自己想插入的数据呢?

如果我们直接通过字符串拼接的方法去构造这个sql的话,会出现语义偏差,结果有可能会和我们预期偏离。
//通过 ? 占位符代替SQL语句中的参数
String sql = "insert into student values(?,?)";
PreparedStatement statement = connection.prepareStatement(sql);
因为我们的PreparedStatement对象会对SQL语句进行预编译,所以我们在创建时就需要传入sql。

我们需要注意占位符的编号是从1开始的。
PreparedStatement对象.setXxx(参数1,参数2);//Xxx为数据类型,参数一为编号,参数二为我们想要赋值具体的值。


我们发现我们成功的通过占位符指定内容插入。

标准接口:DataSource用来获取连接
SUN公司提供的数据库连接池标准接口,第三方实现。
Connection getConnection();
数据库连接池: 负责分配,管理数据库连接。
好处: 1. 资源复用
2. 提升系统响应速度
2. 避免数据库连接遗漏

当我们没有数据库连接池时,当用户访问数据库时,需要建立一个连接,访问完毕之后直接释放连接,再次想访问时,需要重新建立连接,在此过程中需要耗费网络带宽,时间,各种资源等。

当我们建立一个数据库连接池时,我们每次链接都会将这个连接放入这个池子里,每次连接的时候直接使用,用完之后也不不会释放,而是归还到池子里。
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
网络编程套接字网络编程基础知识理解源`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
我创建了一个由于“在运行时执行的单例元类定义”而无法编码的对象(这段代码的描述是否正确?)。这是通过以下代码执行的:#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 最佳答案
我正在开发一个xcode自动构建系统。在执行一些预构建验证时,我想检查指定的证书文件是否已被撤销。我了解securityverify-cert验证其他证书属性但不验证吊销。我如何检查撤销?我正在用Ruby编写构建系统,但我对任何语言的想法都持开放态度。我阅读了这个答案(Openssl-Howtocheckifacertificateisrevokedornot),但指向底部的链接(DoesOpenSSLautomaticallyhandleCRLs(CertificateRevocationLists)now?)进入的Material对我的目的来说有点过于复杂(用户上传已撤销的证书是一
关闭。这个问题是off-topic.它目前不接受答案。想改进这个问题吗?Updatethequestion所以它是on-topic用于堆栈溢出。关闭11年前。Improvethisquestion我不经常使用ruby-通常它加起来相当于每两个月或更长时间编写一次脚本。我的大部分编程都是使用C++进行的,这与ruby有很大不同。由于我与ruby之间的差距如此之大,我总是忘记语言的基本方面(比如解析文本文件和其他简单的东西)。我想每天练习一些基本的东西,我想知道是否有一些我可以订阅的网站,并且会向我发送当天的Ruby问题或类似的东西。有人知道这样的站点/Internet服务吗?
我一直在寻找一种以编程方式或通过命令行将mp3转换为aac的方法,但没有成功。理想情况下,我有一段代码可以从我的Rails应用程序中调用,将mp3转换为aac。我安装了ffmpeg和libfaac,并能够使用以下命令创建aac文件:ffmpeg-itest.mp3-acodeclibfaac-ab163840dest.aac当我将输出文件的名称更改为dest.m4a时,它无法在iTunes中播放。谢谢! 最佳答案 FFmpeg提供AAC编码功能(如果您已编译它们)。如果您使用的是Windows,则可以从here获取完整的二进制文件。
我想输入一个字符串并返回一个可用于描述字符串结构的正则表达式。正则表达式将用于查找更多与第一个结构相同的字符串。这是故意模棱两可的,因为我肯定会漏掉SO社区中的某个人会发现的情况。请发布任何和所有可能的方法来做到这一点。 最佳答案 简单的答案(可能不是您想要的)是:返回输入字符串(正则表达式特殊字符转义)。这始终是与字符串匹配的正则表达式。如果您希望识别某些结构,则必须提供有关您希望识别的结构类型的更多信息。如果没有这些信息,问题就会以模棱两可的方式陈述,并且有许多可能的解决方案。例如,输入字符串'aba'可以描述为'阿巴''阿巴*