封装数据库操作

今天在一本书上面看到了一个封装数据库操作的辅助类,封装了获得数据库的连接、关闭数据库的连接、执行SQLINSERT/UPDATE/DELETE/SELECT 语句的方法。

  代码如下:


/**

*

*/

package com.sotaof.struts.db.utils;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.sql.Statement;

import java.text.DateFormat;

import java.util.ArrayList;

import java.util.Date;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.logging.Logger;

import javax.naming.InitialContext;

import javax.sql.DataSource;

/**

* @Title: DbUtils.java

* @Package com.sotaof.struts.db.utils

* @Description: TODO

* @author A18ccms A18ccms_gmail_com

* @date 2013-2-4 下午06:30:36

* @version V1.0

*/

public class DbUtils {

private static Logger logger = Logger.getLogger("DbUtils");

public static int execute(String sql, List<Object> paramList) throws Exception

{

if(sql == null || sql.trim().equals(""))

{

logger.info("parameter is valid!");

}

Connection conn = null;

PreparedStatement pstmt = null;

int result = 0;

try

{

conn = DbUtils.getConnection();

pstmt = DbUtils.getPreparedStatement(conn, sql);

setPreparedStatementParam(pstmt, paramList);

if(pstmt == null)

{

return -1;

}

result = pstmt.executeUpdate();

}

catch(Exception e)

{

logger.info(e.getMessage());

throw new Exception(e);

}

finally

{

closeStatement(pstmt);

closeConn(conn);

}

return result;

}


public static Connection getConnection() throws Exception

{

InitialContext cxt = new InitialContext();

if(cxt == null)

{

throw new Exception("no context!");

}

DataSource ds = (DataSource) cxt.lookup("java:/comp/env/jdbc/orcl");

if(ds == null)

{

throw new Exception("Data source not found!");

}

return ds.getConnection();

}

public static PreparedStatement getPreparedStatement(Connection conn, String sql) throws Exception

{

if(conn == null || sql == null || sql.trim().equals(""))

{

return null;

}

PreparedStatement pstmt = conn.prepareStatement(sql.trim());

return pstmt;

}

public static void setPreparedStatementParam(PreparedStatement pstmt, List<Object> paramList) throws Exception

{

if(pstmt == null || paramList == null || paramList.isEmpty())

{

return;

}

DateFormat df = DateFormat.getDateTimeInstance();

for(int i = 0; i < paramList.size(); i++)

{

if(paramList.get(i) instanceof Integer)

{

int paramValue = ((Integer) paramList.get(i)).intValue();

pstmt.setInt(i + 1, paramValue);

}

else if(paramList.get(i) instanceof Float)

{

float paramValue = ((Float) paramList.get(i)).floatValue();

pstmt.setFloat(i + 1, paramValue);

}

else if(paramList.get(i) instanceof Double)

{

double paramValue = ((Double) paramList.get(i)).doubleValue();

pstmt.setDouble(i + 1, paramValue);

}

else if(paramList.get(i) instanceof Date)

{

pstmt.setString(i + 1, df.format((Date)paramList.get(i)));

}

else if(paramList.get(i) instanceof Long)

{

long paramValue = ((Long)paramList.get(i)).longValue();

pstmt.setLong(i + 1, paramValue);

}

else if(paramList.get(i) instanceof String)

{

pstmt.setString(i + 1, (String)paramList.get(i));

}

}

return;

}

private static void closeConn(Connection conn)

{

if(conn == null)

{

return;

}

try

{

conn.close();

}

catch(SQLException e)

{

logger.info(e.getMessage());

}

}

private static void closeStatement(Statement stmt)

{

if(stmt == null)

{

return;

}

try

{

stmt.close();

}

catch(SQLException e)

{

logger.info(e.getMessage());

}

}

private static void closeResultSet(ResultSet rs)

{

if(rs == null)

{

return;

}

try

{

rs.close();

}

catch(SQLException e)

{

logger.info(e.getMessage());

}

}

private static ResultSet getResultSet(PreparedStatement pstmt) throws Exception

{

if(pstmt == null)

{

return null;

}

ResultSet rs = pstmt.executeQuery();

return rs;

}

public static List<Map<String,String>> getQueryList(String sql, List<Object> paramList) throws Exception

{

if(sql == null || sql.trim().equals(""))

{

logger.info("parameter is valid!");

return null;

}

Connection conn = null;

PreparedStatement pstmt = null;

ResultSet rs = null;

List<Map<String,String>> queryList = null;

try

{

conn = DbUtils.getConnection();

pstmt = DbUtils.getPreparedStatement(conn, sql);

setPreparedStatementParam(pstmt, paramList);

if(pstmt == null)

{

return null;

}

rs = DbUtils.getResultSet(pstmt);

queryList = DbUtils.getQueryList(rs);

}

catch(Exception e)

{

logger.info(e.getMessage());

throw new Exception();

}

finally

{

closeResultSet(rs);

closeStatement(pstmt);

closeConn(conn);

}

return queryList;

}

private static List<Map<String,String>> getQueryList(ResultSet rs) throws Exception

{

if(rs == null)

{

return null;

}

ResultSetMetaData rsMetaData = rs.getMetaData();

int columnCount = rsMetaData.getColumnCount();

List<Map<String,String>> dataList = new ArrayList<Map<String,String>>();

while(rs.next())

{

Map<String,String> dataMap = new HashMap<String,String>();

for(int i = 0; i < columnCount; i++)

{

dataMap.put(rsMetaData.getColumnName(i+1), rs.getString(i+1));

}

dataList.add(dataMap);

}

return dataList;

}

}

  不过我认为这种方法虽然封装性比较好,也比较好管理,但是当出现异常时,对于错误的查找非常的麻烦,所以我个人很少使用这样的方法,不过如果这样的数据库麻烦,那么就用Hibernate框架吧(如果你的数据库够强大的话)。

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-07 19:20:56

封装数据库操作的相关文章

教您使用XML封装数据库操作语句的实现

xml|封装|数据|数据库|语句 在项目开发的过程当中,项目组开发成员的编程风格差异和数据库操作语句SQL的灵活性给项目组带来了越来越多的操作和维护难度. 比如: 从user表中取出所有数据,有的人会写成"select * from user",有的人会写成"select all from user",虽然在操作中不会有任何的错误,但在其他人读程序的过程时就会产生不好的感觉. 如果这种程序差异在项目中的数量级很多,那么在开发的过程当中程序就会出现各种各样的风格,在维

使用XML封装数据库操作语句的实现

xml|封装|数据|数据库|语句 在项目开发的过程当中,项目组开发成员的编程风格差异和数据库操作语句SQL的灵活性给项目组带来了越来越多的操作和维护难度.比如:从user表中取出所有数据,有的人会写成"select * from user",有的人会写成"select all from user",虽然在操作中不会有任何的错误,但在其他人读程序的过程时就会产生不好的感觉.如果这种程序差异在项目中的数量级很多,那么在开发的过程当中程序就会出现各种各样的风格,在维护的过

使用组件封装数据库操作(二)

封装|数据|数据库|组件封装 使用组件封装数据库操作(二)前段日子发表的文章,数据库的连接代码可以直接在ASP文件中显示出来.这次又进行了一次封装. 打开vb,新建Activex控件,工程名称为WebDb,类模块名称为GetInfomation 引用"Microsoft Activex Data Object 2.6 Library " Private Conn As ADODB.Connection Private Rs As ADODB.Recordset '作用:判断数据库是否正

PHP封装数据库操作类(链接数据库)

有面向对象技术基础的编程人员看一天就可以写起来了.而PHP在访问数据库的时候又经常会出现各种问题,如字符编码问题.SQL语法错误问题.PHP处理数据记录对象和返回对象的问题等.我这里写了一个数据库操作类,封装了数据库增删添改等操作,很方便使用.用这个类,可以加速网站的后台开发. 优点: 1.方便快捷, 数据库操作只需调用接口; 2.统一编码(utf8),不易导致乱码 3.结构清晰. 如处理前端请求的后台程序(test.php) + 表封装类(user.class.php) + 数据库封装类(db

使用组件封装数据库操作(一)

其实,大家在书写asp程序时,最担心的可能就是数据库的连接信息,会被一些人看到,进行一些破坏.下面我们用vb6.0来做一个动态链接库(.dll)来隐藏数据库的连接信息. 启动vb6.0,新建-->Active  dll工程.单击"工程"-->引用,选择"microsoft  active  server  pages  object  library" 和"microsoft  activeX  data  objects  2.1  libr

将数据库操作封装到Javabean

封装|数据|数据库 封装数据库操作,目的就是为了隐藏java.sql包内的类,在编码中去掉核心的数据库操作代码.以杜绝直接数据库操作容易带来的资源未释放问题.同时也减少了数据库操作的编码量. 但是很多网友在封装时,却喜欢返回结果集(ResultSet对象),那么这个封装就没有意义了.1. 又是直接操作核心数据库类,跟封装前几乎没什么变化.2. 结果集总是依赖于它使用的连接(Connection)对象.因此当连接对象在方法内被关闭后,你返回的ResultSet就没有用了. 如果真的要获得查询数据库

强烈推荐:SQL Server数据库操作实用技巧锦集

server|sql|技巧|数据|数据库 本文主要概括安装时提示有挂起的操作.收缩数据库.压缩数据库.转移数据库给新用户以已存在用户权限.检查备份集.修复数据库等操作技巧. 1.挂起操作 在安装SQL或SP补丁的时候系统提示之前有挂起的安装操作,要求重启,这里往往重启无用,解决办法: 到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager删除PendingFileRenameOperations. 2.收缩数据库

如何使用php实现封装数据库的类文件

 <?php class dbname{ private $localhost; private $root; private $pass; private $db_name; public function __construct($localhost,$root,$pass,$db_name){ $this->localhost=$localhost; $this->root=$root; $this->pass=$pass; $this->db_name=$db_nam

phalapi-入门篇5(数据库操作和Model层)

phalapi-入门篇5(数据库操作和Model层) 前言 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架. 本小节主要讲解基于notorm的数据库操作以及使用Model层进行快速的数据层的开发,请确保装有PDO拓展. 附上: 官网地址:http://www.phalapi.net/ 开源中国Git地址:http://git.oschina.net/dogstar/PhalApi/tree/release 1. 基于PDO的notorm进行的数据库操作