废话不多说,直接上源代码,最后有使用方法,当然,也可以作为普通公用类使用,只是封装成JAR更方便使用。
package db.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.sql.CallableStatement;
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.List;
import java.util.Map;
import org.json.JSONObject;
/*
* 说明:封装JDBC数据库增删改查、存储过程
* 作者:Jiro.Chen
* 时间:2016-12-12 15:13:54
* */
public class ConnectionUtil {
private static String DRIVER = null;
private static String URL = null;
private static String USERNAME = null;
private static String PASSWORD = null;
private Connection conn = null;
private PreparedStatement pstmt = null;
private CallableStatement callableStatement = null;
private ResultSet resultSet = null;
private void init(){
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
System.out.println("加载驱动错误");
System.out.println(e.getMessage());
}
}
public ConnectionUtil(String dbParam){
String path = getCurrentPath();
String filePath = path + "\\db.JSON";
String text = null;
try{
text = this.readFile(new File(filePath));
if(text.equals(null) || text.equals("")){
filePath = path + "\\db.json";
text = this.readFile(new File(filePath));
if(text.equals(null) || text.equals("")){
System.out.println("找不到指定文件");
}
}
}catch(Exception e){
e.printStackTrace();
}
JSONObject json = new JSONObject(text);
JSONObject DB = json.getJSONObject(dbParam);
DRIVER = DB.getString("DRIVER");
URL = DB.getString("URL");
USERNAME = DB.getString("USERNAME");
PASSWORD = DB.getString("PASSWORD");
this.init();
}
private String readFile(File file){
String text = null;
try{
if(file.isFile() && file.exists()){
InputStreamReader read = new InputStreamReader(new FileInputStream(file),"UTF-8");
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt = null;
while((lineTxt = bufferedReader.readLine()) != null){
text += lineTxt;
}
read.close();
}
}catch(Exception e){
e.printStackTrace();
}
return text;
}
private String getCurrentPath(){
String rootPath = null;
java.net.URL url = ConnectionUtil.class.getProtectionDomain().getCodeSource().getLocation();
String filePath = null;
try{
filePath = java.net.URLDecoder.decode(url.getPath(), "utf-8");
}catch (Exception e) {
e.printStackTrace();
}
if(filePath.endsWith(".jar")){
filePath = filePath.substring(0, filePath.lastIndexOf("/") + 1);
}
java.io.File file = new java.io.File(filePath);
rootPath = file.getAbsolutePath();
rootPath = rootPath.substring(0, rootPath.lastIndexOf("\\"));
rootPath += "\\classes";
return rootPath;
}
public Connection getConnection(){
try{
conn = DriverManager.getConnection(URL, USERNAME,
PASSWORD);
}catch (SQLException e){
System.out.println(e.getMessage());
}
return conn;
}
public int executeUpdate(String sql, Object[] params){
int affectedLine = 0;
try{
conn = this.getConnection();
pstmt = conn.prepareStatement(sql);
if (params != null){
for (int i = 0; i
pstmt.setObject(i + 1, params[i]);
}
}
affectedLine = pstmt.executeUpdate();
}catch (SQLException e){
System.out.println(e.getMessage());
}finally {
closeAll();
}
return affectedLine;
}
/**
* SQL 查询将查询结果直接放入ResultSet中
*/
private ResultSet executeQueryRS(String sql, Object[] params){
try{
conn = this.getConnection();
pstmt = conn.prepareStatement(sql);
if (params != null){
for (int i = 0; i
pstmt.setObject(i + 1, params[i]);
}
}
resultSet = pstmt.executeQuery();
}catch (SQLException e){
System.out.println(e.getMessage());
}
return resultSet;
}
/**
* 获取结果集,并将结果放在List中
*/
public List excuteQuery(String sql, Object[] params){
ResultSet rs = executeQueryRS(sql, params);
ResultSetMetaData rsmd = null;
int columnCount = 0;
try{
rsmd = rs.getMetaData();
columnCount = rsmd.getColumnCount();
}catch (SQLException e1) {
System.out.println(e1.getMessage());
}
List list = new ArrayList();
try{
while (rs.next()) {
Map map = new HashMap();
for (int i = 1; i <= columnCount; i++) {
map.put(rsmd.getColumnLabel(i), rs.getObject(i));
}
list.add(map);
}
}catch (SQLException e) {
System.out.println(e.getMessage());
}finally {
closeAll();
}
return list;
}
/**
* 存储过程带有一个输出参数的方法
* @param sql 存储过程语句
* @param params 参数数组
* @param outParamPos 输出参数位置
* @param SqlType 输出参数类型
* @return 输出参数的值
*/
public Object excuteQuery(String sql, Object[] params,int outParamPos, int SqlType){
Object object = null;
conn = this.getConnection();
try{
callableStatement = conn.prepareCall(sql);
if(params != null){
for(int i = 0; i
callableStatement.setObject(i + 1, params[i]);
}
}
callableStatement.registerOutParameter(outParamPos, SqlType);
callableStatement.execute();
object = callableStatement.getObject(outParamPos);
}catch (SQLException e){
System.out.println(e.getMessage());
}finally{
closeAll();
}
return object;
}
private void closeAll(){
if (resultSet != null){
try {
resultSet.close();
} catch (SQLException e){
System.out.println(e.getMessage());
}
}
if(pstmt != null){
try{
pstmt.close();
} catch (SQLException e){
System.out.println(e.getMessage());
}
}
if(callableStatement != null){
try{
callableStatement.close();
}catch (SQLException e) {
System.out.println(e.getMessage());
}
}
if(conn != null){
try{
conn.close();
} catch (SQLException e) {
System.out.println(e.getMessage());
}
}
}
}
使用方法:
在Web工程src目录下新建db.JSON或者db.json文件
{
"DB":{
"DRIVER" :"com.microsoft.sqlserver.jdbc.SQLServerDriver",
"URL" :"jdbc:sqlserver://223.68.143.21:12922;DatabaseName=TwRailway_ECP",
"USERNAME":"sa",
"PASSWORD":"senao"
}
}
其中,DB可以有多个
工程导入JAR包之后,通过
ConnectionUtil conn = new ConnectionUtil("DB");
配置文件db.JSON可以写多个数据库,参数DB指定使用哪种数据库建立连接
方法介绍:
1.public Connection getConnection()
功能:
JAR中提供了全套的增删改查的方法,但为了应对某种特殊情况下的需求,方法不能满足程序员需求时,可以使用此方法建立与数据库的连接,自行编写DAO层方法。
参数说明:
无
传回值:
传回Connection连接或NULL
2.public int executeUpdate(String sql, Object[] params)
功能:
使用PrepareStatement预处理执行sql,适用于数据新增、修改、删除等操作。
参数说明:
sql 执行的sql语句
params 对象数组,存储要新增、修改或删除的数据。可以为空。
传回值:
传回1表示成功
传回0表示失败
3.public List excuteQuery(String sql, Object[] params)
功能:
使用PrepareStatement预处理执行sql,适用于数据查询。
参数说明:
sql 执行的sql语句
params 对象数组,sql语句中预设的值。可以为空。
传回值:
带有Map索引的List类型数据
只是适用于小型项目,减少DAO层编码量,增强代码的重用性。可以封装为公用类使用,也可以作为JAR档。
注意:此JAR依赖json.jar包。