文章目錄
RowMaper的使用
/**
* RowMaper Test
*/
@Test
public void test_RowMapper() {
//學生成績表字段映射類 -- 局部內部類
class Score{
private Integer id;
private String sid;
private Integer chinese;
private Integer math;
private Integer english;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public Integer getChinese() {
return chinese;
}
public void setChinese(Integer chinese) {
this.chinese = chinese;
}
public Integer getMath() {
return math;
}
public void setMath(Integer math) {
this.math = math;
}
public Integer getEnglish() {
return english;
}
public void setEnglish(Integer english) {
this.english = english;
}
@Override
public String toString() {
return "Score{" +
"id=" + id +
", sid='" + sid + '\'' +
", chinese=" + chinese +
", math=" + math +
", english=" + english +
'}';
}
}
// query(String sql, RowMapper<T> rowMapper); ==> List<T>
template.query
List<Score> score_list = template.query("select * from t_score", new RowMapper<Score>() {
@Override
public Score mapRow(ResultSet resultSet, int i) throws SQLException {
// i 爲 當前記錄(一條記錄一個set)的index(索引)
System.out.println(i);
Score s = new Score();
s.setId(resultSet.getInt(1));
s.setSid(resultSet.getString(2));
s.setChinese(resultSet.getInt(3));
s.setMath(resultSet.getInt(4));
s.setEnglish(resultSet.getInt(5));
//返回,最終會存儲到List<Score>
return s;
}
});
score_list.forEach(System.out::println);
// 輸出
// 0
// 1
// 2
// 3
// 4
// Score{id=1, sid='20181515114', chinese=54, math=54, english=96}
// Score{id=2, sid='20181515101', chinese=55, math=80, english=99}
// Score{id=3, sid='20181515102', chinese=98, math=88, english=79}
// Score{id=4, sid='20181515105', chinese=80, math=80, english=78}
// Score{id=7, sid='20181515103', chinese=50, math=20, english=88}
}
RowCallbackhandler的使用
RowCallbackHandler函數回調可以獲取到ResultSet結果, 用戶對其處理後可直接對數據庫中的數據進行更新.
/**
* RowCallbackhandler
*/
@Test
public void test_RowCallbackhandler() {
//RowCallbackHandler函數回調可以獲取到ResultSet結果, 用戶對其處理後可直接對數據庫中的數據進行更新.
// query(String sql, RowCallbackHandler rch) ==> void
template.query("", new RowCallbackHandler() {
@Override
public void processRow(ResultSet resultSet) throws SQLException {
// TODO 操作resultSet
}
});
}
ResultSetExtractor的使用
/**
* ResultSetExtractor
*/
@Test
public void test_ResultSetExtractor() {
Score score = template.query("select * from t_score where id=?", new ResultSetExtractor<Score>() {
@Override
public Score extractData(ResultSet resultSet) throws SQLException, DataAccessException {
if(!resultSet.isFirst())resultSet.next();
Score s = new Score();
s.setId(resultSet.getInt(1));
s.setSid(resultSet.getString(2));
s.setChinese(resultSet.getInt(3));
s.setMath(resultSet.getInt(4));
s.setEnglish(resultSet.getInt(5));
//返回,最終會存儲到Score
return s;
}
}, 1);
System.out.println(score);//Score{id=1, sid='20181515114', chinese=54, math=54, english=96}
}
PreparedStatementCreator的使用
/**
* PreparedStatementCreator
*/
@Test
public void test_PreparedStatementCreator() {
// query(PreparedStatementCreator psc,RowCallbackHandler rch); ==> void
String sql = "select * from t_score where english>=?";
template.query(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
//在這裏可以拿到connection對象來創建PreparedStatement對象來執行更復雜的SQL操作.
PreparedStatement ps = connection.prepareStatement(sql);
ps.setInt(1,80);
return ps;
}
}, new RowCallbackHandler() {
@Override
public void processRow(ResultSet resultSet) throws SQLException {
// TODO 操作resultSet
}
});
}
PreparedStatementSetter的使用
/**
* PreparedStatementSetter
*/
@Test
public void test_PreparedStatementSetter() {
// query(String sql, PreparedStatementSetter pss, ResultSetExtractor<T> rse); ==> T
Score score = template.query("select * from t_score where id=?", new PreparedStatementSetter() {
@Override
public void setValues(PreparedStatement preparedStatement) throws SQLException {
// 執行預處理操作
preparedStatement.setInt(1,1);
}
}, new ResultSetExtractor<Score>() {
@Override
public Score extractData(ResultSet resultSet) throws SQLException, DataAccessException {
if(!resultSet.isFirst())resultSet.next();
Score s = new Score();
s.setId(resultSet.getInt(1));
s.setSid(resultSet.getString(2));
s.setChinese(resultSet.getInt(3));
s.setMath(resultSet.getInt(4));
s.setEnglish(resultSet.getInt(5));
//返回,最終會存儲到Score
return s;
}
});
System.out.println(score);//output: Score{id=1, sid='20181515114', chinese=54, math=54, english=96}
}
ConnectionCallback的使用
/**
* ConnectionCallback
*/
@Test
public void test_ConnectionCallback() {
// execute(ConnectionCallback<T> action); ==> T
Score score = template.execute(new ConnectionCallback<Score>() {
@Override
public Score doInConnection(Connection connection) throws SQLException, DataAccessException {
//在這裏可以得到Connection對象
//然後通過Connection對象創建PreparedStatement對象
//執行SQL操作獲得ResultSet對象
//示例話Score對象,賦值並返回
return ScoreInstance;
}
});
}
StatementCallback
/**
* StatementCallback
*/
@Test
public void test_StatementCallback() {
// execute(StatementCallback<T> action); ==> T
Score score = template.execute(new StatementCallback<Score>() {
@Override
public Score doInStatement(Statement statement) throws SQLException, DataAccessException {
//通過statement執行SQL語句 並 獲得ResultSet對象
//實例例話Score對象,賦值並返回
return scoreInstance;
}
});
}
RowMapper與RowCountCallbackHandler使用對比
引自:https://blog.csdn.net/u013476542/article/details/53257788
總結
通過上面大量的示例我們可以看到一種編程方式:函數接口式編程. 這種編程方式爲我們提供了更靈活的編程方式, 從而使JdbcTemplate變的更加普適.
優點:
- 使方法的使用者有了更多的選擇
- 可以使工具類變的更加普適(適應更多需求)
- 可以使調用者獲取類內部數據, 進而進行操作
Q&A 請指正!