一:MyBatis的基本构成
MyBatis的核心组件:
SqlSessionFactoryBuilder(构造器):它会根据配置信息或者代码来生成SqlSessionFactory(工厂接口)
SqlSessionFactory: 依靠工厂来生成SqlSession(会话)
SqlSession:是一个既可以发送SQL去执行并返回结果,也可以获取Mapper的接口
SQL Mapper:它是MyBatis新设计的组件,它是由一个Java接口和XML文件构成的,需要给出对应的SQL和映射规则。它负责发送SQL去执行,并返回结果。
1.1构建SqlSessionFacory
每个MyBatis的应用都是以SqlSessionFactory的实例为中心的,SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactory是个接口。MyBatis提供了两种模式创建SqlSessionFactory,一种是XML配置方式,另外一种是代码方式。推荐使用 XML配置方式。
XML的配置解析后会保存在Configuration(org.apache.ibatis.session.Configuration)中.而这个对象将存在于整个MyBatis应用的生命周期中,可以反复使用,Configuration类对象保存了MyBatis的其他配置信息。
在MyBatis中提供了两个SqlSessionFactory的实现类:DefaultSqlSessionFactory和SqlSessionManager.MyBatis目前使用的是DefaultSqlSessionFactory.
1.2创建SqlSession
SqlSession是一个接口类,它类似于前台的客服,扮演着门面,真正干活的是Executor接口,SqlSession接口 类似JDBC的Connetion。SqlSession的实现类有两个,分别是 DefaultSqlSession和SqlSessionManager
SqlSession的用途主要有两个:1.获取映射器,让映射器通过命名空间和方法名找到对应的SQL,发给数据库执行后返回结果
2.直接通过命名信息执行SQL. iBatis 就是采用的这种方式
1.3映射器
映射器是由Java接口和XML文件共同组成的,其作用:
定义参数类型
描述缓存
描述SQL语句
定义查询结果和POJO的映射关系
映射器的实现方式有两种,一种是通过XML文件方式实现,一般是对应的Mapper.xml文件,另外一种是通过代码方式实现,在Configuration里面注册Mapper接口,Mapper是MyBatis的核心内容,同样也是最为复杂的。
使用XML文件配置是MyBatis实现Mapper的首选方式,它由一个Java接口和一个XML文件构成。
在MyBatis中保留着IBatis,通过"命名空间 + SQL id"的方式发送SQL并返回数据的形式,而不需要获取映射器。
eg: Role role=sqlSession.selectOne("com.learn.mapper.RoleMapper.getRole","role_no").
现在疑惑来了,我们还需要Mapper吗? 肯定是需要的。Mapper是一个接口,相对而言他可以进一步屏蔽SqlSession这个对象,使得它具有更强的业务可读性。其好处有两点:
1.sqlSession.selectOne 是功能性代码,长长的字符串比较晦涩难懂,不包括业务逻辑的含义,不符合面向对象的规范
2.使用Mapper方式,IDE可以坚持Java语法,避免不必要的错误。
关于Mapper接口操作方法的疑惑:
其实它需要用到Java语言的动态代理去实现其对应的实现类。我们在MyBatis上下文中描述这个接口,而MyBatis会为这个接口生成代理类对象,代理对象会根据“接口全路径+方法名”去匹配,找到对应的XMl去完成所需的任务,返回结果。
1.4 生命周期
1.4.1SqlSessionFactoryBuilder:
利用XML或者Java编码获得资源来构建SqlSessionFactory的,它就是一个构建器,一旦构建了SqlSessionFactory,它的作用就已经完结,我们就会把它回收。所以它的生命周期只存在于方法的局部。
1.4.2 SqlSessionFactory
SqlSessionFactory的作用是创建 SqlSession,而SqlSession就像是一个会话,相当于JDBC中的Connection对象。每次应用需要访问数据库时,就需要通过SqlSessionFactory来创建SqlSession,所以SqlSessionFactory会存在MyBatis的整个生命周期中。为了便于管理,将SqlSessionFactory设置为单例模式,方便管理数据库资源的分配
1.4.3 SqlSession
SqlSession是一个会话,相当于JDBC的connection对象,它的生命周期应该是在请求数据库处理事务的过程中。它是一个线程不安全对象,在涉及多线程的时候需要特别担心,另外每次创建SqlSession,用完后需要关闭连接。它存活于一个应用的请求和操作,可以执行多条SQL,保证事务的一致性。
1.4.4 Mapper
Mapper是一个接口,而没有任何实现类,它的作用是发送SQL,然后返回我们需要的结果,因此它应该是在一个SqlSession事务方法之内,是一个方法级别的东西。用完后应该尽量废弃它。