我JSP学得不多,自己写了一个类来连接数据库,JDBC方式的. 我想做一个网站,很多地方需要对数据库进行操作,所以把它做成一个应该比较好一些. 但是我不知道这个类该怎样写才更合适一些. 怎样更省资源,怎样用起来更方便和安全.还有一个问题,我在别的servlet里面要想使用这个类,直接用它一实例化一个对象,然后使用就可以了吗? 但是我试过,一直出问题.想请教一下大家在这里都是怎么做的?package testPackage;
import java.sql.*; public class ConMySQL {
String sDataBase = "jdbc:mysql://localhost/ijseblog?user=root&password=clslist";
Connection con = null;
Statement stmt = null;
private void connect()
{
try
{
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection(sDataBase);
stmt = con.createStatement();
}catch(ClassNotFoundException ex)
{
ex.printStackTrace();
}catch(SQLException ex)
{
System.err.println(ex);
}
}
public ResultSet Query(String sql)
{
ResultSet rs = null;
connect();
try
{
rs = stmt.executeQuery(sql);
}catch(SQLException ex)
{
ex.printStackTrace();
}
return rs;
}
public int Update(String sql)
{
int rt = 0;
connect();
try
{
rt = stmt.executeUpdate(sql);
}catch(SQLException ex)
{
ex.printStackTrace();
}
return rt;
}
public void close()
{
try
{
if(stmt != null)
{
stmt.close();
stmt = null;
}
if(con != null)
{
con.close();
con = null;
}
}catch(SQLException ex)
{
System.err.println(ex);
}
}
}
import java.sql.*; public class ConMySQL {
String sDataBase = "jdbc:mysql://localhost/ijseblog?user=root&password=clslist";
Connection con = null;
Statement stmt = null;
private void connect()
{
try
{
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection(sDataBase);
stmt = con.createStatement();
}catch(ClassNotFoundException ex)
{
ex.printStackTrace();
}catch(SQLException ex)
{
System.err.println(ex);
}
}
public ResultSet Query(String sql)
{
ResultSet rs = null;
connect();
try
{
rs = stmt.executeQuery(sql);
}catch(SQLException ex)
{
ex.printStackTrace();
}
return rs;
}
public int Update(String sql)
{
int rt = 0;
connect();
try
{
rt = stmt.executeUpdate(sql);
}catch(SQLException ex)
{
ex.printStackTrace();
}
return rt;
}
public void close()
{
try
{
if(stmt != null)
{
stmt.close();
stmt = null;
}
if(con != null)
{
con.close();
con = null;
}
}catch(SQLException ex)
{
System.err.println(ex);
}
}
}
1、使用数据库连接池,性能要比你现在不停创建--销毁要高得多
2、你可以封装一个连接类,里面有基本的获取Connection,释放Connection,执行sql语句,commit等各常用方法。
3、记住,数据库连接,用完必须释放。而且必须在finally块中释放,否则执行过程中出现异常,连接将永远保持。
Null pointer access: The variable conData can only be null at this location
{
try
{
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection(sDataBase);
stmt = con.createStatement();
}catch(ClassNotFoundException ex)
{
ex.printStackTrace();
}catch(SQLException ex)
{
System.err.println(ex);
}
}
红色部分最好放入静态代码块中。只加载一次就好。
另外你可以把这个类做成单例类或者方法是静态方法,这样就不用频繁的创建不必要的对象了
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;import javax.sql.DataSource;import org.apache.commons.dbcp.BasicDataSourceFactory;public class JDBCUtil { private static DataSource dataSource = null; /**
* 初始化数据库连接资源
*/
static {
Properties properties = new Properties();
InputStream inputStream = JDBCUtil.class.getClassLoader()
.getResourceAsStream(
"com\\betty\\news\\common\\db\\dbcpconfig.properties"); try {
properties.load(inputStream);
inputStream.close();
dataSource = BasicDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
throw new RuntimeException(e);
}
} public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
} /**
* 关闭rs,stmt,conn,释放数据库连接资源
*
* @param rs
* @param stmt
* @param conn
* @throws SQLException
*/
public static void release(ResultSet rs, Statement stmt, Connection conn)
throws SQLException {
try {
if (rs != null) {
rs.close();
}
} finally {
try {
if (stmt != null) {
stmt.close();
}
} finally {
if (conn != null) {
conn.close();
}
}
}
} /**
* overLoade release
*
* @param stmt
* @param conn
* @throws SQLException
* @throws SQLException
*/
public static void release(Statement stmt, Connection conn)
throws SQLException {
release(null, stmt, conn);
}
public static void main(String[] args) throws SQLException {
System.out.println(getConnection());
}
}
2.这两个方法还是不要捕获异常,向上层抛出,就像小领导那儿出了自己管辖范围之外的事,或是其他自己管不了的大事时,要向上级汇报一样。异常设计中有一点思想就是:当前方法出现了自己无法解决的异常时,就要往上层抛,即:如果当前无法为异常提供解决办法,就不要截住异常。