mybatis执行sql语句的概述
在下面的测试代码中,setUp 方法用于创建 SqlSessionFactory 工厂,该SqlSessionFactory 工厂的用途是创建 SqlSession。
private static SqlSessionFactory sqlSessionFactory;
@BeforeAll
static void setUp() throws Exception {
// create an SqlSessionFactory
try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/batch_test/mybatis-config.xml")) {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
}
}
通过 SqlSession
可为我们的数据库访问接口 UserDao 接口
生成一个代理对象。MyBatis 会将接口方法 getUser
和 SQL 映射文件中配置的 SQL 关联起来,这样调用该方法等同于执行相关的 SQL。
@Test
void shouldGetAUserNoException() {
try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH,false)) {
try {
UserDao userdao = sqlSession.getMapper(UserDao.class);
User user = userdao.getUser(1);
} finally {
sqlSession.commit();
}
} catch (Exception e) {
Assertions.fail(e.getMessage());
}
}
SqlSession为mybatis提供功能的原理
利用sqlSessionFactory
建会话对象SqlSession,基于会话sqlSession
对象调用相应的Mapper
方法。但是凭什么我们只需要构建一个SqlSession对象就能够完全操作咱们的MyBatis呢?
这里MyBatis的开发者使用了 外观设计模式 ,将所有的操作Api都封装进了SqlSession内部,让使用者无需关心内部的底层实现就能够使用是不是很完美,那么内部他是如何操作的呢?我们进入到SqlSession内部。
public class DefaultSqlSession implements SqlSession {
private final Configuration configuration;
private final Executor executor;
private final boolean autoCommit;
private boolean dirty;
private List<Cursor<?>> cursorList;
public DefaultSqlSession(Configuration configuration, Executor executor, boolean autoCommit) {
this.configuration = configuration;
this.executor = executor;
this.dirty = false;
this.autoCommit = autoCommit;
}
public DefaultSqlSession(Configuration configuration, Executor executor) {
this(configuration, executor, false);
}
...... 省略代码
}
我们可以里看到SqlSession内部封装了一个Executor对象,也就是MyBatis的执行器,然后通过构造方法传递过来!后续所有的查询逻辑都是调用Executor内的方法来完成的实现,而SqlSession本身不做任何操作,所以就能仅仅通过一个对象,来构建起整个Mybatis框架的使用!