首页 > 技术文章 > JDBC和JNDI的区别

wenjiayi 2020-02-27 12:25 原文

1、JDBC和JNDI 的区别:

两者都是API,是一个标准。并不是什么产品或方法。

JDBC :Java Database Connectivity,是由数据库服务商提供的,用于连接数据库的Java API。

使用JDBC带来的问题:

(1)数据库服务器名称 、用户名和口令都可能需要改变,由此引发JDBC URL需要修改;

(2)数据库可能改用别的产品,如改用DB2或者Oracle,引发JDBC驱动程序包和类名需要修改;

(3)随着实际使用终端的增加,原配置的连接池参数可能需要调整;

JNDI:Java Naming and Directory Interface,即Java命名和目录接口。JNDI包含了一些标准API接口,Java程序可以通过这些接口来访问命名目录服务。它提供了一致的模型来存取和操作企业级的资源如DNS和LDAP。JNDI的出现,解决了JDBC带来的诸如:jdbc url更改、驱动程序和连接池参数的更改问题,把这些问题交给J2EE容器来配置和管理,程序员只需要对这些配置和管理进行引用即可。

命名服务:就是将名字和计算机系统内的一个对象建立关联,从而允许应用程序通过该名字访问该对象。简而言之,命名服务就是为计算机系统内的对象起名字。

目录服务:目录服务是命名服务的拓展,目录服务不仅需要保存名称和对象的关联,还要保存对象的各种属性,这样就允许开发者操作对象的属性,包括增删改查对象的属性。在目录服务中,你可以根据属性搜索对象。

2、链接 的区别:

(1)JDBC配置使用:

package com.lenovo.servlet;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Demo1 {
       public static void main(String[] args) {
              // 加载驱动类
              try {
                     Class.forName("com.mysql.jdbc.Driver");
                     Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456");
                     // 1、执行静态SQL语句。通常通过Statement实例实现。
                     // 2、执行动态SQL语句。通常通过PreparedStatement实例实现。
                     // 3、执行数据库存储过程。通常通过CallableStatement实例实现。
                     // String sql = "select * from user where id = ?";
                     String sql = "select * from user where id = ?";
                     PreparedStatement ps = conn.prepareStatement(sql);
                     ps.setInt(1, 1); // 设置参数
                     // 执行语句,获得一个结果集,处理获得的结果
                     ResultSet result = ps.executeQuery();
                     while (result.next()) {
                            System.out.println(result.getInt("id"));
                            System.out.println(result.getString("name"));
                            System.out.println(result.getInt("age"));
                            System.out.println(result.getString("salary"));
                     }
                     // 关闭资源
                     result.close();
                     ps.close();
                     conn.close();
              } catch (ClassNotFoundException e) {
                     e.printStackTrace();
              } catch (SQLException e) {
                     e.printStackTrace();
              }
       }
}

(2)JNDI配置使用:

    添加jar包

    Commons-dbcp.jar

    Commons-pool.jar

    Commons-collections.jar

    在Tomcat/conf/context.xml中配置

<Resource
      name="jdbc/test"
      auth="Container"
      type="javax.sql.DataSource"
      maxActive="100"
      maxIdle="30"
      maxWait="10000"
      username="root"
      password="*****"
      driverClassName="com.mysql.jdbc.Driver"
      url="jdbc:mysql://localhost:3306/test"
 />

    在项目web.xml文件中添加配置
   

<resource-ref>
     <description>DB Connection</description>
     <res-ref-name>jdbc/test</res-ref-name>
     <res-type>javax.sql.DataSource</res-type>
     <res-auth>Container</res-auth>
</resource-ref>

  在代码中连接、使用
 

DataSource ds = null;

    try {

      Context initContext = new InitialContext();

      DataSource ds = (DataSource)initContext.lookup("java:comp/env/jdbc/test");

      out.print(ds);

      } catch (Exception e) {

          e.printStackTrace();

      }

    connect = ds.getConnection();

    ....

总结:JNDI通过在Tomcat服务器的配置文件和项目的web.xml上配置参数,可以灵活、快速地获取数据库配置信息并连接。对比JDBC,当数据库参数、路径等改变时也不需要改变代码,比较灵活简单。

推荐阅读