技术标签: DriverManager对象 JDBC Anthony的JavaWeb学习记录
前面4大核心对象基本代码都知道了,现在开始一个一个具体学习每个对象以及这个对象的常用操作和方法。DriverManager类是java.sql下的类,主要有两个功能,注册驱动和获取连接对象。本篇就这两个功能展开,具体来学习下。
1.注册驱动
相关代码
//注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
前面的例子我们使用上面这行代码去注册驱动,但是,这里要说明这种方式不推荐使用,因为这行代码会driver注册两次,而且强烈依赖jar包,上面是连接mysql,如果以后换成oracle,这个jar包还得改。下面来解释下为什么driver被注册两次。
在JDK文档上,找到DriverMananger这个类,找到注册方法。
这句红圈解释并不好理解,那么我们去Eclipse上看看com.mysql.jdbc.Driver()中这个Driver类的代码。打开Driver.class源码,看到以下这个静态代码块。
在静态代码块里,我们看到调用DriverManager的注册方法,我们知道,在一个类中静态代码块会在类加载之后里面执行。所以以下代码中driver会被执行两次。
//注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
我们自己调用registerDriver注册一次,然后new Driver对象的时候又在静态代码块中执行一次,所以这行代码执行了两次。
解决办法
使用反射来加载驱动, Class.forName("Driver.class在mysql jdbc包的全路径")
package demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCTest {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获取连接Connection对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "123456");
//得到执行SQL语句的Statement对象
Statement stmt = conn.createStatement();
//执行SQL语句,这里是执行查询语句,得到一个虚拟表的结果对象
ResultSet rs = stmt.executeQuery("SELECT * FROM student");
//对结果进行处理,这里是打印
while(rs.next()) {
System.out.println(rs.getObject(1) + "\t" + rs.getObject(2) + "\t" + rs.getObject(3) + "\t"+ rs.getObject(4));
}
//关闭连接
rs.close();
stmt.close();
conn.close();
}
}
运行一下,和前面一篇一样,也能打印出表信息。其实这两利用反射,Driver.class的全路径,你可以在Eclipse上的包引用展开,找到com.mysql.jdbc.Driver这个类。
以后就用反射方法,用Class.forName的方式。这个driver的全路径,以后我们可以提取出来,放到配置文件中去。以后这个配置文件,可以改成oracle中driver的路径,或者其他数据库的。
2.与数据库建立连接
连接对象获取方法代码
//获取连接Connection对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "123456");
我们再次打开JDK中DriverManger类文档
上面有三个连接方法,我这里用的是第三个,有三个参数url,user,password。
先来看看Url这个参数:jdbc:mysql://localhost:3306/mydatabase, 这个url中jdbc是指JDBC协议,mysql是一个子协议,也就是数据库厂商提供的一个协议,是jdbc的子协议,后面localhost:3306,表示一台机器上运行端口3306的mysql服务。后面mydatabase是数据库的名称。简单来说这个url就是JDBC和数据库厂商的一个协议规范,如果连接oracle,这个就可能变成这样
jdbc:oracle:thin:@localhost:1521:sid
至于参数user和password,指的是数据库用户名和密码。
上面三个连接数据库的方法,应该来说,第三个是我们经常使用的,下面把其他两个代码例子也写出来。
Properties info = new Properties();
info.setProperty("user","root");
info.setProperty("password","123456");
getConnection("jdbc:mysql://localhost:3306/mydatabase", info);
# 第三种方法
getConnection("jdbc:mysql://localhost:3306/mydatabase?user=root&password=123456")
上面两种我就不贴出来完整代码,可以用TestNG或者Junit来写用例测试一下。
对于STM32,在使用ADC的时候需要配置几个参数。(1) 第一个参数是ADC_Mode,这里设置为独立模式:ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;在这个模式下,双ADC不能同步,每个ADC接口独立工作。所以如果不需要ADC同步或者只是用了一个ADC的时候,就应该设成独立模式了。(2) 第二个参数是ADC_S...
1. 加上封装之后的成本C++在布局及存取时间上主要的额外负担是由virtual引起的,包括:(1) virtual function机制:用以支持一个更有效率的“执行期绑定”(2) virtual base class机制用以实现“多次出现于继承体系中的base class 仅有一个单一而被共享的实例”(继承层次中含virtual继承的多继承) 另外还有
1. Field属性Field是文档中的域,包括Field名和Field值两部分,一个文档可以包括多个Field,Document只是Field的一个承载体,Field值即为要索引的内容,也是要搜索的内容。是否分词(tokenized)是:作分词处理,即将Field值进行分词,分词的目的是为了索引。比如:商品名称、商品描述等,这些内容用户要输入关键字搜索,由于搜索的内容格式大、内容多...
/*! * jQuery JavaScript Library v1.12.3 * http://jquery.com/ * * Includes Sizzle.js * http://sizzlejs.com/ * * Copyright jQuery Foundation and other contributors * Released under the MI
SpringBoot 2.X 整合 JUnit5 及全方位使用手册
配置时间同步时间同步服务状态正常配置阿里源创建目录,还有配置文件2.2 安装docker安装工具依赖安装docker这里地方出现报错,是因为是githup上面的,容易连接不到,多尝试几次我这里就采用科学上网的方式,去下载如果公司有规定,建议不要模仿查看版本docker-compose版本信息docker-compose --version...
Fenye.html<!DOCTYPE html><html><head> <title>分页</title></head><script type="text/javascript">/*** AJAX* 1.创建ajax对象* 2.建立连接* 3.判断aja...
Mac下搭建VUE项目操作系统:macOs系统版本:10.14.61.安装node,npm环境你可以通过以下两种方式在 Mac OS 上来安装 node:1、在官方下载网站下载 pkg 安装包,直接点击安装即可。2、使用 brew 命令来安装:Homebrew官网/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"可用国内镜像/bin/zsh -
这两天安装生产环境的RAC,成功装完后,期间也遇到了不少小问题,今天一同事把服务器重启启动了一下之后,CRS就启动不了了。。数据库:oracle 11.2.0.1,系统是oraclelinux6.3以下是我做的错误及处理记录各位大师,是否还有更好的处理办法啊??请指教!!!错误现象:服务器重启之后,crs启动不了[[email protected] ~]$crs_stat
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印拼接出所有数字汇总最小的一个。def min_arry_num(nums): res = nums_sort(nums) return ''.join(res)def nums_sort(nums): nums = [str(num) for num in nums] if len(...
(1)client1,基于SIGIO的写法: 1 #include <sys/types.h> 2 #include <sys/stat.h> 3 #include <fcntl.h> 4 #include <unistd.h> 5 #include <signal.h> 6 7 #incl...
我们要想添加按钮,首先得有一个活动Activity,所以先手动创建一个活动。点击第一项-&gt;点击Finish。创建成功之后,双击出现如下代码:因为Android Studio的设计讲究逻辑与视图分离,最好一个活动对应一个布局,以显示界面的内容,所以现在还需手动创建一个布局文件。接下来会弹出:先创建一个layout的目录:然后在...