`
lohasle
  • 浏览: 254943 次
社区版块
存档分类
最新评论

JDBC与JNDI

    博客分类:
  • JDBC
阅读更多
自从弄了框架之后,以前的一些东西有点点生疏了。先总结下。

java连接数据库有4中方式
1.JDBC-ODBC桥+ODBC驱动
2.本地API
3.JDBC网络纯JAVA驱动
4.本地协议纯java驱动程序

首先从最早接触到的纯JBDC的那种DAO层写法开始。
一开始是这样写DAO层的数据库连接的。
1
首先从最早接触到的纯JBDC的那种DAO层写法开始。
一开始是这样写DAO层的数据库连接的。


package com.dao;

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

public class BaseDao {
	private static Connection con = null;
	private final static String url = "jdbc:mysql://localhost:3306/test";// 数据库连接名
	private final static String usrName = "root";// 用户名
	final static private String pwd = "lohas";// 密码
	final static  private String driver = "com.mysql.jdbc.Driver";
	public static   Connection getConnection() {
		try {
			Class.forName(driver);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			con = DriverManager.getConnection(url, usrName, pwd);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return con;
	}

	public void closeAll(ResultSet set, PreparedStatement ps, Connection con) {

		try {
			if (set != null) {
				set.close();
			}
			if (ps != null) {
				ps.close();
			}
			if (con != null) {
				con.close();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public int executeSql(String sql, Object[] param) {//执行SQL语句
		Connection con = getConnection();
		PreparedStatement ps = null;
		int count = 0;
		try {
			ps = con.prepareStatement(sql);
			if (param != null) {
				for (int i = 0; i < param.length; i++) {
					ps.setObject(i + 1, param[i]);
				}
			}
			count = ps.executeUpdate();// 执行sql语句
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		closeAll(null, ps, con);
		return count;
	}
	
	public ResultSet querySql(String sql){//查询
		con = getConnection();
		ResultSet set = null;
		PreparedStatement ps = null;
		try {
			ps = con.prepareStatement(sql);
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		 try {
			set = ps.executeQuery(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//closeAll(set, ps, con);
		return set;
	}
	
	public ResultSet querySql(String sql,Object[] str){//查询
		con = getConnection();
		ResultSet set = null;
		PreparedStatement ps = null;
		try {
			ps = con.prepareStatement(sql);
			if (str != null) {
				for (int i = 0; i < str.length; i++) {
					ps.setObject(i + 1, str[i]);
				}
			}
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		 try {
			set = ps.executeQuery();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//closeAll(set, ps, con);
		return set;
	}
	public ResultSet getOneIntence(String sql,Object obj){
		Connection con = getConnection();
		PreparedStatement ps = null;
		ResultSet set = null;
		try {
			ps = con.prepareStatement(sql);

			ps.setObject(1, obj);
			set = ps.executeQuery();// 执行sql语句
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//closeAll(null, ps, con);
		return set;
	}

}

这种写法没有写连接管理类,并且都是硬编码的方式,传统的操作ResultSet PreparedStatement  Connection 这几个接口,方法还是不够通过。



那个时候的JNDI是这样写的

Web.xml
  <resource-ref>

    <res-ref-name> jdbc/JNDI6 </res-ref-name>

    <res-type> javax.sql.DataSource </res-type>

    <res-auth> Container </res-auth>

  </resource-ref>


package com.dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class BaseDao {
	/**
	 * 采用JNDI数据库连接池
	 */
	private static Connection con;

	public static Connection getConnection() {
		/**
		 * 通过JNDI获得连接对象
		 */
		Context ic=null;
		try {
			ic = new InitialContext();
			DataSource source = (DataSource) ic.lookup("java:comp/env/jdbc/JNDI6");
			con = source.getConnection();
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try {
				ic.close();
			} catch (NamingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}return con;
	}
	
	/**
	 * 采用JNDI方式connection 不用关  容器会自动回收
	 * @param set
	 * @param sta
	 */
	public static void closeAll(ResultSet set ,Statement sta){
		if(set!=null){
			try {
				set.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if(sta!=null){
			try {
				sta.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	} 
}

再后来有了配置文件,读取配置文件的代码如下:

url = jdbc:mysql://localhost:3306/shopdb
usrName = admin
pwd = admin
driver = com.mysql.jdbc.Driver


package com.Properties;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class Env extends Properties {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private static Env instance;

	public static Env getInstance() {
		if (instance != null) {
			return instance;
		} else {
			mackInstance();
			return instance;
		}
	}

	private static synchronized void mackInstance() {
		// TODO Auto-generated method stub
		if (instance == null) {
			instance = new Env();
		}
	}

	private Env() {
		/**
		 * 从输入流中读取属性列表(键和元素对)。输入流按 load(Reader) 中所指定的、简单的面向行的格式,并假定使用 ISO 8859-1
		 * 字符编码;即每个字节都是 Latin1 字符。对于非 Latin1 的字符和某些特殊字符,可以使用 Unicode
		 * 转义以键和元素的形式来表示它们。
		 */
		InputStream in = this.getClass().getResourceAsStream("/db.properties");
		try {
			load(in);// 父类方法
			in.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}



package com.dao;

import com.Properties.Env;

public class TestProperties {
	public static void main(String[] args) {
		String name = Env.getInstance().getProperty("url");//读取配置文件
		System.out.println(name);
	}
}



再后来
package com.oh.util;

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

import javax.servlet.jsp.jstl.sql.Result;
import javax.servlet.jsp.jstl.sql.ResultSupport;

public class SqlCommentBean {
	/**
	 * 操纵数据库工具类
	 */
	private Connection connection = ConnectionManager.getConnection();// 连接类
	private String sql;// sql语句
	private Object[] sqlParams;// sql语句参数数组

	public SqlCommentBean(String sql, Object[] sqlParams) {
		/**
		 * 带有sql参数构造器
		 */
		super();
		this.sql = sql;
		this.sqlParams = sqlParams;
	}

	public SqlCommentBean(String sql) {
		/**
		 * 不带有sql参数构造器
		 */
		super();
		this.sql = sql;
	}
	/**
	 * 执行查询
	 */
	public Result executeQuery() {
		Result result = null;
		ResultSet set = null;
		PreparedStatement ps = null;
		try {
			ps = connection.prepareStatement(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if (sqlParams != null && sqlParams.length > 0) {
			try {
				setSqlParams(ps, sqlParams);
				set = ps.executeQuery();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		} else {
			try {
				set = ps.executeQuery();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		result = ResultSupport.toResult(set);// 将resultset转化为result
		ConnectionManager.closeAll(ps, set);
		return result;
	}

	/**
	 * 执行增删改
	 * 
	 * @return
	 */
	public int executeUpdate() {
		PreparedStatement ps = null;
		int rows = 0;
		try {
			ps = connection.prepareStatement(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if (sqlParams != null && sqlParams.length > 0) {
			try {
				setSqlParams(ps, sqlParams);
				rows = ps.executeUpdate();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		} else {
			try {
				rows = ps.executeUpdate();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		try {
			ps.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return rows;

	}

	/**
	 * 设置sql语句
	 * 
	 * @param sql
	 */
	public void setSql(String sql) {
		this.sql = sql;
	}

	/**
	 * 设置sql语句参数 内部方法
	 * 
	 * @param sqlParams
	 */
	private void setSqlParams(PreparedStatement ps, Object[] sqlParams) {
		if (sqlParams != null) {
			for (int i = 0; i < sqlParams.length; i++) {
				try {
					ps.setObject(i + 1, sqlParams[i]);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	
	
	private void setDarkSqlParams(PreparedStatement ps, Object[] sqlParams){
		/**
		 * 设置模糊参数
		 */
		if (sqlParams != null) {
			for (int i = 0; i < sqlParams.length; i++) {
				try {
					if(sqlParams[i] instanceof Integer){//如果是具体的数值类型
						ps.setObject(i + 1, sqlParams[i]);
					}else{
						if(!"".equals(sqlParams[i])){
						ps.setObject(i + 1, "%"+sqlParams[i]+"%");
						}
					}
					
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	public  Result darkQuery(){
		/**
		 * 执行模糊查询
		 */
		Result result = null;
		ResultSet set = null;
		PreparedStatement ps = null;
		try {
			ps = connection.prepareStatement(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if (sqlParams != null && sqlParams.length > 0) {
			try {
				setDarkSqlParams(ps, sqlParams);
				set = ps.executeQuery();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		} else {
			try {
				set = ps.executeQuery();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		result = ResultSupport.toResult(set);// 将resultset转化为result
		ConnectionManager.closeAll(ps, set);
		return result;
	}
}



分享到:
评论

相关推荐

    Java通用Dao包括JDBC和JNDI两种连接方式

    在Java中,实现通用DAO通常涉及到JDBC(Java Database Connectivity)和JNDI(Java Naming and Directory Interface)两种不同的数据库连接方式。 首先,让我们来详细了解一下JDBC。JDBC是Java中用于与关系型数据库...

    JDBC,JNDI和servlet小例子

    在IT行业中,JDBC(Java Database Connectivity)、JNDI(Java Naming and Directory Interface)和Servlet是Java Web开发中的三大核心技术,它们各自承担着不同的职责,共同构建了强大的Web应用程序。 首先,JDBC...

    JDBC (c3p0、dbcp、jndi及不使用连接池)代码

    Java Database Connectivity(JDBC)是Java编程语言与各种数据库交互的标准接口。JDBC允许开发者用Java编写数据库应用程序,无论数据库管理系统(DBMS)是何种类型。本篇将详细讲解使用JDBC进行数据库操作的不同方法,...

    servlet学习笔记_JNDI.doc

    2. **JDBC与JNDI的结合**: - JDBC可以利用JNDI来访问关系数据库。 - 通过配置JNDI数据源,可以简化数据库连接管理,提高应用的可移植性和灵活性。 #### 三、JNDI的实现 JNDI提供了访问不同命名和目录服务的统一...

    jdbc3.0doc.zip_java jdbc

    8. **JDBC与JNDI集成**:通过Java Naming and Directory Interface (JNDI),可以轻松地查找和注册DataSource,进一步增强了应用程序的可移植性和可扩展性。 "www.pudn.com.txt"可能是一个网站链接或介绍文件,可能...

    JDBC and ODBC

    JDBC的主要功能包括与数据库建立连接、发送SQL语句以及处理数据库返回的结果。 #### JDBC的主要功能 1. **建立数据库连接**:JDBC允许Java程序通过标准的接口与数据库建立连接,这为开发者提供了极大的便利。 2. *...

    JDBC所有包

    在Java应用服务器环境中,JDBC与JNDI(Java Naming and Directory Interface)结合使用,通过数据源来获取数据库连接,提高了系统的可扩展性和性能。 在你提供的压缩包文件"JDBC.jar"中,可能包含了一些实现JDBC...

    用jndi操作数据库小实例

    在Java EE环境中,JNDI通常与应用服务器集成,允许应用通过名字查找预配置的资源,如数据源。 数据源(DataSource)是JDBC的一个接口,它负责管理数据库连接。使用数据源的好处包括连接池管理、事务支持和自动关闭...

    Java Jndi数据连接池,sql2000或者sql2005数据库

    首先配置Tomcat服务器文件 ... &lt;Resource name="jdbc/jndidemo" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="sa" password="1" driverClassName=...

    jdbc连接数据库(jndi连接池)

    "jdbc连接数据库(jndi连接池)"这个主题涉及了几个关键的技术概念,包括Java Database Connectivity (JDBC),Java Naming and Directory Interface (JNDI)以及连接池技术。下面将详细阐述这些知识点。 1. JDBC:...

    在Weblogic9.2里添加JDBC连接,并用JNDI名称进行调用

    - 确保JDBC驱动与数据库版本兼容。 - 配置数据源时,避免使用硬编码的数据库连接信息,以提高应用的可移植性和安全性。 - 根据应用需求调整连接池参数,防止资源耗尽。 - 关注数据源的监控和日志,以便于故障...

    ssm+maven+jndi+jdbc

    在这个项目中,结合了Maven进行依赖管理,并且使用了JNDI(Java Naming and Directory Interface)和JDBC(Java Database Connectivity)来处理数据库连接。 Spring框架是这个项目的核心,版本为5.0.4。Spring 5.0...

    Jndi数据连接池Jndi 数据连 接池

    本文主要介绍在基于Java的Web应用中,如何通过JNDI(Java Naming and Directory Interface)实现数据连接池的配置与使用,进而提高选课系统的性能。通过这种方式,可以有效地管理数据库连接资源,减少资源浪费,提高...

    Tomcat中JNDI原理

    #### 二、JNDI与Tomcat ##### 2.1 JNDI概述 JNDI提供了一种查找和定位应用程序所用资源的标准化方式,这些资源包括数据库连接、消息队列、EJBs、对象引用等。JNDI的核心概念包括: - **命名**:使用名字来标识...

    JAVA面试题120道

    8. **JDBC与JNDI**:JDBC是Java数据库连接,用于与各种数据库交互;JNDI(Java Naming and Directory Interface)则是用于查找和管理命名和目录服务的接口。 这些知识点涵盖了Java面试中的基础和进阶内容,理解并能...

    J2EE软件工程师全部培训课程总结

    - **JNDI集成**:掌握JDBC与JNDI的集成,实现资源定位和管理。 #### 四、Hibernate:对象关系映射工具 - **Hibernate简介**:理解Hibernate的工作原理和优势。 - **持久化对象操作**:掌握Hibernate中持久化对象的...

    JSP网络开发技术与整合应用

    - 数据库连接管理:JDBC与JNDI,以及连接池的使用。 - 使用JSP与Servlet配合处理HTTP请求和响应。 - 集成EJB(Enterprise JavaBeans)进行企业级开发。 - 与Ajax、JavaScript、jQuery等前端技术的交互。 9. **...

    J2EE基础课件

    JDBC与JNDI** JDBC(Java Database Connectivity)是Java访问数据库的标准API,用于执行SQL语句和管理数据库连接。JNDI(Java Naming and Directory Interface)则是Java中的命名和目录服务,用于查找和管理应用...

Global site tag (gtag.js) - Google Analytics