java 使用策略模式操作JDBC數(shù)據(jù)庫
java 使用策略模式操作JDBC數(shù)據(jù)庫
1:構(gòu)造一個操作數(shù)據(jù)庫的工具類,可以獲得連接和釋放連接
public class DBUtil {
private static Connection conn = null;
static { //靜態(tài)初始塊
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "064319"); //初始化獲取連接
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 釋放連接
* @param rs
* @param psmt
* @param conn
* @throws SQLException
*/
public static void closeAll(ResultSet rs, PreparedStatement psmt, Connection conn) throws SQLException {
if(rs != null) {
rs.close();
}
if(psmt != null) {
psmt.close();
}
if(conn != null) {
conn.close();
}
}
/**
* 獲取連接
* @return
*/
public static Connection getConnection() {
return conn;
}
/**
* 根據(jù)表的名字來獲得表的列信息
* @param tableName
*/
public static void getTableColumnInfoByTableName(String tableName) {
Connection conn = getConnection();
ResultSet rs = null;
PreparedStatement psmt = null;
String sql = "select * from " + tableName;
try {
psmt = conn.prepareStatement(sql);
rs = psmt.executeQuery();
ResultSetMetaData resultSetMetaData = rs.getMetaData();
for(int i = 1; i<= resultSetMetaData.getColumnCount(); i++) {
System.out.println(resultSetMetaData.getColumnName(i));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
closeAll(rs, psmt, conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 根據(jù)表的名字來獲得表的信息
* @param tableName
*/
public static void getTableInfoByTableName(String tableName) {
Connection conn = getConnection();
PreparedStatement psmt = null;
ResultSet rs = null;
String sql = "select * from " + tableName;
try {
psmt = conn.prepareStatement(sql);
rs = psmt.executeQuery();
while(rs.next()) {
ResultSetMetaData resultSetMetaData = rs.getMetaData();
for(int i = 1; i<= resultSetMetaData.getColumnCount(); i++) {
if(i < resultSetMetaData.getColumnCount()) {
System.out.print(rs.getObject(resultSetMetaData.getColumnName(i)) + ", ");
} else {
System.out.print(rs.getObject(resultSetMetaData.getColumnName(i)));
}
}
System.out.println();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
closeAll(rs, psmt, conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
2:構(gòu)造一個操作數(shù)據(jù)庫的BaseDao類
public class BaseDao {
/**
* 根據(jù)一些參數(shù)來保存相應(yīng)的對象
* @param sql 要執(zhí)行的sql語句
* @param params 為sql語句中相應(yīng)的參數(shù)賦值
* @return
*/
protected boolean saveOrUpdate(String sql, Object[] params) {
Connection conn = null;
PreparedStatement psmt = null;
boolean flag = false;
conn = DBUtil.getConnection();
if(conn != null) {
try {
psmt = conn.prepareStatement(sql);
for(int i = 1; i <= params.length; i++) {
psmt.setObject(i, params[i-1]);
}
if(psmt.executeUpdate() > 0) {
flag = true;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
DBUtil.closeAll(null, psmt, conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return flag;
}
/**
* 根據(jù)一定的參數(shù)獲得某個具體的對象
* @param sql 要執(zhí)行的sql語句
* @param params 為sql語句中相應(yīng)的參數(shù)賦值
* @return
*/
public Object queryForObject(String sql, Object[] params, RowMapForObject rowMapForObject) {
Connection conn = null;
PreparedStatement psmt = null;
conn = DBUtil.getConnection();
Object obj = null;
ResultSet rs = null;
if(conn != null) {
try {
psmt = conn.prepareStatement(sql);
if(params != null && params.length > 0) {
for(int i = 1; i <= params.length; i++) {
psmt.setObject(i, params[i - 1]);
}
}
rs = psmt.executeQuery();
obj = rowMapForObject.rowMapForObject(rs);
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
DBUtil.closeAll(null, psmt, conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return obj;
}
/**
* 根據(jù)相應(yīng)的參數(shù)獲得查詢的結(jié)果集
* @param sql
* @param params
* @return
*/
public List queryForList(String sql, Object[] params, RowMapForList rowMapForList) {
Connection conn = null;
PreparedStatement psmt = null;
conn = DBUtil.getConnection();
List list = null;
ResultSet rs = null;
if(conn != null) {
try {
psmt = conn.prepareStatement(sql);
if(params != null && params.length > 0) {
for(int i = 1; i <= params.length; i++) {
psmt.setObject(i, params[i - 1]);
}
}
rs = psmt.executeQuery(sql);
list = new ArrayList();
list = rowMapForList.rowMapForList(rs);
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
DBUtil.closeAll(null, psmt, conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return list;
}
}
3:新建一個StudentDao類,該類繼承自BaseDao,實現(xiàn)對Student的管理
public class StudentDao extends BaseDao {
/**
* 保存一個Student的信息
*/
public boolean saveStudent(Student student) {
String sql = "insert into t_student(name, age) values(?, ?)";
Object[] params = new Object[]{student.getName(), student.getAge()};
return super.saveOrUpdate(sql, params);
}
/**
* 根據(jù)id獲得一個Student的信息
* @param id
* @return
*/
public Student getStudentById(long id) {
String sql = "select * from t_student where id=?";
Object[] params = new Object[]{id};
return (Student)super.queryForObject(sql, params, new RowMapForObject() {
public Object rowMapForObject(ResultSet rs) {
Student student = null;
try {
if(rs != null && rs.next()) {
student = new Student();
student.setAge(rs.getInt(Student.AGE));
student.setId(rs.getLong(Student.ID));
student.setName(rs.getString(Student.NAME));
}
} catch (SQLException e) {
e.printStackTrace();
}
return student;
}
});
}
/**
* 獲得所有Student的信息
* @return
*/
public List getStudentAll() {
String sql = "select * from t_student";
List list = super.queryForList(sql, null, new RowMapForList() {
@Override
public List rowMapForList(ResultSet rs) {
List list = null;
try {
if(rs != null) {
list = new ArrayList();
while(rs.next()) {
Student student = new Student();
student.setId(rs.getLong("id"));
student.setAge(rs.getInt("age"));
student.setName(rs.getString("name"));
list.add(student);
}
}
} catch(SQLException e) {
e.printStackTrace();
}
return list;
}
});
return list;
}
}
如有疑問請留言或者到本站社區(qū)交流討論,大家共同進(jìn)步,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Java設(shè)計模式之備忘錄模式(Memento模式)介紹
這篇文章主要介紹了Java設(shè)計模式之備忘錄模式(Memento模式)介紹,memento是一個保存另外一個對象內(nèi)部狀態(tài)拷貝的對象,這樣以后就可以將該對象恢復(fù)到原先保存的狀態(tài),需要的朋友可以參考下2015-03-03
Springboot如何實現(xiàn)Web系統(tǒng)License授權(quán)認(rèn)證
這篇文章主要介紹了Springboot如何實現(xiàn)Web系統(tǒng)License授權(quán)認(rèn)證,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-05-05
Java如何向主函數(shù)main中傳入?yún)?shù)
這篇文章主要介紹了Java如何向主函數(shù)main中傳入?yún)?shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
SpringBoot下使用自定義監(jiān)聽事件的流程分析
事件機(jī)制是Spring的一個功能,目前我們使用了SpringBoot框架,所以記錄下事件機(jī)制在SpringBoot框架下的使用,同時實現(xiàn)異步處理,這篇文章主要介紹了SpringBoot下使用自定義監(jiān)聽事件,需要的朋友可以參考下2023-08-08
java哈希算法HashMap經(jīng)典面試題目匯總解析
這篇文章主要為大家介紹了java哈希算法HashMap的經(jīng)典面試題目匯總及問題解析,幫助大家徹底征服面試官,實現(xiàn)薪資自由,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-03-03
在SpringBoot中通過jasypt進(jìn)行加密解密的方法
今天小編就為大家分享一篇關(guān)于在SpringBoot中通過jasypt進(jìn)行加密解密的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01
使用JMeter從JSON響應(yīng)的URL參數(shù)中提取特定值
在使用Apache JMeter進(jìn)行API測試時,我們經(jīng)常需要從JSON格式的響應(yīng)中提取特定字段的值,這可以通過使用JMeter內(nèi)置的JSON提取器和正則表達(dá)式提取器來完成,本文介紹JMeter JSON提取特定值的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧2024-03-03

