简介
在上篇中,我们完成了MyBatis一部分功能的搭建,已经能通过Mapper接口类的编写,自动执行相关的语句了,接下来完善结果处理部分
最终效果展示
修改下我们的Mapper
public interface PersonMapper {
@Select("select * from person")
List<Person> list();
@Insert("insert into person (id, name) values ('1', '1')")
void save();
}
测试代码如下:
public class SelfMybatisTest {
@Test
public void test() {
try(SelfSqlSession session = buildSqlSessionFactory()) {
PersonMapper personMapper = session.getMapper(PersonMapper.class);
personMapper.save();
List<Person> personList = personMapper.list();
for (Object person: personList) {
System.out.println(person.toString());
}
}
}
public static SelfSqlSession buildSqlSessionFactory() {
String JDBC_DRIVER = "org.h2.Driver";
String DB_URL = "jdbc:h2:file:./testDb";
String USER = "sa";
String PASS = "";
HikariConfig config = new HikariConfig();
config.setJdbcUrl(DB_URL);
config.setUsername(USER);
config.setPassword(PASS);
config.setDriverClassName(JDBC_DRIVER);
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
DataSource dataSource = new HikariDataSource(config);
SelfConfiguration configuration = new SelfConfiguration(dataSource);
configuration.addMapper(PersonMapper.class);
return new SelfSqlSession(configuration);
}
}
输出如下:
add sql source: mapper.mapper.PersonMapper.list
add sql source: mapper.mapper.PersonMapper.save
executor
executor
Person(id=1, name=1)
成功的返回我们自定义的Person对象,这个Demo已经有一点样子,算是达成了目标
下面是实现的相关细节
Demo编写
完整的工程已放到GitHub上:https://github.com/lw1243925457/MybatisDemo/tree/master/
本篇文章的代码对应的Tag是: V2
思路梳理
要实现SQL查询结果到Java对象的转换,我们需要下面的东西:
- 1.返回的Java对象信息
- 2.对应的SQL表字段信息
- 3.SQL字段值到Java对象字段的转换处理
- 4.读取SQL结果,转换成Java对象
1.返回的Java对象信息
我们需要知道当前接口方法返回的Java对象信息,方便后面的读取SQL查询结果,转换成Java对象
借鉴MyBatis,我们定义下面一个类,来保存接口方法返回的对象和SQL查询结果字段与Java对象字段的TypeHandler处理器
@Builder
@Data
public class ResultMap {
private Object returnType;
private Map<String,TypeHandler> typeHandlerMaps;
}
2.对应的SQL表字段信息
在以前的MyBatis源码解析中,我们大致知道获取TypeHandler是根据JavaType和JdbcType,我们就需要知道数据库表中各个字段的类型,方便后面去匹配对应的TypeHandler
我们在程序初始化的时候,读取数据库中所有的表,保存下其各个字段对应的jdbcType
可能不同表中有相关的字段,但是不同的类型,所以第一层是表名,第二层是字段名称,最后对应其jdbcType
代码如下:
public class SelfConfiguration {
/**
* 读取数据库中的所有表
* 获取其字段对应的类型
* @throws SQLException e
*/
private void initJdbcTypeCache(