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,当数据库参数、路径等改变时也不需要改变代码,比较灵活简单。