我们已经分析了MeBatis 的主要对象和操作流程,应该从哪里入手?
当我们在psvm 操作的时候,第一个需要的对象是SqlSession。所以我们从应用层的接口SqlSession 入手。
那么我们先来创建一个package,它是我们手写的MeBatis ,我们建一个包叫mebatis。
首先我们创建一个自己的SqlSession,叫SqlSession。
根据我们刚才总结的流程图,SqlSession 需要有一个获取代理对象的方法,那么这个代理对象是从哪里获取到的呢?是从我们的配置类里面获取到的,因为配置类里面有接口和它要产生的代理类的对应关系。
所以,我们要先持有一个Configuration 对象,叫GPConfiguration,我们也创建这个类。除了获取代理对象之外,Configuration 里面还存储了我们的接口方法(也就是statementId)和SQL 语句的绑定关系。
第二个,我们在SqlSession 中定义的操作数据库的方法,最后都会调用Executor去操作数据库,所以我们还要持有一个Executor 对象,叫Executor,我们也创建它。
// SqlSession.java
private Configuration configuration;
private Executor executor;
除了这两个属性之外,我们还要定义SqlSession 的行为,也就是它的主要的方法。
第一个方法是查询方法,selectOne(),由于它可以返回任意类型,我们把返回值定义成<T> T 泛型。selectOne()有两个参数,一个是String 类型的statementId,我们会根据它找到SQL 语句。一个是Object 类型的parameter 参数(可以是Integer 也可以是String 等等,任意类型),用来填充SQL 里面的占位符。
它会调用Executor 的query()方法,所以我们创建Executor 类,传入这两个参数,一样返回一个泛型。Executor 里面要传入SQL,但是我们还没拿到,先用statementId代替。
// SqlSession.java
public <T> T selectOne(String statementId, Object parameter){
String sql = statementId; // 先用statementId 代替SQL
return executor.query(sql, parameter);
}
// Executor.java
public <T> T query(String sql, Object paramater ) {
return null;
}
第二个方法是获取代理对象的方法,我们通过这种方式去避免了statementId 的硬编码。
我们在SqlSession 中创建一个getMapper()的方法,由于可以返回任意类型的代理类,所以我们把返回值也定义成泛型<T> T。我们是根据接口类型获取到代理对象的,所以传入参数要用类型Class。
// SqlSession.java
public <T> T getMapper(Class clazz){
return null;
}