MyBatis入门学习(五)——MyBatis注解和运行原理

一、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();
    }
发布了35 篇原创文章 · 获赞 7 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_44804750/article/details/105086134