自从弄了框架之后,以前的一些东西有点点生疏了。先总结下。
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(Java Database Connectivity)和JNDI(Java Naming and Directory Interface)两种不同的数据库连接方式。 首先,让我们来详细了解一下JDBC。JDBC是Java中用于与关系型数据库...
在IT行业中,JDBC(Java Database Connectivity)、JNDI(Java Naming and Directory Interface)和Servlet是Java Web开发中的三大核心技术,它们各自承担着不同的职责,共同构建了强大的Web应用程序。 首先,JDBC...
Java Database Connectivity(JDBC)是Java编程语言与各种数据库交互的标准接口。JDBC允许开发者用Java编写数据库应用程序,无论数据库管理系统(DBMS)是何种类型。本篇将详细讲解使用JDBC进行数据库操作的不同方法,...
2. **JDBC与JNDI的结合**: - JDBC可以利用JNDI来访问关系数据库。 - 通过配置JNDI数据源,可以简化数据库连接管理,提高应用的可移植性和灵活性。 #### 三、JNDI的实现 JNDI提供了访问不同命名和目录服务的统一...
8. **JDBC与JNDI集成**:通过Java Naming and Directory Interface (JNDI),可以轻松地查找和注册DataSource,进一步增强了应用程序的可移植性和可扩展性。 "www.pudn.com.txt"可能是一个网站链接或介绍文件,可能...
JDBC的主要功能包括与数据库建立连接、发送SQL语句以及处理数据库返回的结果。 #### JDBC的主要功能 1. **建立数据库连接**:JDBC允许Java程序通过标准的接口与数据库建立连接,这为开发者提供了极大的便利。 2. *...
在Java应用服务器环境中,JDBC与JNDI(Java Naming and Directory Interface)结合使用,通过数据源来获取数据库连接,提高了系统的可扩展性和性能。 在你提供的压缩包文件"JDBC.jar"中,可能包含了一些实现JDBC...
在Java EE环境中,JNDI通常与应用服务器集成,允许应用通过名字查找预配置的资源,如数据源。 数据源(DataSource)是JDBC的一个接口,它负责管理数据库连接。使用数据源的好处包括连接池管理、事务支持和自动关闭...
首先配置Tomcat服务器文件 ... <Resource name="jdbc/jndidemo" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="sa" password="1" driverClassName=...
"jdbc连接数据库(jndi连接池)"这个主题涉及了几个关键的技术概念,包括Java Database Connectivity (JDBC),Java Naming and Directory Interface (JNDI)以及连接池技术。下面将详细阐述这些知识点。 1. JDBC:...
- 确保JDBC驱动与数据库版本兼容。 - 配置数据源时,避免使用硬编码的数据库连接信息,以提高应用的可移植性和安全性。 - 根据应用需求调整连接池参数,防止资源耗尽。 - 关注数据源的监控和日志,以便于故障...
在这个项目中,结合了Maven进行依赖管理,并且使用了JNDI(Java Naming and Directory Interface)和JDBC(Java Database Connectivity)来处理数据库连接。 Spring框架是这个项目的核心,版本为5.0.4。Spring 5.0...
本文主要介绍在基于Java的Web应用中,如何通过JNDI(Java Naming and Directory Interface)实现数据连接池的配置与使用,进而提高选课系统的性能。通过这种方式,可以有效地管理数据库连接资源,减少资源浪费,提高...
#### 二、JNDI与Tomcat ##### 2.1 JNDI概述 JNDI提供了一种查找和定位应用程序所用资源的标准化方式,这些资源包括数据库连接、消息队列、EJBs、对象引用等。JNDI的核心概念包括: - **命名**:使用名字来标识...
8. **JDBC与JNDI**:JDBC是Java数据库连接,用于与各种数据库交互;JNDI(Java Naming and Directory Interface)则是用于查找和管理命名和目录服务的接口。 这些知识点涵盖了Java面试中的基础和进阶内容,理解并能...
- **JNDI集成**:掌握JDBC与JNDI的集成,实现资源定位和管理。 #### 四、Hibernate:对象关系映射工具 - **Hibernate简介**:理解Hibernate的工作原理和优势。 - **持久化对象操作**:掌握Hibernate中持久化对象的...
- 数据库连接管理:JDBC与JNDI,以及连接池的使用。 - 使用JSP与Servlet配合处理HTTP请求和响应。 - 集成EJB(Enterprise JavaBeans)进行企业级开发。 - 与Ajax、JavaScript、jQuery等前端技术的交互。 9. **...
JDBC与JNDI** JDBC(Java Database Connectivity)是Java访问数据库的标准API,用于执行SQL语句和管理数据库连接。JNDI(Java Naming and Directory Interface)则是Java中的命名和目录服务,用于查找和管理应用...