package com.ytu.imanager.common;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.datasource.DataSourceUtils;
public class DaoOperateTemplate
{
/**
* <p>Discription:[获取DataSource连接]</p>
*/
private DataSource dataSource;
/**
* <p>Discription:[获取DataSource连接,使用Set方法注入]</p>
* @param dataSource
* @author:陈晓东
* @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
*/
public void setDataSource(DataSource dataSource)
{
this.dataSource = dataSource;
}
/**
* <p>Discription:[数据库连接]</p>
*/
private Connection conn = null;
/**
* <p>Discription:[预处理]</p>
*/
private PreparedStatement pstmt = null;
/**
* <p>Discription:[调用存储过程]</p>
*/
private CallableStatement proc = null;
/**
* <p>Discription:[返回结果集]</p>
*/
private ResultSet rs = null;
/**
* <p>Discription:[单个信息查询]</p>
* @param sql 查询的SQL语句
* @param args 条件参数
* @param rowMapper VO层
* @return Object类型的类对象,需要强制转换成VO
* @throws DaoException
* @author:[陈晓东]
* @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
*/
public Object find(String sql, Object[] args, RowMapper rowMapper)
throws DaoException
{
conn = DataSourceUtils.getConnection(dataSource);
if (conn ==null)
{
return null;
}
try
{
pstmt = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++)
pstmt.setObject(i + 1, args[i]);
rs = pstmt.executeQuery();
Object obj = null;
if (rs.next())
{
obj = rowMapper.mapRow(rs);
}
return obj;
}
catch (SQLException e)
{
throw new DaoException(e.getMessage(), e);
}
finally
{
ConnectionUtil.close(rs, pstmt, conn, dataSource);
}
}
/**
* <p>Discription:[方法功能中文描述]</p>
* @param sql 查询的SQL语句
* @param args 条件参数
* @param rowMapper VO层
* @return List集,
* @throws DaoException
* @author:[陈晓东]
* @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
*/
public List<Object> doQuery(String sql, Object[] args, RowMapper rowMapper)
throws DaoException
{
List<Object> results = new ArrayList<Object>();
conn = DataSourceUtils.getConnection(dataSource);
if (conn ==null)
{
return null;
}
try
{
pstmt = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++)
pstmt.setObject(i + 1, args[i]);
rs = pstmt.executeQuery();
Object obj = null;
while (rs.next())
{
obj = rowMapper.mapRow(rs);
results.add(obj);
}
return results;
}
catch (SQLException e)
{
throw new DaoException(e.getMessage(), e);
}
finally
{
ConnectionUtil.close(rs, pstmt, conn, dataSource);
}
}
/**
* <p>Discription:[通过存储过程进行分页查询]</p>
* @param sql 查询的SQL语句
* @param args 条件参数
* @param rowMapper VO层
* @return List集,
* @throws DaoException
* @author:[陈晓东]
* @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
*/
public List<Object> doQueryByCall(String sql, Object[] args, RowMapper rowMapper)
throws DaoException
{
List<Object> results = new ArrayList<Object>();
conn = DataSourceUtils.getConnection(dataSource);
if (conn ==null)
{
return null;
}
try
{
proc = conn.prepareCall(sql);//sql = "{ call scott.prc_page(?,?,?,?,?,?,?,?,?) }";
proc.setString(1, String.valueOf(args[0])); //--表名
proc.setString(2, String.valueOf(args[1])); //--查询条件
proc.setString(3, String.valueOf(args[2])); //--要排序的列名
proc.setString(4, String.valueOf(args[3])); //--排序方式
proc.setString(5, String.valueOf(args[4])); //--当前页
proc.setString(6, String.valueOf(args[5])); //--每页显示的记录数
proc.registerOutParameter(7, Types.INTEGER); //--总记录数
proc.registerOutParameter(8, Types.INTEGER); //--总页数
proc.registerOutParameter(9, oracle.jdbc.OracleTypes.CURSOR); //--返回的结果集
proc.execute();
//总记录数
int totaRecords = proc.getInt(7);
//总页数
int totalPages = proc.getInt(8);
results.add(totaRecords);
results.add(totalPages);
rs = (ResultSet) proc.getObject(9);
Object obj = null;
while (rs.next())
{
obj = rowMapper.mapRow(rs);
results.add(obj);
}
return results;
}
catch (SQLException e)
{
throw new DaoException(e.getMessage(), e);
}
finally
{
ConnectionUtil.close(rs, proc, conn, dataSource);
}
}
/**
* <p>Discription:[update/insert/delete]</p>
* @param sql 查询的SQL语句
* @param args 条件参数
* @param isGeneralKey
* @return 是否成功
* @throws DaoException
* @author:[陈晓东]
* @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
*/
public boolean doUpdate(String sql, Object[] args, boolean isGeneralKey)
throws DaoException
{
boolean result = false;
conn = DataSourceUtils.getConnection(dataSource);
if (conn ==null)
{
return result;
}
try
{
pstmt = (isGeneralKey ? conn.prepareStatement(sql,
Statement.RETURN_GENERATED_KEYS) : conn
.prepareStatement(sql));
for (int i = 0; i < args.length; i++)
{
pstmt.setObject(i + 1, args[i]);
}
if (pstmt.executeUpdate() > 0)
{
pstmt.close();
conn.close();
result = true;
}
else
{
result = false;
}
}
catch (SQLException e)
{
throw new DaoException(e.getMessage(), e);
}
finally
{
ConnectionUtil.close(rs, pstmt, conn, dataSource);
}
return result;
}
}