package com.space.dao.imp;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import com.mysql.jdbc.StringUtils;
import com.space.entity.User;
import com.space.util.Config;
/**
* 数据库连接基类
* @see execute(String sql,Object... values) 新增,删除,插入操作
* @see queryForList(int pageIndex,int pageSize,String sql,Object... values) 查询结果以list返回
* @see queryForListAttachTableName(int pageIndex,int pageSize,String sql,Object... values)查询结果以list返回 map中Key值以表名.列名形式
* @see queryForJsonArray(int pageIndex,int pageSize,String sql,Object... values) 查询结果以jsonArray返回
* @see JSONArray queryForJsonArrayAttachTableName(int pageIndex,int pageSize,String sql,Object... values)查询结果以jsonArray返回,Key值以表名.列名形式
* @see queryCount(String sql,Object... values) 查询记录条数
*
* @author space
*
*/
public class BaseImp {
/**
* 新增,删除,插入操作
* @param sql 执行的sql语句
* 例如:新增语句 "insert into user (name,sex) values (?,?)";
* 删除语句 "delete from user where id=?";
* 修改语句 "update user set name=?,sex=? where id=? and sex=?";
* @param values 对应的参数值
* @return 影响条数,-1为异常
*/
public int execute(String sql,Object... values){
return executeUpdate(sql, values);
}
/**
* 查询结果以list返回,此方法返回的key值为相应的字段名
* 当查询不同表中有字段名相同则会有字段丢失,可用queryForListAttachTableName方法
* @param 在结果集中是否给key值附加表名,例如:user.id,与id
* @param sql 查询语句 例如:"select u.id,u.name,u.sex,u.depart_id AS departId,d.* from user u,depart d where u.depart_id=d.id"
* @param values
* @throws SQLException
*/
public List<Map<String, Object>> queryForList(int pageIndex,int pageSize,String sql,Object... values) throws SQLException{
return queryList(pageIndex,pageSize,false, sql, values);
}
/**
* 查询结果以list返回,此方法返回的key值为相应的表名.字段名
* @param 在结果集中是否给key值附加表名,例如:user.id,与id
* @param sql 查询语句 例如:"select u.id,u.name,u.sex,u.depart_id AS departId,d.* from user u,depart d where u.depart_id=d.id"
* @param values
* @throws SQLException
*/
public List<Map<String, Object>> queryForListAttachTableName(int pageIndex,int pageSize,String sql,Object... values) throws SQLException{
return queryList(pageIndex,pageSize,true, sql, values);
}
/**
* 查询结果以JsonArray返回,此方法返回的key值为相应的字段名
* 当查询不同表中有字段名相同则会有字段丢失,可用queryForListAttachTableName方法
* @param 在结果集中是否给key值附加表名,例如:user.id,与id
* @param sql 查询语句 例如:"select u.id,u.name,u.sex,u.depart_id AS departId,d.* from user u,depart d where u.depart_id=d.id"
* @param values
* @throws SQLException
*/
public JSONArray queryForJsonArray(int pageIndex,int pageSize,String sql,Object... values) throws SQLException{
return queryJsonArray(pageIndex,pageSize,false, sql, values);
}
/**
* 查询结果以JsonArray返回,此方法返回的key值为相应的表名.字段名
* @param 在结果集中是否给key值附加表名,例如:user.id,与id
* @param sql 查询语句 例如:"select u.id,u.name,u.sex,u.depart_id AS departId,d.* from user u,depart d where u.depart_id=d.id"
* @param values
* @throws SQLException
*/
public JSONArray queryForJsonArrayAttachTableName(int pageIndex,int pageSize,String sql,Object... values) throws SQLException{
return queryJsonArray(pageIndex,pageSize,true, sql, values);
}
/**
* 查询记录条数
* @param sql 例如:"select count(*) from user where xxx"
* @param values
* @throws SQLException
*/
public int queryCount(String sql,Object... values) throws SQLException{
int count = -1;
Connection conn = null;
PreparedStatement pStmt = null;
conn = this.getConnection(conn);
pStmt = conn.prepareStatement(sql);
//设置参数
if(pStmt != null && values != null && values.length > 0){
for (int i = 0; i < values.length; i++) {
pStmt.setObject(i+1, values[i]);
}
}
ResultSet rs = pStmt.executeQuery();
if(rs != null){
try {
while(rs.next()){
count = rs.getInt(1);
}
}finally{
if(rs != null){
rs.close();
}
if(pStmt != null){
pStmt.close();
}
if (conn != null) {
this.closeConnection(conn);
}
}
}
return count;
}
/**
* 获取数据库连接
* @return 数据库连接对象
*/
public Connection getConnection(Connection conn) {
if(conn == null){
try {
Class.forName(Config.DRIVER);
conn = DriverManager.getConnection(Config.URL, Config.USER_NAME, Config.PWD);
} catch (Exception e) {
e.printStackTrace();
}
}
return conn;
}
/**
* 关闭数据库连接对象
* @param conn 数据库连接对象
* @return
*/
public boolean closeConnection(Connection conn) {
if (conn != null) {
try {
conn.close();
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
return false;
}
/**
* 执行增删改操作
* @param sql
* @param values
* @return
*/
private int executeUpdate(String sql,Object... values){
Connection conn = null;
PreparedStatement pStmt = null;
try {
conn = this.getConnection(conn);
pStmt = conn.prepareStatement(sql);
//设置参数
if(pStmt != null && values != null && values.length > 0){
for (int i = 0; i < values.length; i++) {
pStmt.setObject(i+1, values[i]);
}
}
int i =pStmt.executeUpdate();
return i;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null) {
this.closeConnection(conn);
}
}
return -1;
}
/**
* 查询结果以list返回
* @param pageIndex 页数
* @param pageSize 每页记录条数
* @param attachTableName 在结果集中是否给key值附加表名,例如:user.id,与id
* @param sql 查询语句 例如:"select u.id,u.name,u.sex,u.depart_id AS departId,d.* from user u,depart d where u.depart_id=d.id"
* @param values
* @throws SQLException
*/
private List<Map<String, Object>> queryList(int pageIndex,int pageSize,boolean attachTableName,String sql,Object... values) throws SQLException{
Connection conn = null;
PreparedStatement pStmt = null;
List<Map<String, Object>> dataList = null;
//校验参数
if(pageIndex <= 0){
pageIndex = 1;
}
if(pageSize <= 0){
pageSize = Config.PAGE_SIZE_DEFAULT;
}
conn = this.getConnection(conn);
pStmt = conn.prepareStatement(sql);
//设置参数
if(pStmt != null && values != null && values.length > 0){
for (int i = 0; i < values.length; i++) {
pStmt.setObject(i+1, values[i]);
}
}
//设置最大查询到第几条记录
pStmt.setMaxRows(pageIndex*pageSize);
ResultSet rs = pStmt.executeQuery();
//游标移动到要输出的第一条记录
rs.relative((pageIndex-1)*pageSize);
if(rs != null){
try {
dataList = new ArrayList<Map<String,Object>>();
ResultSetMetaData md = rs.getMetaData(); //得到结果集(rs)的结构信息,比如字段数、字段名等