文章目录
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 请指正!