package com.hongyuan.core;
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.hashmap;
import java.util.list;
import java.util.map;
import java.util.regex.matcher;
import java.util.regex.pattern;
import javax.sql.datasource;
import com.mysql.jdbc.jdbc2.optional.mysqldatasource;
public class dbutil {
private static datasource datasource = null;
static{
/**
* 初始化数据源,不同的数据库获取数据源的方式不同,可参考相应数据库的说明文档。
*/
mysqldatasource mds=new mysqldatasource();
mds.seturl("jdbc:mysql://localhost:3306/test");
mds.setuser("test");
mds.setpassword("123456");
mds.setcharacterencoding("utf8");
datasource=mds;
}
/**
* 获取数据库连接
* @return
* @throws sqlexception
*/
public static connection getconnection() throws sqlexception {
return datasource.getconnection();
}
/**
* 关闭数据库连接资源
* @param conn
* @param s
* @param rs
* @throws sqlexception
*/
public static void close(connection conn, statement s, resultset rs){
try {
if (rs != null) rs.close();
} catch (sqlexception e) {
e.printstacktrace();
}
try {
if (s != null) s.close();
} catch (sqlexception e) {
e.printstacktrace();
}
try {
if (conn != null) conn.close();
} catch (sqlexception e) {
e.printstacktrace();
}
}
/**
* 执行数据库查询语句
* @param sql 查询sql,匿名参数用?表示,命名参数使用“:参数名”表示
* @param params 查询参数
* @return
* @throws sqlexception
*/
@suppresswarnings("unchecked")
public static list<map<string,object>> select(object sql,object... params) throws sqlexception{
object result=dbutil.executesql(sql,params);
if(result==null){
return null;
}else{
return (list<map<string,object>>)result;
}
}
/**
* 执行插入
* @param sql
* @param params
* @return
* @throws sqlexception
*/
public static int insert(object sql,object... params) throws sqlexception{
return dbutil.update(sql, params);
}
/**
* 执行数据库记录变更语句(增,删,改)
* @param sql 查询sql,匿名参数用?表示,命名参数使用“:参数名”表示
* @param params 查询参数
* @return
* @throws sqlexception
*/
public static int update(object sql,object... params) throws sqlexception{
object result=dbutil.executesql(sql,params);
if(result==null){
return 0;
}else{
return (integer)result;
}
}
/**
* 执行删除
* @param sql
* @param params
* @return
* @throws sqlexception
*/
public static int delete(object sql,object... params) throws sqlexception{
return dbutil.update(sql, params);
}
/**
* 通用sql执行方法
* @param sql 查询sql,匿名参数用?表示,命名参数使用“:参数名”表示
* @param params 命名参数
* @return
* @throws sqlexception
*/
public static object executesql(object sql, object... params) throws sqlexception {
if(sql==null||"".equals(sql.tostring().trim())) throw new sqlexception("sql语句为空!");
//获取sql语句
string sqlstr=sql.tostring().trim();
//处理命名参数
if(params!=null&¶ms.length==1&¶ms[0] instanceof map){
list<object> plist=new arraylist<object>();
map<string,object> pmap=(map<string, object>)params[0];
matcher pmatcher = pattern.compile(":(
\\w+)").matcher(sqlstr);
while(pmatcher.find()){
string pname=pmatcher.group(1);
plist.add(pmap.get(pname));
}
sqlstr=pmatcher.replaceall("?");
params=plist.toarray();
}
connection conn = null;
preparedstatement ps = null;
resultset rs = null;
try {
conn = dbutil.getconnection();
ps = conn.preparestatement(sqlstr);
if (null != params) {
//初始化查询参数
for(int i=0;i<params.length;i++){
object param = params[i];
if(param!=null){
ps.setobject(i+1,param);
}else{
ps.setnull(i+1,types.null);
}
}
}
//处理结果集
boolean isresultset = ps.execute();
list<object> result = new arraylist<object>();
do {
if (isresultset) {
list<map<string,object>> tabledata=new arraylist<map<string,object>>();
resultset resultset=ps.getresultset();
while(resultset.next()){
map<string,object> rowdata=new hashmap<string,object>();
for(int i=1;i<=resultset.getmetadata().getcolumncount();i++){
rowdata.put(resultset.getmetadata().getcolumnname(i),resultset.getobject(i));
}
tabledata.add(rowdata);
}
result.add(tabledata);
} else {
result.add(new integer(ps.getupdatecount()));
}
} while ((isresultset = ps.getmoreresults()) == true || ps.getupdatecount() != -1);
//处理返回结果
if (result.size() == 0) {
return null;
} else if (result.size() == 1) {
return result.get(0);
} else {
return result;
}
} catch (sqlexception e) {
throw new sqlexception("无效sql!-->"+sql);
} finally {
dbutil.close(conn, ps, rs);
}
}
}
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!!
点击进行留言回复
网友评论