自制的 Java 连接器,该连接器将创建连接和删除连接进行了封装,减少了J2EE开发关于 Database 操作的代码,用于在编写Java环境下无论是J2EE还是控制台、或者jUnit下,方便的连接数据库。
/*
* 数据库连接类
* 每一个连接实体用一个 Connect,循环体务必注意
* 修改日志:<br>
* 2016/7/1 增加关闭自动提交和提交函数
* 2017/2/27 修正一些规范性设置,稳定性提高
* 2017/4/10 Connect 构造函数机上异常状态触发
*
*/
package data;
/*
* 数据库连接类
*/
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import cn.sharcom.config.Constant;
public class Connect
{
private static final Logger logger = LogManager.getLogger(Connect.class);
private Connection conn = null;
private Statement stmt = null;
private CallableStatement cstmt = null;
private PreparedStatement pstmt = null;
private ResultSet rs = null;
private boolean connected = false;
/**
* 连接模式:J2EE 环境下,连接池方式
*/
public static int JNDI_MODE = 100;
/**
* 控制台环境下,URL 连接方式(用于jUnit测试)
*/
public static int URL_MODE = 200;
/**
* 初始化连接
*
* @param mode
* 连接模式:JNDI 和 URL
*/
public Connect(final int mode) throws SQLException
{
// J2EE 环境下连接池
if (mode == JNDI_MODE)
{
logger.debug("JNDI_MODE begin ...");
// 连接数据库
try
{
Context context = new InitialContext();
logger.debug("InitialContext success");
DataSource dataSource = (DataSource) context.lookup(Constant.JNDI_NAME);
logger.debug(String.format("DataSource lookup \"%s\" %s", Constant.JNDI_NAME, "success"));
conn = dataSource.getConnection();
logger.debug(String.format("Connection dataSource %s", "success"));
stmt = conn.createStatement();
logger.debug(String.format("CreateStatement %s", "success"));
// 修改連接狀態
connected = true;
}
catch (NamingException e)
{
e.printStackTrace();
logger.error(e.getMessage());
Close();
throw new SQLException("Connect fail by JNDI");
}
catch (SQLException e)
{
e.printStackTrace();
logger.error(e.getMessage());
Close();
throw new SQLException("Connect fail by JNDI");
}
catch (Exception e)
{
e.printStackTrace();
logger.error(e.getMessage());
Close();
throw new SQLException("Connect fail by JNDI");
}
finally
{
}
}
// 主要是用于 jUnit 测试时没有连接池的情況
else if (mode == URL_MODE)
{
logger.debug("URL_MODE begin...");
try
{
//
Class.forName("com.mysql.jdbc.Driver");
// 创建连接 URL
final String url = String.format("jdbc:mysql://127.0.0.1:3306/editor?user=%s&password=%s&useSSL=false", "root", "123456");
// 连接 …… 并得到 connection
conn = DriverManager.getConnection(url);
// Statement
stmt = conn.createStatement();
// 修改連接狀態
connected = true;
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
logger.error(e.getMessage());
Close();
throw new SQLException("Connect fail by URL");
}
catch (SQLException e)
{
e.printStackTrace();
logger.error(e.getMessage());
Close();
throw new SQLException("Connect fail by URL");
}
catch (Exception e)
{
e.printStackTrace();
logger.error(e.getMessage());
Close();
throw new SQLException("Connect fail by URL");
}
finally
{
}
}
}
/**
* 返回连接状态
*
* @return
*/
public boolean isConnected()
{
return connected;
}
/**
* 检查数据库連接是否有效
*
* @return
*/
public boolean Test()
{
// 返回值
boolean result = false;
ResultSet resultSet = null;
// 检查
try
{
resultSet = conn.createStatement().executeQuery("select 1");
if (resultSet.first() == true)
{
result = true;
logger.debug("Test connect success");
}
if (resultSet != null)
{
try
{
resultSet.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
catch (SQLException e)
{
e.printStackTrace();
result = false;
logger.debug("Test connect fail");
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
}
// 返回
return result;
}
/**
* 傳入一個預備格式化的 SQL<br>
* insert into table (`field1`, `field2`) values (?, ?);
*
* @param sql
* @throws SQLException
*/
public void setPreparedStatementSQL(final String sql) throws SQLException
{
pstmt = conn.prepareStatement(sql);
}
/**
* 傳入格式化的<br>
* SQL connect.setPreparedStatementSQL(sql);<br>
*
* 設置各個參數的類型和值<br>
* connect.getPreparedStatement().setLong(1, 1);<br>
* connect.getPreparedStatement().setString(2, "name");<br>
* connect.getPreparedStatement().setString(3, null);<br>
*
* 執行<br>
* connect.executeUpdate(null);<br>
*
* @return
*/
public PreparedStatement getPreparedStatement()
{
return pstmt;
}
/**
* 返回 Connection
*
* @return
*/
public Connection getConnection()
{
return conn;
}
/**
* 返回 ResultSet
*
* @return
*/
public ResultSet getResultSet()
{
return rs;
}
/**
* 获得 Statement 执行 SQL 命令
*
* @return Statement
* @throws SQLException
*/
public Statement getStatement() throws SQLException
{
// 创建 statement
// mysql use
stmt = conn.createStatement();
// mssql use
// stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
return stmt;
}
/**
* 获取 CallableStatement 并创建存储过程
*
* @param strCallableStatement
* @return CallableStatement
* @throws SQLException
*/
public CallableStatement getCallableStatement(String sql) throws SQLException
{
// storedProc
cstmt = conn.prepareCall(sql);
return cstmt;
}
public ResultSet executeQuery() throws SQLException
{
return executeQuery(null);
}
/**
* 查询 sql
*
* @param sql
* @return
* @throws SQLException
*/
public ResultSet executeQuery(final String sql) throws SQLException
{
// init ResultSet
if (rs != null)
{
rs.close();
rs = null;
}
// 正常的 SQL 传入调用
if (sql != null)
{
logger.debug("connect: stmt.executeQuery(sql)");
if (stmt != null)
{
rs = stmt.executeQuery(sql);
}
}
else
{
logger.debug("connect: pstmt.executeQuery()");
if (pstmt != null)
{
rs = pstmt.executeQuery();
}
}
return rs;
}
/**
* 执行 sql
*
* @param sql
* @return
* @throws SQLException
*/
public int executeUpdate(final String sql) throws SQLException
{
int result = 0;
if (sql == null && pstmt != null)
{
result = pstmt.executeUpdate();
}
else
{
result = stmt.executeUpdate(sql);
}
return result;
}
/**
* pstmt 无参数时调用
*
* @return
* @throws SQLException
*/
public int executeUpdate() throws SQLException
{
return executeUpdate(null);
}
/**
* 取得最后编号
*
* @return
*/
public Long getLastInsertId()
{
Long result = null;
ResultSet resultSet = null;
try
{
// 查询最后插入的记录的编号
String sql = "select last_insert_id() as `id`";
// 调用查询
resultSet = stmt.executeQuery(sql);
if (resultSet.first() == true)
{
result = resultSet.getLong("id");
logger.debug("getLastInsertId is success");
}
else
{
logger.debug("getLastInsertId is null");
}
}
catch (SQLException e)
{
e.printStackTrace();
logger.error("getLastInsertId is fail");
}
finally
{
if (resultSet != null)
{
try
{
resultSet.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
return result;
}
/**
* 设置是否自动提交<br>
* 默認爲 true,執行后即刻對數據庫改寫<br>
* 当为 false 时,所有修改需调用 Commit() 方可实际完成。
*
* @param model
* @throws SQLException
*/
public void setAutoCommit(boolean model) throws SQLException
{
logger.debug("setAutoCommit", model);
conn.setAutoCommit(model);
}
/**
* 若处于手动提交, 需要提交
*
* @throws SQLException
*/
public void Commit() throws SQLException
{
conn.commit();
}
/**
* 事物回退
*
* @throws SQLException
*/
public void Rollback()
{
try
{
conn.rollback();
}
catch (SQLException e)
{
e.printStackTrace();
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
* 關閉所有連接
*/
public void Close()
{
logger.debug("Connect close all");
connected = false;
// Close ResultSet
if (rs != null)
{
try
{
rs.close();
}
catch (Exception e)
{
e.printStackTrace();
}
rs = null;
}
// Close Statement
if (stmt != null)
{
try
{
stmt.close();
}
catch (Exception e)
{
e.printStackTrace();
}
stmt = null;
}
// storedProc
if (cstmt != null)
{
try
{
cstmt.close();
}
catch (Exception e)
{
e.printStackTrace();
}
cstmt = null;
}
if (conn != null)
{
try
{
conn.close();
}
catch (Exception e)
{
e.printStackTrace();
}
conn = null;
}
}
}
连接器的使用:执行方法
Connect connect = new Connect(Connect.URL_MODE);
if(connect.executeUpdate(sql) == 1)
{
// 执行成功
}
connect.Close();
连接器的使用:查询方法
Connect connect = new Connect(Connect.URL_MODE);
connect.executeQuery(sql);
while (connect.getResultSet().next() == true)
{
String val = connect.getResultSet().getString("field1");
System.out.println(val);
}
connect.Close();
实例:
Connect connect = null;
try
{
connect = new Connect(Connect.JNDI_MODE);
connect.executeQuery(sql);
while (connect.getResultSet().next() == true)
{
String val = connect.getResultSet().getString("field");
}
}
catch (SQLException e)
{
e.printStackTrace();
result = Constant.DB_ERROR;
}
catch (Exception e)
{
e.printStackTrace();
result = Constant.DB_ERROR;
}
finally
{
if (connect != null)
{
connect.Close();
}
}
需要注意的环节就是:当用完 Connect 后,一定要调用 Close() 以关闭连接,尤其是 J2EE 连接池环境,否则在连接超时自动关闭前,连接会一直保持,这将会占用系统资源,而持续申请连接也会耗尽连接池,新的连接将无法申请。
本文链接 blog.csdn.net/joyous/article/details/51103046
Q群讨论:236201801
.