用一个简单的实例来看Mybatis是如何完成一次sql执行的,如下代码块所示:
String resource = "mybatis-config.xml";
// 读取mybatis-config.xml配置定义文件
InputStream inputStream = Resources.getResourceAsStream(resource);
// 使用SqlSessionFactoryBuilder构造SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
// 获取SqlSession,用于操作执行SQL语句
SqlSession sqlSession = sqlSessionFactory.openSession();
Mapper mapper = sqlSession.getMapper(Mapper.class);
Integer[] ids = mapper.selectIds();
代码块的核心目的就是使用Mybatis操作数据库执行selectIds方法中的sql语句,其操作步骤如下:
- 指定Mybatis主配置文件,用于构造SqlSessionFactory
- 使用SqlSessionFactory获取操作执行SQL语句的SqlSession
- 使用SqlSession获取想要执行sql语句所在的Mapper
- 调用Mapper执行sql
主配置文件
在使用Mybatis之前,需要先按照Mybatis官方指定的形式编写一份配置文件,初始定义环境变量、数据库相关参数、mybatis系统参数和自定义TypeHandler等信息。如下mybatis-config.xml配置文件所示,该配置文件使用environments标签指定并设置了development环境下的数据库连接信息,mappers标签用于指定Mapper文件所在的包位置。
在Mybatis启动解析配置文件的过程中,首先会根据当前的环境变量参数获取到其对应的数据库连接信息,然后依次解析配置文件中各个配置项,最后所有解析校验无误将所有解析得到的数据用于构造SqlSessionFactory,以便后续操作使用。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.eugene.mybatis.follow"/>
</mappers>
</configuration>
Mapper
Mybatis的Mapper配置包含两部分,其一是定义Mapper接口,其二是通过XML或者注解的方式配置SQL语句。以上述配置文件mappers标签中的配置为例,所有的Mapper接口都应该放到com.eugene.mybatis.follow包下,如下所示:
@Mapper
public interface Mapper {
@SelectProvider(type = SqlGenerator.class, method = "selectIds")
Integer[] selectIds();
class SqlGenerator{
public static CharSequence selectIds(){
return "select id from login_user";
}
}
}
代码块在com.eugene.mybatis.follow包下定义了一个接口,且用注解的方式将其标识为Mybatis Mapper接口,然后使用注解@SelectProvider指定selectIds方法对应的需要执行的SQL语句。
SqlSession执行SQL语句
SqlSession是Mybatis提供与数据库交互的接口,且其实例通过工厂模式创建而来。从实例代码块可以清晰的看出SqlSession是由SqlSessionFactory对象创建而来,而SqlSessionFactory又是通过解析配置文件后使用SqlSessionFactoryBuilder类build而来。所以在调用SqlSessionFactory中openSession方法即可获得一个与数据库建立连接的SqlSession实例。
SqlSession sqlSession = sqlSessionFactory.openSession();
Mapper mapper = sqlSession.getMapper(Mapper.class);
在通过SqlSessionFactory获得SqlSession之后,就可以操作之前定义的Mapper接口中的SQL语句,从而使得完成SQL语句预定的行为。