package com.core.util;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.core.exception.ServiceException;
public final class DBUtil {
private static final Log log = LogFactory.getLog(DBUtil.class);
// 定义一个数据库连接对象
private DBUtil() {}
private static final ThreadLocal<Connection> connection = new ThreadLocal<Connection>();
public static Connection getConnection() {
Connection conn = connection.get();
if(conn == null){
try {
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
conn = DriverManager.getConnection("proxool.DB");
connection.set(conn);
} catch (ClassNotFoundException e) {
log.error("#ERROR# :创建数据库连接发生异常,请检查!", e);
}catch (SQLException e) {
log.error("#ERROR# :创建数据库连接发生异常,请检查!", e);
}
}
return conn;
}
/**
* 执行数据库增、删、改操作.
*
* @param sql
* 待操作的sql字符串
* @return 执行结果所影响的行数,异常则返回-1
* @throws SQLException
* @throws Exception
*/
public static int executeUpdate(String sql){
int exeOk = -1;
Statement stmt = null;
try {
stmt = getConnection().createStatement();
exeOk = stmt.executeUpdate(sql);
} catch (SQLException e) {
log.error("#ERROR# :执行SQL语句出错,请检查!\n" + sql, e);
}finally{
close(stmt);
}
return exeOk;
}
/**
* 执行批处理操作一般用于事务
*
* @param vSqlStr 传入的被操作sql字符串数组
* @return 执行批处理后所影响的行数
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static int[] executeUpdate(List sqlList){
int updateCounts[] = null;
Statement stmt = null;
Connection conn = getConnection();
try {
stmt = conn.createStatement();
conn.setAutoCommit(false);
for (int i = 0; i < sqlList.size(); i++) {
String sql = sqlList.get(i) + "";
stmt.addBatch(sql);
}
updateCounts = stmt.executeBatch();
conn.commit();
conn.setAutoCommit(true);
} catch (SQLException e) {
try {
conn.rollback();
} catch (SQLException e1) {
log.error("#ERROR# :执行数据回滚出错,请检查!", e);
}
log.error("#ERROR# :执行批量SQL语句出错,请检查!", e);
}finally{
close(stmt);
}
return updateCounts;
}
@SuppressWarnings("unchecked")
public static RsList executeQuery(String query){
ResultSet resultSet = null;
ResultSetMetaData metaData = null;
RsList rs = null;
Statement stmt = null;
try {
stmt = getConnection().createStatement();
resultSet = stmt.executeQuery(query);
int colNumber = 0;
LinkedHashMap<String, String> recoMap;
String colName = "";
String colValue = "";
rs = new RsList();
while(resultSet != null && resultSet.next()){
recoMap = new LinkedHashMap<String, String>();
metaData = resultSet.getMetaData();
colNumber = metaData.getColumnCount();
for (int i = 1; i <colNumber+1;i++) {
colName = metaData.getColumnLabel(i)
.toLowerCase();
colValue = resultSet.getString(i);
if(!StringUtil.isBlank(colValue)){
recoMap.put(colName, colValue);
}else{
recoMap.put(colName, "");
}
}
rs.add(recoMap);
}
} catch (SQLException e) {
log.error("#ERROR# :执行SQL语句出错,请检查!\n" + query, e);
} finally {
close(stmt,resultSet);
}
return rs;
}
/**
* 取得数据库服务器的当前日期(年-月-日 时:分:秒)。
* @return 数据库服务器的当前日期,java.sql.Timestamp对象。
*/
public static Timestamp getCurrentTime(){
String sql = "select sysdate as datevalue from dual";
ResultSet rs = null;
Timestamp dtRtn = null;
Statement stmt = null;
try {
stmt = getConnection().createStatement();
rs = stmt.executeQuery(sql);
while (rs != null && rs.next()) {
dtRtn = rs.getTimestamp(1);
}
} catch (SQLException e) {
log.error("#ERROR# :执行SQL语句出错,请检查!\n" + sql, e);
} finally {
close(stmt,rs);
}
return dtRtn;
}
/**
* 取得数据库服务器的当前日期(年-月-日)。
*
* @return 数据库服务器的当前日期,java.sql.Date对象。
*/
public static Date getCurrentDate(){
String sql = "select sysdate as datevalue from dual";
ResultSet rs = null;
Date dtRtn = null;
Statement stmt = null;
try {
stmt = getConnection().createStatement();
rs = stmt.executeQuery(sql);
while (rs != null && rs.next()){
dtRtn = rs.getDate(1);
}
} catch (SQLException e) {
log.error("#ERROR# :执行SQL语句出错,请检查!\n" + sql, e);
} finally {
close(stmt,rs);
}
return dtRtn;
}
/**
* 取得某个序列对象的下一个ID。
*
* @param sequence
* 该对象对应数据库中的SEQUENCE的名字。
* @return 该对象的下一个ID,如果失败返回-1。
*/
public static long getNextId(String sql){
ResultSet rs = null;
long nextId = 1;
Statement stmt = null;
try {
stmt = getConnection().createStatement();
rs = stmt.executeQuery("select " + sql
+ ".nextval as id from dual");
while(rs != null && rs.next()) {
nextId = rs.getLong(1);
}
} catch (SQLException e) {
log.error("#ERROR# :执行SQL语句出错,请检查!\n" + sql, e);
} finally {
close(stmt,rs);
}
return nextId;
}
/**
* 获取结果集的记录段(用于分页)
* @param query 查询字符串
* @param rowCount 总记录数
* @param currPage 当前页码
* @param pageSize 每页记录数
* @return RsList 记录内容列表
* @throws Exception
*/
@SuppressWarnings("unchecked")
protected static RsList executeQuery(String query, int rowCount, int currPage,
int pageSize){
ResultSet resultSet = null;
ResultSetMetaData metaData = null;
Statement stmt = null;
int startPostion =0;
int endPostion =0;
RsList rs = new RsList();
int pageCount = -1;
try {
if (rowCount <= 0)
throw new ServiceException("记录总数小于0");
// 计算总页数
if (pageSize <= 0)
pageSize = 10;
pageCount = (rowCount + pageSize - 1) / pageSize;
// 计算要显示的页码
if (currPage <= 0)
currPage = 1;
if (currPage > pageCount)
currPage = pageCount;
// 定位记录开始索引
if (pageCount > 0){
startPostion = (currPage - 1) * pageSize + 1;
endPostion = (currPage - 1) * pageSize + pageSize;
}else if(pageCount == 0){
startPostion = 1;
endPostion = pageSize;
}
//新加代码
StringBuffer sql = new StringBuffer();
sql.append("select * from ( select row_.*, rownum rownum_ from ( ");
sql.append(query.trim());
sql.append(") row_ where rownum <= ").append(endPostion).append(" ) where rownum_ >= ").append(startPostion);
stmt = getConnection().createStatement();
resultSet = stmt.executeQuery(sql.toString());
int colNumber = 0;
LinkedHashMap<String, String> recoMap;
String colName = "";
String colValue = "";
while(resultSet != null && resultSet.next()){
recoMap = new LinkedHashMap<String, String>();
metaData = resultSet.getMetaData();
colNumber = metaData.getColumnCount();
for (int i = 1; i < colNumber + 1; i++) {
colName = metaData.getColumnLabel(i)
.toLowerCase();
colValue = resultSet.getString(i);
if(!StringUtil.isBlank(colValue)){
recoMap.put(colName, colValue);
}else{
recoMap.put(colName, "");
}
}
rs.add(recoMap);
}
} catch (SQLException e) {
log.error("#ERROR# :执行分页查询出错,请检查!\n", e);
} finally {
close(stmt,resultSet);
}
return rs;
}
/**
* 获得查询总记录数(用于分页)
* @param query 查询字符串
* @return rowCount -1: 无记录
* @throws Exception
*/
@SuppressWarnings("unchecked")
protected static int getRowCount(String query){
ResultSet resultSet = null;
Statement stmt = null;
int rowCount = -1;
try {
//新加代码
StringBuffer sql = new StringBuffer();
sql.append("select count(*) from ( ").append(query.trim()).append(" )");
stmt = getConnection().createStatement();
resultSet = stmt.executeQuery(sql.toString());
while(resultSet != null && resultSet.next())
rowCount = resultSet.getInt(1);
} catch (SQLException e) {
log.error("#ERROR# :执行查询记录总数SQL语句出错,请检查!\n" + query, e);
} finally {
close(stmt,resultSet);
}
return rowCount;
}
/**
* 获取结果集的记录段(用于分页)
* @param query 查询语句
* @param currPage 查询页码
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static List executeQuery(String query,String currPage){
int pageNum = 1;
int rowCount = 0;
List result = new ArrayList();
RsList rs = new RsList();
try {
if(!StringUtil.isBlank(currPage))
pageNum = Integer.valueOf(currPage.trim()).intValue();
rowCount = getRowCount(query);
if(rowCount > 0 ){
rs = executeQuery(query,rowCount,pageNum,GolbalParameter.PAGE_SIZE);
}
}catch (Exception e) {
log.error("#ERROR# :执行SQL语句出错,请检查!\n" + query, e);
}finally{
result.add(rowCount);
result.add(rs);
}
return result;
}
public static void beginTransaction(){
Connection conn = getConnection();
try {
if(conn != null)
conn.setAutoCommit(false);
} catch (SQLException e) {
log.error("#ERROR# :执行开启事务出错,请检查!\n", e);
}
}
public static void commitTransaction(){
Connection conn = connection.get();
try {
if(conn != null){
conn.commit();
conn.setAutoCommit(true);
}
} catch (SQLException e) {
log.error("#ERROR# :执行提交事务出错,请检查!\n", e);
}
}
public static void rollbackTransaction(){
Connection conn = connection.get();
try {
if(conn != null)
conn.rollback();
} catch (SQLException e) {
log.error("#ERROR# :执行回滚事务出错,请检查!\n", e);
}
}
/**
* 关闭数据操作对象ResultSet
*
* @param rs 数据结果集对象
*/
public static void close(ResultSet rs){
if (rs != null){
try {
rs.close();
} catch (SQLException e) {
log.error("#ERROR# :关闭ResultSet发生异常,请检查!\n", e);
}
rs = null;
}
}
protected static void close(Statement stmt){
if (stmt != null){
try {
stmt.close();
} catch (SQLException e) {
log.error("#ERROR# :关闭Statement发生异常,请检查!\n", e);
}
stmt = null;
}
}
/**
* 关闭数据操作对象Statement、ResultSet
*
* @param stmt
* @param rs 数据结果集对象
*/
protected static void close(Statement stmt, ResultSet rs) {
if (rs != null){
try {
rs.close();
} catch (SQLException e) {
log.error("#ERROR# :关闭ResultSet发生异常,请检查!\n", e);
}
rs = null;
}
if (stmt != null){
try {
stmt.close();
} catch (SQLException e) {
log.error("#ERROR# :关闭Statement发生异常,请检查!\n", e);
}
stmt = null;
}
}
/**
* 关闭数据库连接对象Connection释放资源
*/
public static void close(){
Connection conn = connection.get();
connection.set(null);
if (conn != null){
try {
conn.close();
} catch (SQLException e){
log.error("#ERROR# :关闭数据库连接发生异常,请检查!\n", e);
}
conn = null;
}
}
}
分享到:
相关推荐
- **概念理解**:首先需要理解Hibernate的基本概念,包括Session、SessionFactory、Transaction等核心组件的作用。 - **环境搭建**:配置开发环境,包括安装必要的库文件(如Hibernate核心库、数据库驱动等),以及...
- 配置Hibernate Session Factory,以便在应用程序中创建和管理Hibernate会话。 ```xml <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> ...
- **使用DbUtils等工具简化JDBC**:为了简化这些操作,出现了像DbUtils这样的工具,它们提供了一些辅助类来简化JDBC的操作。例如,在上面的部分内容中展示了使用DbUtils实现基本的增删查改操作的例子。 尽管这些...
Hibernate) or direct hibernate session2014七夕献礼,庆祝自己向证明注孤生迈出了更加坚实的一步Authorzoowii()Features底层基于JPA或者Hibernate的Session/SessionFactory,基于HQL/SQL,比自己再轮一个类HQL稳定...
在项目中配置 Hibernate,包括数据库连接信息、实体类的映射文件(通常为 XML 或注解形式),然后就可以通过 Hibernate 提供的 Session 接口进行数据操作,如 CRUD(创建、读取、更新、删除)操作。 总之,...
包括hibernate框架项目搭建编写;优化登录实现;一个完整的自动登录的实现,主要技术MD5加密、cookie和session判断;dbutils框架项目,旨在了解dbutils的各种内幕;文件上传下载项目等等。。这里不再细说了,感兴趣...
try (SqlSession session = DBUtils.getSession()) { MyMapper mapper = session.getMapper(MyMapper.class); List<MyEntity> entities = mapper.selectAll(); for (MyEntity entity : entities) { System.out....
18.3 关于hibernate框架中一些通用类 18.4 实现hibernate分页系统前期准备 18.5 关于hibernate分页系统的具体实现 18.6 关于hibernate分页系统的表示层 18.7 多学两招——分页标签 18.8 小结 第19...
8. **数据库工具**:DBUtils是Apache提供的一个实用工具库,简化了JDBC的使用,例如提供数据库连接池功能,使得数据库操作更加便捷。 9. **前端技术**:HTML、CSS和JavaScript是构建Web页面的基础,HTML定义结构,...
【jun_dao_hibernate】 【jun_datasource】 【jun_dbutil】 【jun_designpattern】 【jun_distributed_session】 【jun_email】 【jun_executor】 【jun_fileupload】 【jun_freemarker】 【jun_httpclient】 【jun...