一文搞懂JDBC和JNDI

本文详细介绍了JDBC和JNDI的概念、使用方法及它们之间的区别。JDBC是Java应用程序开发人员用来访问数据库的标准API,而JNDI不仅用于数据库定位,还管理应用服务器上的所有资源,如网页、文件等。JNDI通过应用服务器配置文件寻找数据库驱动,与JDBC相比,JNDI连接池能承受更高的同时请求数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JDBC概念

1.Java Database Connectivity (JDBC)是一个标准的Java API,它由一组类和接口组成,Java应用程序开发人员使用它来访问数据库和执行SQL语句。

2.JDBC(Java Database Connectivity)是由数据库中间服务商提供的,用于连接数据库的Java API。一组类和接口(对接数据库)。

通俗的讲就是JDBC用来连接数据库和执行SQL语句,但是它最大的特点是通过java程序去找数据库驱动,然后来连接数据库。是java亲自去连数据库。

JDBC使用

// 第一步: 首先注册驱动, 驱动一般只会注册一次
try {
       Class.forName("com.mysql.jdbc.Driver");
    } catch (ClassNotFoundException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
    }
// 第二步:建立连接 Connect, 设置url ,用户名, 密码
   // url格式:JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&…
   // 注意的是url中一定不要加多余的空格,否则会出错, useSSL=false是为了解决身份验证时出现的警告的问题
   // String url = "jdbc:mysql://localhost:3306/test?" + "user=root&password=wsw011152&useUnicode=true&characterEncoding=UTF-8&useSSL=false";
      String url = "jdbc:mysql://localhost:3306/test?useSSL=false";
      String name = "root";
      String psw = "******";
      Connection connect = null;
try {
    connect = DriverManager.getConnection(url, name, psw);
    // connect = DriverManager.getConnection(url);
    } catch (SQLException e) {
            // TODO Auto-generated catch block
      e.printStackTrace();
    }
  // 第三步: 创建一个 Statement ,一般建议使用 PreparedStatement
        // 1、执行静态SQL语句。通常通过Statement实例实现。
        // 2、执行动态SQL语句。通常通过PreparedStatement实例实现。
        // 3、执行数据库存储过程。通常通过CallableStatement实例实现。
        // String sql = "select * from user where id = ?";
        String sql = "select * from user where id = ?";
try {
     PreparedStatement ps = connect.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();
     connect.close();
    } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
    }
  }

JNDI概念

1.JNDI(Java Name Directory Interface,Java命名和目录接口),它不仅仅是进行数据库定位的,它是给当前应用服务器所管理的所有资源一个唯一的标识,包括数据库,网页,文件,连接池等等。

JNDI提供了一种统一的方式,可以用在网络上查找和访问服务。通过指定一个资源名称,该名称对应于数据库或命名服务中的一个记录,同时返回数据库连接建立所必须的信息。

JNDI主要有两部分组成:应用程序编程接口和服务供应商接口。应用程序编程接口提供了Java应用程序访问各种命名和目录服务的功能,服务供应商接口提供了任意一种服务的供应商使用的功能。
2.JNDI(Java Name Directory Interface)是为应用服务器(Tomcat)管理资源所设置的目录样式的唯一标识。(数据库、网页、文档等)

通俗的讲,JNDI不单单是用来连接数据库的,它是通过命名服务来找到数据库并返回数据库连接,当然JNDI还可以管理当前应用服务器上的其他资源,如网页,文件等,它用来连接数据库时和JDBC最大的区别就是它是通过应用服务器配置(如Tomcat)的配置文件context.xml来找数据库驱动的,其次就是JDBC连接能承受的同时请求数太低了,JNDI连接池连接与之相比会好很多。

JNDI使用

1.添加jar包

2.在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"
/>

3.在项目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>

4.在代码中连接、使用

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();
....

总结

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

2.请求资源的主动性不一样。JDBC是通过java程序主动去连接数据库获得连接,而JNDI是通过请求命名服务器返回数据库连接。
3.功能范围不一样。JDBC只能用来做一件事那就是连接数据库,而命名JNDI除了能和JDBC做同样的事以外还能管理当前应用服务器上的其他资源,如网页,文件等
4.请求连接数不通。JNDI连接池数高于JDBC

参考文章:

https://blog.youkuaiyun.com/ibigboy/article/details/84309064

https://www.cnblogs.com/boluofan/p/10850980.html

### JDBC JNDI 的定义 #### Java 数据库连接 (JDBC) Java Database Connectivity (JDBC) 是一个标准的 Java API,用于执行 SQL 语句并访问关系型数据库。该 API 提供了一组类接口,使得开发者能够方便地操作各种类型的数据库管理系统[^5]。 ```java // 使用 JDBC 进行简单查询的例子 String url = "jdbc:mysql://localhost:3306/mydb"; String user = "root"; String password = "password"; try { Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM users"); while(rs.next()){ System.out.println("User ID : "+rs.getInt(1)); System.out.println("Username : "+rs.getString(2)); } } catch(SQLException e){ e.printStackTrace(); } ``` #### Java 命名目录接口 (JNDI) Java Naming and Directory Interface (JNDI) 是一种允许 Java 应用程序查找访问命名对象服务的技术。这不仅限于数据库资源;任何服务都可以被注册到名称空间中并通过统一的方式获取。对于数据库而言,通常会将 `DataSource` 对象绑定至特定的名字以便稍后检索使用[^4]。 ```java // 使用 JNDI 查找 DataSource 并创建连接 Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/MyDB"); Connection conn = null; try{ conn = ds.getConnection(); // 执行数据库操作... }catch(Exception ex){ ex.printStackTrace(); }finally{ if(conn != null){ try{conn.close();}catch(Exception ignore){} } } ``` ### 主要区别 - **用途不同**: JDBC 主要是用来与 RDBMS 进行交互的标准 API,而 JNDI 则是用来定位分布式环境中的资源或组件的一种机制。 - **抽象层次差异**: 当直接利用 JDBC 编程时,程序员需要指定详细的数据库连接字符串其他属性。相比之下,在应用服务器环境中采用 JNDI 来管理数据源,则可以让应用程序更加灵活且易于维护,因为具体的配置细节可以从代码分离出来放到外部配置文件里去处理[^3]. - **适用场景有别**: 如果是在小型项目或是不需要复杂部署的情况下可以直接运用 JDBC 实现基本的数据存取功能。然而在大型企业级应用特别是那些运行在容器内的 Web 或 EJB 组件则更倾向于借助 JNDI 获取预配置好的数据源实例.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Apple_Web

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值