一、MyBatis注解
mybatis注解可以简化mapper.xml的配置,在使用注解时需要将mabatis.xml文件中的< mappers >标签的中的内容使用< pacakge>标签或< mapper class="" >标签
使用示例:
mybatis.xml
<mappers>
<package name="com.xxbb.mapper"/>
</mappers>
UserMapper.java
public interface UserMapper {
@Select("select * from t_user limit #{pageStart},#{pageSize}")
List<User> queryUser(@Param("pageStart") Integer pageStart,@Param("pageSize") Integer pageSize);
}
Test.java
UserMapper userMapper=session.getMapper(UserMapper.class);
Object res= userMapper.queryUser(0,1);
System.out.println(res);
结果
在注解中使用 @Results标签等效于mapper.xml中的resultMapper标签。
@Results(value = {
@Result(id=true,property = "id",column = "id"),
@Result(property = "username",column = "username"),
@Result(property = "password",column = "password"),
@Result(property = "ifFreeze",column = "if_freeze")
})
<resultMap id="UserMap" type="User">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="if_freeze" property="ifFreeze"/>
</resultMap>
二、运行原理
以此段代码为例
InputStream is=Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
UserMapper userMapper=session.getMapper(UserMapper.class);
Object res= userMapper.queryUser(0,1);
1.运行过程中涉及到的类
1.1 Resources ——MyBatis中的IO流工具类,用于加载配置文件
1.2 SqlSessionFactoryBuilder——构建器,用于创建SqlSessionFactory接口的实现类
1.3 XMLConfigBuilder——MyBatis全局配置文件内容构建器
1.4 Configuration——封装了全局配置文件所有的配置信息
1.5 DefaultSqlSessionFactory——由构建器SqlSessionFactoryBuilder创建的SqlSessionFactory接口的实现类
1.6 Transaction——事务类,每一个SqlSession都会有一个Transaction对象
1.7 Environment——获取全局配置文件中< environments >标签内的信息
1.8 TransactionFactory——事务工厂,负责生产事务Transaction
1.9 Executor——MyBatis执行器,负责执行SQL命令,相当于JDBC中的Statement对象(或PreparedStatement、CallableStatement)
1.10 DefaultSqlSession——SqlSession接口的实现类
1.11 ExceptionFactory——MyBatis中的异常工厂
2.运行流程图
3.流程说明
在MyBatis运行开始时需要先通过Resources类加载全局配置文件,接下来实例化SqlSessionFactoryBuilder构建器,帮助SqlSessionFactory接口创建实现类DefaultSqlSesionFactory。
public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
try {
XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
reader.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}
public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
在实例化DefaultSqlSesionFactory之前会先创建一个XmlConfigBuilder解析全局配置文件流,并把解析结果放在Configuration类中,Configuration对象传入DefaultSqlSesionFactory,此时SqlSessionFactory构建完成。
private XMLConfigBuilder(XPathParser parser, String environment, Properties props) {
super(new Configuration());
ErrorContext.instance().resource("SQL Mapper Configuration");
this.configuration.setVariables(props);
this.parsed = false;
this.environment = environment;
this.parser = parser;
}
通过SqlSessionFactory创建SqlSession,每创建一个SqlSession对象时,都会先从Configuration类中全局配置的环境信息,创建Environment对象,TransactionFactory接收Environment对象创建事务对象Transaction;同时还会创建SqlSession的执行器Execute,最后创建一个DefaultSqlSession返回给SqlSession对象。
Transaction tx = null;
try {
final Environment environment = configuration.getEnvironment();
final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
final Executor executor = configuration.newExecutor(tx, execType);
return new DefaultSqlSession(configuration, executor, autoCommit);
} catch (Exception e) {
closeTransaction(tx); // may have fetched a connection so lets call close()
throw ExceptionFactory.wrapException("Error opening session. Cause: " + e, e);
} finally {
ErrorContext.instance().reset();
}