JDBC二:连接方式

JDBC连接的方式

引入

五种方式之间是渐进迭代关系,前4种连接方式有助于理解jdbc连接的实质,实际开发中采用最后一种方式

一、方式一
  1. 通过第三方API中的实现类进行数据库连接
    @Test
        public void testConnection1() throws Exception {
            /*
              1.创建Driver实例对象,为调用连接数据库的方法connect做准备
                java.sql.Driver是接口,需要利用导入的jar包中的Driver类实现该接口
    
                com.mysql.cj.jdbc中Driver类的的源码
                public class Driver extends NonRegisteringDriver implements java.sql.Driver {
            */
            java.sql.Driver driver = new com.mysql.cj.jdbc.Driver();
            
            /*
              2.连接数据库的路径
              url:统一资源定位系统(uniform resource locator)
              jdbc:mysql:协议
              localhost:IP地址
              3306:MySQL默认端口号
              atguigudb:具体的数据库名
            */
            
            String url = "jdbc:mysql://localhost:3306/atguigudb?serverTimezone=UTC&useSSL=false";
            /*
              3.连接数据库的用户名和密码
                用户名和密码封装在Properties中
            */
            Properties info = new Properties();
            info.setProperty("user","root");
            info.setProperty("password","********");
    
            // 4.调用connect方法连接数据库
            Connection conn = driver.connect(url, info);
            // 查看连接情况,输出:com.mysql.cj.jdbc.ConnectionImpl@50a7bc6e
            System.out.println(conn);
        }
    
  2. 存在弊端

    出现了第三方API,影响了Java程序的可移植性,所以不希望出现通过第三方API执行的代码

    解决方法:通过放射,包裹第三方API中的类,可以在实现其功能的同时还可以对其进行动态变更,于是迭代为了方式二

二、方式二
  1. 通过反射的方式进行连接
     @Test
        public void testConnection2() throws Exception {
            // 1.通过反射获取Driver实现类对象
            Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");
            Driver driver = (Driver) clazz.newInstance();
    
            // 2.提供要连接的数据库的路径
            String url = "jdbc:mysql://localhost:3306/atguigudb?serverTimezone=UTC&useSSL=false";
            // 3.提过连接需要的用户名和密码
            Properties info = new Properties();
            info.setProperty("user","root");
            info.setProperty("password","********");
            // 4.获取连接
            Connection conn = driver.connect(url, info);
            System.out.println(conn);
        }
    
  2. 优势

    不出现第三方的API,使程序具有更好的移植性

  3. 实际开发中

    使用的是DriverManager类替代Driver类

三、方式三
  1. 使用DriverManager类替换Driver类
    @Test
        public void testConnection3() throws Exception {
            // 1.通过反射获取Driver实现类对象
            Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");
            Driver driver = (Driver) clazz.newInstance();
            // 2.提供连接所需要的三个基本信息
            String url = "jdbc:mysql://localhost:3306/atguigudb?serverTimezone=UTC&useSSL=false";
            String user = "root";
            String password = "********";
            // 3.注册驱动
            DriverManager.registerDriver(driver);
            // 4.获取连接
            Connection conn = DriverManager.getConnection(url, user, password);
            System.out.println(conn);
        }
    
四、方式四
  1. 对方式三进行优化,只需加载,不需注册
    @Test
        public void testConnection4() throws Exception {
            // 1.提供连接所需要的三个基本信息
            String url = "jdbc:mysql://localhost:3306/atguigudb?serverTimezone=UTC&useSSL=false";
            String user = "root";
            String password = "********";
            /*
              2.仅需利用反射加载第三方jar包下的Driver类
                因为在com.mysql.cj.jdbc.Driver的源码中,存在如下静态代码块
                static {
                    try {
                        java.sql.DriverManager.registerDriver(new Driver());
                    } catch (SQLException E) {
                        throw new RuntimeException("Can't register driver!");
                    }
                }
                故在加载com.mysql.cj.jdbc包下的Driver类时,就自动调用了
                java.sql包下的DriverManager.registerDriver(new Driver())的注册方法
             */
            Class.forName("com.mysql.cj.jdbc.Driver");
            
            // 3.连接数据库
            Connection conn = DriverManager.getConnection(url, user, password);
            System.out.println(conn);
        }
    
  2. 对于连接MySQL,其实第二步也可以省去,原因如下:

    在这里插入图片描述

  3. 实际开发中

    从通过反射加载各类数据库的角度来说,这一步不能省,因为我们不一定连接MySQL数据库

  4. 缺陷

    暴露了很多信息,且达不到数据与程序分离的效果

五、方式五(最终版)
  1. 新建jdbc.properties文件,将连接数据库所需的四个信息存储在配置文件中

    在这里插入图片描述

    新建properties文件的方法见该博文末尾处(Java六十一: Java 集合 - -Map接口),

    注意,properties文件创建在src文件下,并非模块下,因为从后期JavaWEB的角度来说,如果把properties文件加载在模块下,那么在部署到Tomcat服务器时,properties文件就缺失了

  2. 通过加载配置文件的方式进行数据库连接
     @Test
        public void testConnection5() throws Exception {
            // 1.读取配置文件中的四个基本信息
            InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
            Properties ps = new Properties();
            ps.load(is);
    
            String url = ps.getProperty("url");
            String user = ps.getProperty("user");
            String password = ps.getProperty("password");
            String driver = ps.getProperty("driver");
    
            // 2.创建Driver类
            Class.forName(driver);
    
            // 3.连接数据库
            Connection conn = DriverManager.getConnection(url, user, password);
            System.out.println(conn);
        }
    
  3. 优势

    ① 实现了数据与代码的分离,实现了解耦

    ② 程序写完后要部署到Tomcat服务器上时,需要对程序进行打包,如果连接数据库的四个基本信息有一个要变动(比如更换数据库名),那么直接在配置文件修改即可,避免了程序重新打包浪费时间和资源

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

e_nanxu

感恩每一份鼓励-相逢何必曾相识

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值