Mybatis源码解析--ResultHandler
背景
在Mybatis源码解析--ResultsetHandler中我们知道ResultsetHandler是对JDBC中Statement结果集的处理。而StatementHandler
将Statement
的参数设置和结果集的解析逻辑分别交给ParameterHandler
和ResultSetHandler
进行处理,本篇就来研究ResultsetHandler
的内部实现。
ResultHandler的创建
public ResultSetHandler newResultSetHandler(Executor executor, MappedStatement mappedStatement, RowBounds rowBounds, ParameterHandler parameterHandler,
ResultHandler resultHandler, BoundSql boundSql) {
ResultSetHandler resultSetHandler = new DefaultResultSetHandler(executor, mappedStatement, parameterHandler, resultHandler, boundSql, rowBounds);
resultSetHandler = (ResultSetHandler) interceptorChain.pluginAll(resultSetHandler);
return resultSetHandler;
}
ResultHandler与JDBC
JAVA对象的属性与表字段一致
JDBC方式解析结果集
String sql = "SELECT id, name, age FROM t_student WHERE id = ?";
PrepareStatement statement = connection.prepareStatement(sql);
//设置参数
statement.setInt(1, 23);
//执行sql
statement.execute();
//获取结果集
resultSet = statement.getResultSet();
//处理结果集
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
Student student = new Student(id, name, age);
}
JDBC的方式是在每个方法的内部定义SQL,设置参数、执行SQL、解析结果,而Mybatis
ResultSetHandler方式解析结果集
XML配置方式
<select id="selectStudentById" resultType="com.xxxx.Student">
select id, name, age from t_student where id = #{id}
</select>
@Select({"SELECT id, name, age FROM t_student WHERE id = #{id}"})
Student selectStudentById(Integer id);
JAVA对象的属性与表字段不一致
JDBC方式解析结果集
String sql = "SELECT n_id, c_name, n_age FROM t_student WHERE id = ?";
PrepareStatement statement = connection.prepareStatement(sql);
//设置参数
statement.setInt(1, 23);
//执行sql
statement.execute();
//获取结果集
resultSet = statement.getResultSet();
//处理结果集
while (resultSet.next()) {
int id = resultSet.getInt("n_id");
String name = resultSet.getString("c_name");
int age = resultSet.getInt("n_age");
Student student = new Student(id, name, age);
}
由于JDBC方式由开发人员自己在方法中实现,所以只需要指定获取的字段即可