JNDI——(Java Naming and Directory Interface,Java 命名和目录接口)
概念:是一组在Java 应用中访问命名和目录服务的API。
步骤:
1.拷贝数据库驱动jar包到tomcat/lib
2.修改Tomcat/conf/context.xml文件
...//原有配置
type="javax.sql.DataSource" maxActive="100" maxIdle="30"
maxWait="10000" username="sa" password="sa"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://localhost:1433;DatabaseName=restrant">
注: 的属性
属性
说明
name
指定 Resource 的 JNDI 名字
auth
指定管理 Resource 的 Manager,它有两个可选值:Container 和 Application 。Container 表示由容器来创建 Rsource,Application 表示由Web应用来创建和管理的 Resource
type
指定 Resource 所属的Java 类名
maxActive
指定数据库连接池中处于活动状态的数据库连接的最大数目,取值为 0,表示不受限制
maxIdle
指定数据库连接池中处于空闲状态的数据库连接的最大数目,取值为 0,表示不受限制
maxWait
指定数据库连接池中的数据库连接处于空闲状态的最长时间(以毫秒为单位),超过这一时间将会抛出异常。取值为-1,表示可以无限制等待
username
指定连接数据库的用户名
password
指定连接数据库的口令
driverClassName
指定连接库的 JDBC 驱动程序
url
指定连接数据库的URL
3.修改工程中的web.xml
Restrant DataSource
jdbc/restrant
javax.sql.DataSource
Container
...//其他配置
注:
的属性
description
对象引用资源的说明
res-ref-name
指定所引用资源的 JNDI 名,与 元素中的name属性对应
res-type
指定所引用资源的类名字,与元素中的 type 属性对应
res-auth
指定管理所引用资源的Manager,与元素中的 auth 属性对应
4.创建新的数据库连接管理类:
public abstract class ConnectionManagerJNDI {
// 数据源的JNDI名称
private static final String JNDI = "jdbc/restrant";
// 查找数据源的前缀
private static final String PREFIX = "java:comp/env/";
/** 利用JNDI查找数据源,获得数据库连接方法 */
public static Connection getConnection() {
Connection conn = null;
try {
// 初始化JNDI
Context ctx = new InitialContext();
// 从JNDI中查找一个名字为jdbc/restrant的资源,并向下转型为DataSource类型
// 注意1.名称要和配置文件中完全一致2.一定要写对前缀
DataSource dataSource = (DataSource) ctx.lookup(PREFIX + JNDI);
// 从数据源中获得数据库连接实例
conn = dataSource.getConnection();
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
5.在项目中通过ConnectionManagerJNDI获得数据库连接
示例:
命名空间package com.qingniao.y2t69.zhanghui.common;
数据连接接口类——DAO.java
package com.qingniao.y2t69.zhanghui.common;
import javax.servlet.jsp.jstl.sql.Result;
public interface DAO {
// 查询方法
Result executeQuery();
// 增加、修改、删除方法
boolean executeUpdate();
}
获得Connection类——ConnectionManager.java
package com.qingniao.y2t69.zhanghui.common;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public abstract class ConnectionManagerJNDI {
private static final String JNDI = "jdbc/restrant";
private static final String PREFIX = "java:comp/env/";
public static Connection getConnection() {
Connection conn = null;
try {
Context ctx = new InitialContext();
DataSource dataSource = (DataSource) ctx.lookup(PREFIX + JNDI);
conn = dataSource.getConnection();
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
// 关闭连接
public static void closeAll(Connection con, PreparedStatement pstmt,
Statement stmt, ResultSet rs) {
if (rs != null) {
try {
rs.close();
rs = null;
} catch (SQLException e) {
System.out.println("关闭ResultSet错误!" + e);
}
}
if (pstmt != null) {
try {
pstmt.close();
pstmt = null;
} catch (SQLException e) {
System.out.println("关闭PreparedStatement错误!" + e);
}
}
if (stmt != null) {
try {
stmt.close();
stmt = null;
} catch (SQLException e) {
System.out.println("关闭Statement错误!" + e);
}
}
try {
if (con != null && con.isClosed() == false) {
con.close();
con = null;
}
} catch (SQLException e) {
System.out.println("关闭Connection错误!" + e);
}
}
}
数据库连接实现基础类——BaseDAO.java
package com.qingniao.y2t69.zhanghui.common;
import java.sql.*;
import java.util.*;
import javax.servlet.jsp.jstl.sql.*;
public abstract class BaseDAO implements DAO {
protected PreparedStatement pstmt = null;
protected Statement stmt = null;
protected Result result = null;
protected ResultSet rs = null;
protected Connection con = null;
protected boolean flag = false;
// 定义参数集合属性
private List values;
public void setValues(List values) {
this.values = values;
}
// 定义SQL语句属性
private String sqlValue;
public void setSqlValue(String sqlValue) {
this.sqlValue = sqlValue;
}
// 获得连接
protected Connection getConnection() {
return ConnectionManager.getConnection();
}
// 关闭连接
protected void closeAll(Connection con, PreparedStatement pstmt,
Statement stmt, ResultSet rs) {
ConnectionManager.closeAll(con, pstmt, stmt, rs);
}
// 实现查询
public Result executeQuery() {
try {
con = getConnection();
if (values != null && values.size() > 0) {
pstmt = con.prepareStatement(sqlValue);
setValues(pstmt, values);
rs = pstmt.executeQuery();
} else {
stmt = con.createStatement();
rs = stmt.executeQuery(sqlValue);
}
result = ResultSupport.toResult(rs);
} catch (SQLException e) {
System.out.println("执行executeQuery()错误!" + e);
} finally {
this.closeAll(con, pstmt, stmt, rs);
}
return result;
}
// 执行增加、删除、修改
public boolean executeUpdate() {
flag = false;
int num = 0;
try {
con = getConnection();
if (values != null && values.size() > 0) {
pstmt = con.prepareStatement(sqlValue);
setValues(pstmt, values);
num = pstmt.executeUpdate();
} else {
stmt = con.createStatement();
num = stmt.executeUpdate(sqlValue);
}
if (num > 0) {
flag = true;
}
} catch (SQLException e) {
System.out.println("执行executeUpdate()错误!" + e);
} finally {
this.closeAll(con, pstmt, stmt, rs);
}
return flag;
}
// 参数赋值方法
private void setValues(PreparedStatement pstmt, List values) {
try {
for (int i = 0; i < values.size(); i++) {
Object v = values.get(i);
pstmt.setObject(i + 1, v);
}
} catch (SQLException e) {
System.out.println("执行setValues错误!" + e);
}
}
}