📄 dbmanager.java
字号:
import java.sql.*;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.ArrayList;
import java.awt.*;
import java.util.Iterator;
import javax.swing.JOptionPane;
public class DBManager {
Connection conn;
Statement stmt;
ResultSet rs;
public DBManager(){
}
public ResultSet getResult(String sql){
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn= DriverManager.getConnection("jdbc:odbc:mydb");
stmt=conn.createStatement();
rs=stmt.executeQuery(sql);
return rs;
}
catch(Exception e){
JOptionPane.showMessageDialog(null, "出错了");
System.out.println("getResult-----"+e.toString());
return null;
}
}
public boolean excuteSql(String sql){
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
conn= DriverManager.getConnection("jdbc:odbc:mydb");
stmt=conn.createStatement();
stmt.executeUpdate(sql);
conn.commit();
return true;
}
catch(Exception e){
System.out.println("getResult-----"+e.toString());
return false;
}
}
public void shutdown(){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
////////////////////////////////////////////查询方法
/*查询方法也许是CommonDao最常用的方法,查询方法需要将数据库的结果返回给画面。
返回值我们一般不使用ResultSet,因为 ResultSet依赖于Connection,如果Connection关闭,
ResultSet将不再有效,所以我们通常将ResultSet转变为 一个List之后返回。
在说明查询方法之前,我们先说说如何将数据库中的内容放在List中,
我们使用一个List表示一个查询结果集合,使用一个Map表示集合中的一行,
Map的key表示数据库表的字段名字,Value表示数据库字段的内容。代码为:
*/
public List convert(ResultSet rs){
// record list
List retList = new ArrayList();
try {
ResultSetMetaData meta = rs.getMetaData();
// column count
int colCount = meta.getColumnCount();
// each record
while (rs.next()) {
Map recordMap = new HashMap();
// each column
for (int i = 1; i <= colCount; i++) {
// column name
String name = meta.getColumnName(i);
// column value
Object value = rs.getObject(i);
// add column to record
recordMap.put(name, value);
}
// ad record to list
retList.add(recordMap);
}
} catch (SQLException ex) {
ex.printStackTrace();
}
return retList;
}
/*为了避免Sql注入的安全问题,我们通常使用PreparedStatement,
*在使用PreparedStatement的时候涉及到如何将传入参数设置到PreparedStatement上面,参看以下的共通方法:*/
private void apply(PreparedStatement pstmt, List params){
try {
// if params exist
if (params != null && params.size() > 0) {
// parameters iterator
Iterator it = params.iterator();
// parameter index
int index = 1;
while(it.hasNext()) {
Object obj = it.next();
// if null set ""
if (obj == null) {
pstmt.setObject(index, "");
} else {
// else set object
pstmt.setObject(index, obj);
}
//next index
index++;
}
}
} catch (SQLException ex) {
ex.printStackTrace();
}
}
/*接着我们继续说我们的查询方法,有了上述两个方法,我们的查询方法就非常简单了:*/
public List query(String sql, List params) {
List result = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
pstmt = conn.prepareStatement(sql);
this.apply(pstmt, params);
rs = pstmt.executeQuery();
result = this.convert(rs);
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// nothing
}
}
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
// nothing
}
}
}
return result;
}
//单值返回查询
public Object queryOne(String sql, List params){
List list = this.query(sql,params);
Map record = (Map)list.get(0);
return record.values().toArray()[0];
}
/*更新,删除,插入方法
由于在JDBC中这三个方法都是用了一个execute完成,所以这里我们也使用一个方法来完成这些功能。代码为:*/
public int execute(String sql, List params){
int ret = 0;
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
this.apply(pstmt, params);
ret = pstmt.executeUpdate();
}catch(SQLException ex) {
ex.printStackTrace();
} finally {
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
// nothing.
}
}
}
return ret;
}
///////////////////////////////////////////////////////
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -