package com.foreknow.db;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.foreknow.mapping.EntityMapping;
public class JdbcTemplate {
private Connection con;
private PreparedStatement psta = null;
private ResultSet rs = null;
private static JdbcTemplate jdbcTemplate = null;
private Log logger = LogFactory.getLog(JdbcTemplate.class);
private JdbcTemplate() {
}
public static JdbcTemplate getInstance() {
if (jdbcTemplate == null) {
jdbcTemplate = new JdbcTemplate();
}
return jdbcTemplate;
}
/**
* 注入数据库连接
* @param connection
*/
public void setConnection(Connection connection) {
con = connection;
}
/**
* 用于执行insert,update,delete语句,可带参数
* @param sql
* @param values
* @return 返回影响行数
* @throws DAOException
*/
public int update(String sql,Object... values) {
if (logger.isDebugEnabled()) {
logger.debug("发送sql语句:" + sql);
}
int row = 0;
try {
psta = con.prepareStatement(sql);//insert into emp values(?,?,?,?)
for (int i = 0; i< values.length; i++){
psta.setObject(i+1, values[i]);
}
row = psta.executeUpdate();
} catch (SQLException e) {
String errorMsg = "sql语句发生错误!sql语句为:" + sql;
if (logger.isErrorEnabled()) {
logger.error(errorMsg, e);
}
throw new RuntimeException(errorMsg);
} finally {
close();
}
return row;
}
/**
* 查询一个double值
* @param sql
* @return
*/
public double queryDouble(String sql, Object... values) {
if (logger.isDebugEnabled()) {
logger.debug("发送sql语句:" + sql);
}
double result = 0;
try {
psta = con.prepareStatement(sql);
for (int i = 0; i< values.length; i++){
psta.setObject(i+1, values[i]);
}
rs = psta.executeQuery();
if (rs.next()) {
result = rs.getDouble(1);
}
} catch (SQLException e) {
String errorMsg = "sql语句发生错误!sql语句为:" + sql;
if (logger.isErrorEnabled()) {
logger.error(errorMsg, e);
}
throw new RuntimeException(errorMsg);
} finally {
close();
}
return result;
}
/**
* 用于执行select count(*)语句,或者获取seq序列的语句
* @param sql
* @return 返回第一个值
* @throws DAOException
*/
public int query(String sql){
if (logger.isDebugEnabled()) {
logger.debug("发送sql语句:" + sql);
}
int result = 0;
try {
psta = con.prepareStatement(sql);
rs = psta.executeQuery();
if (rs.next()) {
result = rs.getInt(1);
}
} catch (SQLException e) {
String errorMsg = "sql语句发生错误!sql语句为:" + sql;
if (logger.isErrorEnabled()) {
logger.error(errorMsg, e);
}
throw new RuntimeException(errorMsg);
} finally {
close();
}
return result;
}
/**
* 用于执行查询返回多个对象的sql语句
* @param sql
* @param mapping
* @param values
* @return 返回对象链表
* @throws DAOException
*/
public List<Object> query(String sql, EntityMapping mapping, Object...values){
if (logger.isDebugEnabled()) {
logger.debug("发送sql语句:" + sql);
}
List<Object> list = new ArrayList<Object>();
try {
psta = con.prepareStatement(sql);
for (int i = 0; i < values.length; i++){
psta.setObject(i+1, values[i]);
}
rs = psta.executeQuery();
while(rs.next()){
list.add(mapping.mapping(rs));
}
} catch (SQLException e) {
String errorMsg = "sql语句发生错误!sql语句为:" + sql;
if (logger.isErrorEnabled()) {
logger.error(errorMsg, e);
}
throw new RuntimeException(errorMsg);
} finally {
close();
}
return list;
}
/**
* 关闭数据库连接
* @throws DAOException
*/
public void close(){
try{
if (psta!=null){
psta.close();
psta=null;
}
if (rs!=null){
rs.close();
rs=null;
}
} catch (SQLException e) {
String errorMsg = "关闭preparedstatment 和resultset发生错误!";
if (logger.isErrorEnabled()) {
logger.error(errorMsg, e);
}
throw new RuntimeException(errorMsg);
}
}
}
2019-08-28 JdbcTemplate
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 《按自己的意愿过一生》 这是来自蔡佩辰(菜菜)的第28篇早间日记 昨天和老公在家里,看完了王潇的《按自己的意愿过一...
- 亲爱的儿子: 明天你就要迈入大学,开启你的大学之旅。有些话我想叮咛你。 一,树立正确的人生取向。 ...