JDBC 连接数据库的四种方式


每博一文案

师傅说,人这一辈子总有许多遗憾,许多无可奈何。
其实有些事情不用太过执着,放下牵绊你的生活无畏执念,你会收获一个更为广阔的天地。
想开,看开,放开这六个字,就是人生最好的活法。
你给人生设立了很多目标,用没日没夜的加班,工作,不断透支着自己的身体换取成功的筹码,
但是健康的身体一旦失去,就很难再重新回来。你总是强迫自己变成别人喜欢的模样,却忘了问问,自己内心
真正的想法,你总是很在乎别人的看法,因为别人的一句话就胡思乱想,明明自己受了委屈,怕得罪人,而什么
都不敢说。其实你不必太过与计较得失,学会坦然面对,怡然自得,别在做不到的事情为难自己,学会追求
自己真正想要的东西。
人生的道路走得慢一点,稳一点,才能收获沿途更多的风景。学会想开,看开,放开,那些不值得的人与事,你
的人生才能拥有更加珍贵的东西。——————   一禅心灵庙语

文章目录

  • JDBC 连接数据库的四种方式
    • 每博一文案
    • 1. JDBC 六步编写步骤
    • 2. 部署对应驱动
      • 2.1 下载驱动
      • 2.2 将驱动加载到项目中这里以 IDEA 为例
    • 3. 连接数据库的四种方式:
      • 3.1 方式一:
        • 3.1.1要素一:Driver接口,Driver类
        • 3.1.2 要素二:URL 统一资源定位符
        • 3.1.3 要素三:用户名和密码
      • 3.2 方式二:使用 DriverManager 代替driver.connect(url,properties);统一管理数据库
      • 3.3 方式三: 通过反射加载 Driver类,执行其中的静态代码块,这是常用的方式 ⭐⭐⭐
      • 3.4 方式四: 将信息写入到配置文件中,通过读取配置文件中的信息连接数据库,常用的方式 ⭐⭐⭐
    • 4. 实测:连接数据库进行增删改操作
    • 5. 总结:
    • 6. 最后:

1. JDBC 六步编写步骤

JDBC编程六步骤 ,这是一个十分重要的一个点 ⭐⭐⭐⭐⭐

  1. 注册驱动 作用:告诉Java程序,即将要连接的是哪个品牌的数据库。就是说明你 要连接的是什么品牌(MySQL,Oracle,SQL Server)的数据库
  2. 连接数据库 作用:连接上你上一步注册驱动的数据库。表示 JVM 的进程和数据库进程之间的通道打开,这是属于进程之间的通信,注意:使用完之后一定要关闭
  3. 获取操作数据库操作对象 专门执行SQL语句的对象,注意使用完之后,一定要关闭资源
  4. 第三步获得的对象,执行SQL语句(DQL,DML…) ,注意在Java中执行SQL语句不要加上分号; ,不然可能报错
  5. 处理查询结果集 (只有当第四步,执行的是 select 查询结果集的时候,才有这第五步,处理查询结果集)
  6. 关闭、释放资源:使用完资源之后,一定 要关闭资源(如果连接的资源过多,没有关闭的话,当连接的资源数量达到一定的数量,可能就无法再连接资源了,所以使用完资源,一定要及时关闭,这是一个好习惯)

补充:ODBC(Open Database Connectivity,开放式数据库连接),是微软在Windows平台下推出的。使用者在程序中只需要调用ODBC API,由 ODBC 驱动程序将调用转换成为对特定的数据库的调用请求。


2. 部署对应驱动

什么是驱动

这里的驱动指的是:不同数据库厂家对 JDBC 接口的实现类的,打包封装成一个以.jar 包。所有的数据库驱动都是以 jar 包的形式存在的,在 jar 包当中有很多,.class文件,这些class文件就是对 JDBC 接口的实现。

注意: 驱动不是 SUN公司提供的,而是各个不同的数据库厂商负责提供的,用于Java程序员连接上他们的数据库,下载驱动的 jar 包需要去数据库官网下载。这里以 MySQL 数据库为例:


2.1 下载驱动

我们需要下载好驱动的 jar 包

  1. 我们先进入到 MySQL官网:https://dev.mysql.com/downloads/

  1. 再选择: Platform Independent

  2. 选择下载对应的zip压缩文件即可。

  1. 下载好之后,解压就好了。

  1. 打开该文件夹,其中会有一个名为 mysql-connector-j-8.0.31.jar 的驱动文件。就是它了。


提醒一点: 新版本的 JDBC 驱动类的包有所改动,将以前的 com.mysql.jdbc.Driver改为com.mysql.cj.jdbc.Driver

但是该这篇文章使用的是 mysql-connector-java-5.1.7 版本的为例的,没有做改动,如有需要的,我提供了

Github,以及 Gitee 链接大家可以自行获取,

Github: software-and-configuration/JDBCmysql at master · China-Rainbow-sea/software-and-configuration (github.com)

Gitee: JDBCmysql · 彩虹海/软件和配置 - 码云 - 开源中国 (gitee.com)


2.2 将驱动加载到项目中这里以 IDEA 为例

  1. 第一步在 IDEA 中 (右)击项目名,New——>一个目录(Directory) ,名为 libs 的目录(文件夹),用于存放我们刚刚下载好的 jar 驱动包 ,这里说明一下,新建一个目录,存放是为了,方便管理项目中的文件。规范化


  1. 我们将我们下载好的 jar 驱动 复制,粘贴到该目录中去就可以了,


  1. 添加好以后,我们在右击 mysql-connector-java-5.1.7-bin.jar 将该 jdr 驱动部署到项目中去,选择 (Add as Library)


这样我们就把 jar 驱动部署到我们的项目中去了。

3. 连接数据库的四种方式:

对应连接数据库有许多的方法,不仅仅只是七种而已,方法虽然有很多,但是真正在实际开发中使用到的也就只有一两种而已, 这里我们的四种方式,都是一次一次的优化迭代的出来的,其中在开发中常用的 也就是这里的倒数 两种而已。其他的大家了解就可以了。

为了,是我们更加清晰了解Java程序连接数据库这里我们自己编写一个简单版的 JDBC 模拟连接数据库

  1. 模拟 SUN公司制定的 JDBC 接口
package day01;/*** 模拟 SUN公司制定的 JDBC 接口*/
public interface JdbcInterface {// 抽象方法,连接数据库public Object getConnection();// crud 增删改public void crud();// 关闭资源public void close();
}


  1. 模拟 Mysql 数据库厂家实现 JDBC 接口的实现类
package day01;/*** 模拟 Mysql 数据库厂家实现 JDBC 接口的实现类*/
public class MysqlJdbc implements JdbcInterface{@Overridepublic Object getConnection() {System.out.println("连接上 MySQL数据库");return null;}@Overridepublic void crud() {System.out.println("对MySQL数据库进行增删改操作");}@Overridepublic void close() {System.out.println("关闭MySQL资源");}
}


  1. 模拟 Oracle 数据库厂家实现 JDBC 接口的实现类
package day01;/*** 模拟 Oracle 数据库厂家实现 JDBC 接口的实现类*/
public class OracleJdbc implements JdbcInterface {@Overridepublic Object getConnection() {System.out.println("连接上Oracle数据库");return null;}@Overridepublic void crud() {System.out.println("对Oracle数据库进行增删改操作");}@Overridepublic void close() {System.out.println("关闭Oracle资源");}
}


  1. 模拟Java程序面向JDBC接口连接数据库
package day01;/*** 模拟Java程序面向JDBC接口连接数据库*/
public class TestJdbc {public static void main(String[] args){JdbcInterface mysqlJdbc = new MysqlJdbc(); // 多态,接口引用实现类,(动态绑定)mysqlJdbc.getConnection(); // 连接Mysql数据库mysqlJdbc.crud();  // 对Mysql数据库进行增删改操作mysqlJdbc.close(); // 关闭Mysql 的资源System.out.println("==============下面是Oracle的连接操作============");JdbcInterface oracleJdbc = new OracleJdbc();oracleJdbc.getConnection();oracleJdbc.crud();oracleJdbc.close();}
}


运行结果:


3.1 方式一:

通过上述模拟的连接数据库操作,让我们进一步了解的,Java程序连接数据库,这里我们就来真正的连接我们的数据库:

实例代码实现:

package Blogs;import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;public class blogs01 {/*** 方式一:* @param args*/public static void main(String[] args) throws SQLException {// 1. 注册驱动(说明你要连接的数据库是什么品牌的)// java.sql.Driver 是接口, com.mysql.jdbc.Drivers是该接口的实现类java.sql.Driver driver = new com.mysql.jdbc.Driver(); // 路径new 类// 或者我们导入 java.sql.Driver 可以省略其中的java.sql.DriverString url = "jdbc:mysql:localhost:3306/test?useUnicode=true&characterEncoding=utf8";/*?useUnicode=true&characterEncoding=utf8 设置字符编码,如果JDBC程序与服务器端的字符集不一致,会导致乱码,那么可以通过参数指定服务器端的字符集url 赋值上,你所要连接的数据库网络上的地址(位置)*/// url 统一资源定位符// 将连接数据库的用户名和密码封装到 Properties 中,让其自动获取Properties properties = new Properties();properties.setProperty("user","root"); // 用户名properties.setProperty("password","abc123"); // 密码// 2.连接上(注册驱动时的)数据库// Connection 是一个接口Connection connection = driver.connect(url,properties);System.out.println("方式一:"+connection);  // 打印连接上的数据库的地址// 3. 获取操作数据库对象...这里省略,我们只是连接数据库// 4. 通过获取的对象操作数据库,执行SQL语句// 5. 如果第四步是 select 查询结果集,处理查询的结果集// 6. 关闭资源,一般放在 finally 一定会被执行(无论是否存在异常)}
}


上述代码的解析:

3.1.1要素一:Driver接口,Driver类

大家看到这里可能会有疑惑吧,就是为什么 Driver又是接口,又是类的。是不是写错了,其中没有写错,这两虽然是同名的但是去一样的,它们分别在各自不同的包下,只是命名相同,既然命名相同,它们之间一定有什么紧密的联系,Driver类是对 Driver接口的实现,默认情况下: Driver 是一个接口在 java.sql.Driver包下,打开 JDK文档查看:如下:

java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给各个数据库厂商使用的,不同数据库厂商对其实现接口。

我们知道接口里面只是一些抽象方法,具体的使用我们还是要使用其中实现了该java.sql.Driver 接口的类的,其中的com.mysql.jdbc.Driver 包下的 Driver 就是注册驱动的实现类。非常有意思的是该类和它的接口的命名是一样的 都是 Driver ,所以容易让大家混淆。

其实也是十分简单:我们需要记住

对应的包就好了,如 java.sql.Driver包下的Driver 是接口, 而 com.mysql.jdbc.Driver 包下的是实现类

注意: 命名相同的 类名 或者是 接口名 ,Java调用时,不知道该调用哪一个,从而报错,所以必须指明绝对路径 new 的类

有关com.mysql.jdbc.Driver 包下的类,我们可以通过查看 我们下载到 Mysql 实现驱动的源代码上查看到如下:

Mysql中的Driver.java实现类的源代码如下:

/*Copyright  2002-2004 MySQL AB, 2008 Sun MicrosystemsThis program is free software; you can redistribute it and/or modifyit under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation.There are special exceptions to the terms and conditions of the GPL as it is applied to this software. View the full text of the exception in file EXCEPTIONS-CONNECTOR-J in the directory of this software distribution.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*/
package com.mysql.jdbc; // 对应的包import java.sql.SQLException;/*** The Java SQL framework allows for multiple database drivers. Each driver* should supply a class that implements the Driver interface* * <p>* The DriverManager will try to load as many drivers as it can find and then* for any given connection request, it will ask each driver in turn to try to* connect to the target URL.* * <p>* It is strongly recommended that each Driver class should be small and* standalone so that the Driver class can be loaded and queried without* bringing in vast quantities of supporting code.* * <p>* When a Driver class is loaded, it should create an instance of itself and* register it with the DriverManager. This means that a user can load and* register a driver by doing Class.forName("foo.bah.Driver")* * @see org.gjt.mm.mysql.Connection* @see java.sql.Driver* @author Mark Matthews* @version $Id$*/
public class Driver extends NonRegisteringDriver implements java.sql.Driver {// ~ Static fields/initializers// ---------------------------------------------//// Register ourselves with the DriverManager//static {try {java.sql.DriverManager.registerDriver(new Driver());} catch (SQLException E) {throw new RuntimeException("Can't register driver!");}}// ~ Constructors// -----------------------------------------------------------/*** Construct a new driver and register it with DriverManager* * @throws SQLException*             if a database error occurs.*/public Driver() throws SQLException {// Required for Class.forName().newInstance()}
}

3.1.2 要素二:URL 统一资源定位符

URL 统一资源定位符( 网络中某个资源的绝对路径 )。

URL 包括: 协议,域名(ip地址),端口号,资源名

例如: http://110.242.68.3/index.html/这是一个百度的网页地址,大家可以复制到地址栏上访问看看, https 表示通信协议,110.242.68.3 ip地址,https默认端口是80,index.html资源名

什么是通信协议,有什么用 ?

通信协议是通信之前就提前定好的,作用是规定好数据是以什么样的格式传送的,格式是提交定好的,不然不同的格式浏览器是无法识别到的。就比如:一个中国人说广东话,给外国人听,而那个外国人,也说它们自己的方言,

两个人,谁也听不懂,它们各自在说什么 ???,同样的协议不同(导致数据格式不同),有怎么可以识别通信呢

同理我们这里的 URL:表示的是我们所要连接的数据库的地址 ,你要连接数据库总要告诉人家你在网络上的什么位置吧,不然,怎么连接上呢。是吧,总不至于让,人家在这个庞大的网络上,大海捞针吧。

 String url = "jdbc:mysql:localhost:3306/test?useUnicode=true&characterEncoding=utf8";数据库所在的网络上的位置jdbc:mysql 表示协议localhost 表示本地ip地址和 127.0.0.1是一样的表示本地ip地址3306 表示Mysql默认的端口号test 表示实际具体的数据库名(资源名)useUnicode=true&characterEncoding=utf8 表示设置有关的字符编码集:如果JDBC驱动和服务器的字符编码不一致的话,会出现乱码,报错的现象,我们需要指定服务器端的字符集

3.1.3 要素三:用户名和密码

user 表示连接上数据库的用户名

password 表示连接上数据库的密码 ,

这两个变量名,不要修改它们,统一使用默认的。其值根据实际情况赋值就好了。


Properties properties = new Properties(); 实例化类,将我们的用户名和封装到对象中,让其自动获取对应的值


Connection connection = driver.connect(url,properties);

其中的 Connection 是一个接口是 driver.connect 方法的返回值,driver.connect作用:根据我们的用户名和密码,尝试连接我们指定的url上的数据库,注意是尝试所以可能会失败,需要进行异常处理操作。


3.2 方式二:使用 DriverManager 代替driver.connect(url,properties);统一管理数据库

我们通过DriverManager 类来代替Driver实现来统一管理(注册驱动,连接数据库)数据库


  • 在DriverManager类下有一个名为registerDriver静态 方法,作用:注册驱动。注意它的参数是 Driver 接口,接口时不可以 new 的,所以我们需要传入的是该 Driver 的实现类,该实例类在 com.mysql.jdbc.Driver 包下。因为接口名和实现的类名是一样的我们,需要通过导入绝对路径的方式new 对象,防止歧义冲突,报错。具体如下:


  • 在DriverManager类下有一个名为DriverManager.getConnection静态 方法,作用: 通过信息尝试连接上 给定url的数据库,注意和方式一,一样是尝试,所以可能失败,需要异常处理。具体信息如下文档:

具体代码实现:

public static void main(String[] args) throws SQLException {// 1. 注册驱动(说明你要连接的是什么品牌的数据库)// registerDriver 的参数是 Driver类类型, 而Driver 在默认包下是接口,接口是不可以new的,所以我们需要传入其实现类DriverManager.registerDriver(new com.mysql.jdbc.Driver());// 或者分两步// java.sal.Driver 是接口, com.mysql.jdbc.Driver() 是实现类java.sql.Driver driver = new com.mysql.jdbc.Driver();DriverManager.registerDriver(driver); String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";  // 所连数据库在网络上的位置String user = "root"; // 用户名String password="abc123";  // 密码// 2.连接根据信息连接上(注册驱动)上的数据库  DriverManager.getConnectionConnection connection = DriverManager.getConnection(url,user,password);System.out.println("方式二:"+connection);  // 打印连接上数据库的地址// 3.获取操作数据库的对象// 4.通过对象执行SQL语句// 5.如果第4步是select 查询结果集的操作,处理结果集// 6.关闭资源,一般放在finally 中.}


3.3 方式三: 通过反射加载 Driver类,执行其中的静态代码块,这是常用的方式 ⭐⭐⭐

加载驱动:加载 JDBC 驱动需调用 Class 类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名

  • Class.forName(“com.mysql.jdbc.Driver”);

使用反射加载com.mysql.jdbc.Driver包下的类,动态加载,更加的灵活,减少依赖性。

我们这里通过反射加载了其中 com.mysql.jdbc.Driver 的类,让其执行其中的 静态代码块(加载类就会被执行一次),该静态代码块的作用就是注册驱动 ,如下是该 com.mysql.jdbc.Driver下的静态代码块:

具体代码实现:

public static void main(String[] args) throws ClassNotFoundException, SQLException {// 1.注册驱动(说明你要连接的是什么品牌的数据库),这里通过反射加载Driver类,执行Driver类中的 注册驱动的静态方法Class.forName("com.mysql.jdbc.Driver"); // 因为我们只是想要执行其中Driver的静态方法,所以我们并不需要接受返回值String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";String user = "root";String password = "adc123";// 2. 连接驱动Connection connection = DriverManager.getConnection(url,user,password);System.out.println("方式三:"+connection);  // 打印其连接上数据库的地址// 3. 获取操作数据库的对象// 4. 通过对象操作数据库,执行SQL语句// 5. 如果第四步是 select 是查询结果集,需要处理结果集// 6.关闭资源,一般放在 finally 中(一定会被执行,无论是否异常)}


补充:

其实我们也可以将其中的反射加载类,也就是这段代码Class.forName("com.mysql.jdbc.Driver") 省略掉,也是没有问题的。实验如下:

是因为:从JDK1.5 以后使用 jdbc,不再需要显示调用 Class.forName() 注册驱动,而是自动调用驱动 jar 包下的 META-INF\services\java.sql.Driver 文本中的类名称去注册。

但是还是建议写上 Class.forName(),可以更加直观的知道你连接的是什么品牌的数据库,提高代码的可读性

3.4 方式四: 将信息写入到配置文件中,通过读取配置文件中的信息连接数据库,常用的方式 ⭐⭐⭐

我们可以将相关的信息(url(数据库所在位置)、用户名、密码)写入到 .properties文件中去,方便操作使用,提高安全性,

这么做的好处:

  1. 实现了数据与代码的分离,实现了解耦
  2. 如果需要修改配置信息,直接修改配置文件中的信息就可以了,可以避免重新打包。
  3. 提高安全性

具体代码实现如下:

  1. 首先我先创建一个文件用于存放其连接数据库的配置信息,名为 jdbc.properties 的文件

该文件内容如下:# 表示注释,注意所赋值的内容上不要含有空格和 ; 分号,防止无法识别到。

user=root              # 用户名
password=adc123        # 密码
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8   # url
driverClass=com.mysql.jdbc.Driver      # 注册的Driver 驱动的包路径
# 注意不要所赋予的值在内容上不要加空格和;分号,
public static void main(String[] args) throws ClassNotFoundException, SQLException {// 使用资源绑定器,绑定属性的配置文件.properties 这个配置文件ResourceBundle bundle = ResourceBundle.getBundle("jdbc");String driver = bundle.getString("driverClass"); // Driver类包String url = bundle.getString("url");    // url 数据库在网络上的地址String user = bundle.getString("user");  // user 用户名String password = bundle.getString("password");  // password 密码// 1. 注册驱动(说明你想要连接的是哪个数据库)Class.forName(driver);// 2. 连接数据库Connection connection = DriverManager.getConnection(url,user,password);System.out.println("方式四:"+connection);  // 打印连接上数据库的地址// 3. 获取操作数据库的对象// 4. 通过对象执行SQL语句// 5. 如果第四步是 select 查询结果集的话,需要处理结果集// 6. 关闭资源,一般放在 finally 中(一定会被执行的,无论是否异常)}

或者

public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {// 通过Properties对象获取配置文件(jdbc.properties)的信息Properties properties = new Properties();properties.load(new FileInputStream("src\\jdbc.properties"));String driver = properties.getProperty("driverClass");String url = properties.getProperty("url");String user = properties.getProperty("user");String password = properties.getProperty("password");// 1. 注册驱动(说明你要连接的什么品牌的数据库)Class.forName(driver);// 2. 连接(注册驱动上的)数据库Connection connection = DriverManager.getConnection(url,user,password);System.out.println("方式四:"+connection);// 3. 获取操作数据库的对象// 4. 通过对象执行SQL语句// 5. 如果第四步是 select 查询结果集,则需要处理结果集,不是就不用// 6. 关闭资源,一般放在 finally中(一定会被执行)}

4. 实测:连接数据库进行增删改操作

既然我们已经可以连接上数据库了,那我们就简单的按照 JDBC六步骤初步操作数据库

首先我们先了解一下,我们操作实验的对象,我们连接的是MySQL 数据库中的名为dbtest7数据库 下的 admin 表,如下所示


补充:

获取连接数据库的对象是Statement statement = connection.createStatement(); 这段代码:

其中 Statement 是一个接口,具体如下

connection.createStatement() 方法,作用是获取连接操作数据的对象

statement.executeUpdate() 该方法是执行SQL语句,返回影响数据库的行数


  1. 通过连接数据库(insert)增加一条记录
public static void main(String[] args) throws ClassNotFoundException, SQLException {// 1. 注册驱动(说明连接的什么品牌的数据库)Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/dbtest7?useUnicode=true&characterEncoding=utf8";String user = "root";String password = "adc123";// 2. 连接(驱动上的)数据库Connection connection = DriverManager.getConnection(url,user,password);// 3. 获取操作数据库的对象// Statement 是一个接口,Statement statement = connection.createStatement();// 设置执行的sqL语句插入语句,注意在java中执行sql语句不要加;分号不然报错String sql = "insert admin(id,user_name,pwd) values(3,'王五','qq123')";// 4. 通过对象中的方法执行SQL语句int count = statement.executeUpdate(sql); // 该方法返回影响数据库的行数System.out.println(count == 1 ? "插入成功":"插入失败"); // 因为我们只是插入一行数据,所以只会有一行数据受影响// 5.第四步不是 select 查询结果集,不需要处理结果集,省略// 6. 关闭资源,从小到大statement.close();   // 关闭操作数据库的连接connection.close();  // 关闭数据库连接}


或者: 我们使用另外一种处理 异常的方式: 使用 try{}catch{}finally{}

 public static void main(String[] args){Connection connection = null;  // 扩大作用域,利用关闭资源Statement statement = null;  //try {// 1. 注册驱动(说明连接什么品牌的数据库),通过反射加载Driver类,执行Driver类中的静态代码块(注册驱动)Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/dbtest7?useUnicode=true&characterEncoding=utf8";String user = "root";String password = "abc123";// 2. 连接(驱动上)的数据库connection = DriverManager.getConnection(url,user,password);// 3.获取操作数据库的对象statement = connection.createStatement();// 4. 通过对象的方法执行SQL语句,操作数据库String sql = "insert admin(id,user_name,pwd) values(4,'小王','QQ996')";int count = statement.executeUpdate(sql);System.out.println( count == 1 ? "插入成功" : "插入失败");// 5. 如果第四步是select 查询结果集,则需要处理结果集,这里不是,所以不用} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {// 6.关闭资源,从小到大,一定会被执行,(无论是否异常)if( statement != null) { // 不为空在需要关闭资源,为空不需要try {statement.close();      // 关闭 statement 操作数据库连接} catch (SQLException e) {e.printStackTrace();}}if( connection != null){try {connection.close(); // 关闭 connection 连接上的数据库的资源} catch (SQLException e) {e.printStackTrace();}}}}


  1. 通过连接数据库进行(update)修改操作
public static void main(String[] args) throws ClassNotFoundException, SQLException {// 1. 注册驱动(说明连接的什么品牌的数据库)通过反射加载Driver类,执行Driver类中的静态代码块(注册驱动)Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/dbtest7?useUnicode=true&characterEncoding=utf8";String user = "root";String password = "adb123";// 2. 连接(驱动上的)数据库Connection connection = DriverManager.getConnection(url,user,password);// 3. 获取操作数据库的对象// Statement 是一个接口,Statement statement = connection.createStatement();// 设置执行的sqL语句插入语句,注意在java中执行sql语句不要加;分号不然报错String sql = "update admin set user_name = '老王' where id = 4";// 4. 通过对象中的方法执行SQL语句,操作数据库int count = statement.executeUpdate(sql); // 该方法返回影响数据库的行数System.out.println(count == 1 ? "修改成功":"修改失败"); // 因为我们只是修改了一行数据,所以只会有一行数据受影响// 5.第四步不是 select 查询结果集,不需要处理结果集,省略// 6. 关闭资源,从小到大statement.close();   // 关闭操作数据库的连接connection.close();  // 关闭数据库连接}

或者:

public static void main(String[] args){Connection connection = null;  // 扩大作用域,利用关闭资源Statement statement = null;  //try {// 1. 注册驱动(说明连接什么品牌的数据库),通过反射加载Driver类,执行Driver类中的静态代码块(注册驱动)Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/dbtest7?useUnicode=true&characterEncoding=utf8";String user = "root";String password = "adb123";// 2. 连接(驱动上)的数据库connection = DriverManager.getConnection(url,user,password);// 3.获取操作数据库的对象statement = connection.createStatement();// 4. 通过对象的方法执行SQL语句,操作数据库String sql = "update admin set user_name = '小五' where id = 3";int count = statement.executeUpdate(sql);System.out.println( count == 1 ? "修改成功" : "修改失败");// 5. 如果第四步是select 查询结果集,则需要处理结果集,这里不是,所以不用} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {// 6.关闭资源,从小到大,一定会被执行,(无论是否异常)if( statement != null) { // 不为空在需要关闭资源,为空不需要try {statement.close();      // 关闭 statement 操作数据库连接} catch (SQLException e) {e.printStackTrace();}}if( connection != null){try {connection.close(); // 关闭 connection 连接上的数据库的资源} catch (SQLException e) {e.printStackTrace();}}}}


  1. 通过连接数据库进行 (delete) 删除操作
public static void main(String[] args) throws ClassNotFoundException, SQLException {// 1. 注册驱动(说明连接的什么品牌的数据库)通过反射加载Driver类,执行Driver类中的静态代码块(注册驱动)Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/dbtest7?useUnicode=true&characterEncoding=utf8";String user = "root";String password = "adb123";// 2. 连接(驱动上的)数据库Connection connection = DriverManager.getConnection(url,user,password);// 3. 获取操作数据库的对象// Statement 是一个接口,Statement statement = connection.createStatement();// 设置执行的sqL语句插入语句,注意在java中执行sql语句不要加;分号不然报错String sql = "delete from admin where id = 4";// 4. 通过对象中的方法执行SQL语句,操作数据库int count = statement.executeUpdate(sql); // 该方法返回影响数据库的行数System.out.println(count == 1 ? "删除成功":"删除失败"); // 因为我们只是删除了一行数据,所以只会有一行数据受影响// 5.第四步不是 select 查询结果集,不需要处理结果集,省略// 6. 关闭资源,从小到大statement.close();   // 关闭操作数据库的连接connection.close();  // 关闭数据库连接}

或者

public static void main(String[] args){Connection connection = null;  // 扩大作用域,利用关闭资源Statement statement = null;  //try {// 1. 注册驱动(说明连接什么品牌的数据库),通过反射加载Driver类,执行Driver类中的静态代码块(注册驱动)Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/dbtest7?useUnicode=true&characterEncoding=utf8";String user = "root";String password = "adb123";// 2. 连接(驱动上)的数据库connection = DriverManager.getConnection(url,user,password);// 3.获取操作数据库的对象statement = connection.createStatement();// 4. 通过对象的方法执行SQL语句,操作数据库String sql = "delete from admin where id = 3";int count = statement.executeUpdate(sql);System.out.println( count == 1 ? "删除成功" : "删除失败");// 5. 如果第四步是select 查询结果集,则需要处理结果集,这里不是,所以不用} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {// 6.关闭资源,从小到大,一定会被执行,(无论是否异常)if( statement != null) { // 不为空在需要关闭资源,为空不需要try {statement.close();      // 关闭 statement 操作数据库连接} catch (SQLException e) {e.printStackTrace();}}if( connection != null){try {connection.close(); // 关闭 connection 连接上的数据库的资源} catch (SQLException e) {e.printStackTrace();}}}}


5. 总结:

JDBC 连接的六个步骤:

  1. 注册驱动(说明你要连接的是什么品牌的数据库),常用的方式是:通过反射加载com.mysql.jdbc.Driver类,执行该类中的静态代码块,注册驱动,注意不同包下Driver 是接口还是类
  2. 连接(注册驱动)上的数据库,常用的方式是使用 DriverManager.getConnection 统一替代 Driver 管理数据库,一般将其中的 url (所连接的数据库在网络上的位置),用户名和密码,Driver 包路径,写入到配置文件中,注意 url 中存在一个 JDBC驱动与服务器字符集编码不一致的问题,通过设置配置参数解决
  3. 获取操作数据库的对象, statement = connection.createStatement();
  4. 通过对象执行 SQL语句操作数据库,注意Java执行 SQL语句不要加 ;分号,不然报错
  5. 处理第四步中的 select 查询结果集,没有就不用
  6. 关闭资源,从小到大关闭资源,一般将其放在 finally 中一定会被执行

连接数据库的方式有许多,记住最后后面两种常用的方式就可以了,通过反射加载类,将参数信息写入到配置文件中去。


6. 最后:

限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,后会有期,江湖再见 !!!


JDBC 连接数据库的四种方式相关推荐

  1. jdbc连接数据scanip_JDBC连接数据库的四种方式:DriverManager,DataSource,DBCP,C3P0

    方法1:使用java.sql.DriverManager类 驱动管理器类,用于管理所有注册的驱动程序. (注:DataSource 接口是 JDBC 2.0 API 中的新增内容,它提供了连接到数据源 ...

  2. JDBC驱动程序的四种方式

    Java中的JDBC驱动可以分为四种类型,包括JDBC-ODBC桥.本地API驱动.网络协议驱动和纯JAVA驱动. 第一种驱动程序:JDBC-ODBC 桥 JDBC-ODBC 桥是一个JDBC 驱动, ...

  3. jdbc连接mysql正规方法_JDBC基础篇(MYSQL)——通过JDBC连接数据库的三种方式

    package day01_jdbc; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManage ...

  4. java使用JDBC连接数据库的几种方式

    2019独角兽企业重金招聘Python工程师标准>>> /** * 1 在方法中固化连接参数 * * @return 数据库连接 */ public Connection getCo ...

  5. jdbc Template 介绍和 spring 链接数据源的四种方式

    为什么具体讲template介绍和spring jdbc链接数据源的几种方式放在一起介绍,在于你在使用template的时候,具体配置数据源,或者在链接配置数据源的时候要是使用template,就在在 ...

  6. 【JDBC篇】Java连接数据库的五种方式,及什么是URL?

    目录 URL介绍: 连接数据库的五种方式 方式一: 方式二: 方式三: 方式四: 方式五:(最终版) URL介绍: JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择 ...

  7. java xml 方法_Java读取xml的四种方式

    Java读取xml的四种方式 在平时工作中,难免会遇到把 XML 作为数据存储格式.面对目前种类繁多的解决方案,哪个最适合我们呢?在这篇文章中,我对这四种主流方案做一个不完全评测,仅仅针对遍历 XML ...

  8. java配置文件实现方式_java相关:详解Spring加载Properties配置文件的四种方式

    java相关:详解Spring加载Properties配置文件的四种方式 发布于 2020-4-29| 复制链接 摘记: 一.通过 context:property-placeholder 标签实现配 ...

  9. php 数组存入mysql_PHP将数组存入数据库中的四种方式

    1.implode()和explode()方式 2.print_r()和自定义函数方式 3.serialize()和unserialize()方式 4.json_encode()和json_decod ...

最新文章

  1. Snow White,摘自iOS应用Snow White and more stories
  2. 苹果截屏快捷键_新手小白用苹果电脑搞科研,学会这些才不至于尴尬!
  3. Serverless Devs 2.0 开箱测评:Serverless 开发最佳实践
  4. 宝塔php的opcache模块未载入,宝塔面板CPU负载过高使用opcache扩展的解决方法
  5. 【Python实战】使用python批量生成发票
  6. Eclipse卸载插件SpringSoource-tool-suite
  7. dex2jar java 1.8_利用 dex2jar 反编译 dex文件
  8. 华为2019校招笔试题之处理字符串(python版)
  9. win10代理服务器没有响应解决方案
  10. 看在钱的份上,请你不要忽视算法
  11. java sql 违反协议_java.sql.SQLException: 违反协议异常的一种解释
  12. 软件工程第二次作业(王伟东)
  13. charlesfiddler安卓手机安装系统级ca证书抓取https请求信息
  14. 2007年开关稳压电源设计报告!!!
  15. 震动效果调研 - iOS
  16. 关于aPaaS平台的那些事儿
  17. 用于数据仓库现代化的云原生数据流的案例
  18. SpringBoot启动发生的事件顺序
  19. 少儿编程scratch与AI机器人编程 1小时微课-余强-专题视频课程
  20. 架设虚拟环境下的传真服务器

热门文章

  1. 获取当前时间,并转换为时间戳
  2. 【使用UltraISO修改镜像】
  3. MATLAB 中的机械臂算法——运动学
  4. mac hdmi 不能调整音量_在Mac上玩塞尔达?BMD视频采集卡 Review
  5. easypoi实现导出数据、下载导入模板、导入数据
  6. 维特根斯坦 《逻辑哲学论》、《哲学研究》
  7. C#中为控件添加事件时提示“ dataGridView1_CellValidating”没有与委托“DataGridViewCellEventHandler”匹配的重载
  8. LCD断码屏显示应用框架
  9. 中文编程软件 - 习语言安装与使用入门
  10. 关键路径、工期、总时差和自由时差精讲