zoukankan      html  css  js  c++  java
  • Java开发笔记(一百四十六)JDBC的应用原理

    关系数据库使得海量信息的管理成为现实,但各家数据库提供的编程接口不尽相同,就连SQL语法也有所差异,像Oracle、MySQL、SQL Server都拥有自己的开发规则,倘若Java针对每个数据库单独做一套方法,这些数据库操作方法将变得又庞大又冗余。为了解决不同数据库各自为政的问题,Java设计了统一的JDBC规范,只要程序员按照JDBC的方法操作,那么不管什么数据库都能在JDBC框架下正常处理。
    JDBC全称“Java DataBase Connectivity”,意思是Java语言的数据库连接管理。JDBC由JDK内部的数据库管理工具类组成,它提供了标准的数据库操作方法,帮助程序员使用统一的方式开展数据库编程,从而提高了数据库编程的开发效率。然而因为JDBC屏蔽了相关的内部细节,所以在操作具体数据库之前,需要额外引入对应的数据库连接器,也就是导入该数据库的jar包。
    以MySQL为例,它的Java版本连接器可前往官网下载,下载页面是https://dev.mysql.com/downloads/connector/j/,在该页面的下方选择操作系统“Platform Independent”之后,会显示两种压缩包(tar.gz格式与zip格式),在其中一种的右边单击Download按钮开始下载。下载完毕将文件解压,找到里面的Java连接器如mysql-connector-java-8.0.16.jar,把jar文件添加到Java工程的依赖库,之后即可在Java代码中操作MySQL数据库了。
    对于每个数据库来说,JDBC都要求提供下列四个要素:
    1、数据库的驱动:要连接哪种数据库,Oracle还是MySQL,这得通过驱动名称来区分。MySQL的驱动类型是com.mysql.cj.jdbc.Driver。
    2、数据库的连接地址:如同http地址那样,数据库也有入口的访问地址,该地址包含协议、IP、端口、数据库实例等信息。就MySQL而言,它的连接地址格式形如“jdbc:mysql://IP地址:端口号/数据库实例名称”,注意新版的MySQL还需在地址后面补充时区信息,否则运行会报错。下面是一个完整的MySQL连接地址例子:

        jdbc:mysql://localhost:3306/study?serverTimezone=GMT%2B8
    

    3、数据库的用户名:登录数据库时候的用户名称,不同用户拥有不同的权限。
    4、数据库的密码:与用户名对应的密码,登录之时会校验用户名与密码是否正确。
    只有正确提供上述四个要素,方能通过JDBC连接指定的数据库。完整的连接过程分成两个步骤:加载数据库驱动、根据用户名和密码连接数据库,分别介绍如下:
    1、加载数据库驱动
    由于数据库的驱动以字符串展现,因此必须借助于反射技术加载驱动,加载数据库驱动的代码示例如下:

    		String driver_class = "com.mysql.cj.jdbc.Driver"; // 数据库的驱动类
    		try {
    			Class.forName(driver_class); // 加载数据库的驱动(包含初始化动作)
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    

    正常情况下,程序只要在运行时加载一次驱动,加载动作本身包含了初始化操作,后续就不必重复加载驱动了。

    2、根据用户名和密码连接数据库
    连接数据库的本质是获取该数据库的可用连接,调用DriverManager管理类的getConnection方法,输入连接地址、用户名、密码三个参数,校验通过即可获得当前的数据库连接,也就是Connection对象。获取数据库连接的代码例子如下所示:

    		// 数据库的连接地址。MySQL需要在地址后面添加时区,否则会报错
    		String dbUrl = "jdbc:mysql://localhost:3306/study?serverTimezone=GMT%2B8";
    		String dbUserName = "root"; // 数据库的用户名
    		String dbPassword = "222@@@wwwWWW"; // 数据库的密码
    		try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) {
    			// 此处省略了详细的数据库操作代码
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    

    上面代码之所以将Connection对象的赋值动作放到try的圆括号内部,是因为Connection类实现了AutoCloseable接口,意味着只要把它放入try语句,那么无论是否发生异常,系统都会自动调用close方法关闭数据库连接。除了close方法,Connection还提供了下面几个方法:

    isClosed:获取数据库的连接状态,返回true表示连接已关闭,返回false表示连接未关闭。
    getCatalog:获取该连接的数据库实例名称。
    getAutoCommit: 获取数据库的自动提交标志。如果该标志设置为true,则每次执行一条SQL语句,系统都会自动提交该语句的修改内容。
    setAutoCommit:设置自动提交的标志,默认为true表示自动提交。
    commit:提交数据库的修改。
    rollback:回滚数据库的修改。注意要先关闭自动提交,才能通过rollback方法回滚事务。否则报错“Can't call rollback when autocommit=true”。
    createStatement:创建数据库操作的执行报告。
    prepareStatement:创建数据库操作的预备报告。
    接下来把以上两个连接步骤串起来,形成以下的数据库连接代码:

    		String driver_class = "com.mysql.cj.jdbc.Driver"; // 数据库的驱动类
    		// 数据库的连接地址。MySQL需要在地址后面添加时区,否则会报错
    		String dbUrl = "jdbc:mysql://localhost:3306/study?serverTimezone=GMT%2B8";
    		String dbUserName = "root"; // 数据库的用户名
    		String dbPassword = "222@@@wwwWWW"; // 数据库的密码
    		try {
    			Class.forName(driver_class); // 加载数据库的驱动(包含初始化动作)
    			// 根据连接地址、用户名、密码来获取数据库的连接
    			try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) {
    				String desc = String.format("数据库%s的连接状态为“%s”,已%s自动提交。", 
    						conn.getCatalog(), // 获取该连接的数据库实例名称
    						conn.isClosed() ? "关闭" : "连上", // 获取数据库的连接状态
    						conn.getAutoCommit() ? "开启" : "关闭" // 获取数据库的自动提交标志
    				);
    				System.out.println(desc);
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    

    运行上面的连接代码,观察到下面的输出日志,由日志可见成功连上了MySQL数据库。

    数据库study的连接状态为“连上”,已开启自动提交。  



    更多Java技术文章参见《Java开发笔记(序)章节目录

  • 相关阅读:
    bzoj3543: [ONTAK2010]Garden
    bzoj千题计划154:bzoj3343: 教主的魔法
    bzoj千题计划153:bzoj2431: [HAOI2009]逆序对数列
    bzoj千题计划152:bzoj3405: [Usaco2009 Open]Grazing2 移动牛棚
    bzoj1131: [POI2008]Sta
    Codeforces Round #204 (Div. 1) B. Jeff and Furik
    Codeforces Round #204 (Div. 1) A. Jeff and Rounding
    Codeforces Round #204 (Div. 1) D. Jeff and Removing Periods
    bzoj2738: 矩阵乘法
    bzoj2527: [Poi2011]Meteors
  • 原文地址:https://www.cnblogs.com/pinlantu/p/11461120.html
Copyright © 2011-2022 走看看