mybatis核心组件生命周期管理
1.sqlSessionFactoryBuilder 构建器 存在的意义就是创建sqlSessionFactory,用完既废弃 即可
2.sqlSessionFactory 创建sqlSession 应使用单例模式,方便管理数据库连接,节约数据库连接资源,其生命周期存在于应用的整个声明周期中
`private static SqlSessionFactory factory = null;//类线程锁private static final Class CLASS_LOCK = SqlSesssionFactoryUtils.class;public static SqlSessionFactory initSqlSessionFactory() {String resource = “mybatis-config.xml”;InputStream inputStream = null;try {inputStream = Resources.getResourceAsStream(resource);} catch (Exception e) {// TODO: handle exception}/* 使用锁机制,防止多线程环境下 生成多个facotry对象 /synchronized (CLASS_LOCK) {if (factory == null) {factory = new SqlSessionFactoryBuilder().build(inputStream);}}return factory;}public static SqlSession openSqlSession() {if (factory ==null) {initSqlSessionFactory();}return factory.openSession();}`
3.sqlsession 会话对象. 是线程不安全的.其生命周期是在数据库处理请求的过程中.必须要及时关闭
4.mapper 其生命周期最大也在sqlSession生命周期之内.用完会即销毁.
MyBatis核心组件
- SqlSessionFactoryBuilder(构造器):
根据配置或者代码生成SqlSessionFactory,采用的是分布构建的Builder模式 - SqlSessionFactory(工厂接口):
使用工厂模式生成SqlSession - SqlSession(会话):
一个既可以发送SQL执行返回结果,也可以获得Mapper的接口。 - Sql Mapper(映射器):
由一个Java接口和XML文件(或注解)构成,需要给出对应的SQL和映射规则。
它负责发送SQL去执行,并返回结果。
无论是SqlSession还是映射器,都可以发送SQL到数据库执行。
SqlSessionFactory(工厂接口)
SqlSessionFactory是一个接口,在MyBatis中存在两个实现类:SqlSessionManager和DefaultSqlSessionFactory。一般而言,具体是由DefaultSqlSessionFactory去实现的,SqlSessionManager使用在多线程的环境中。
每个基于MyBatis的应用都是以一个SqlSessionFactory的实例为中心的,而SqlSessionFactory唯一的作用就是生产MyBatis的核心对象SqlSession,所以它的责任是唯一的。我们往往会采用单例模式处理它。
使用XML构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = null;String resource = "mybatis-config.xml";InputStream inputStream;try { inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch(Exception e) {}
SqlSession
与SqlSessionFactory一样,SqlSession也是一个接口,并且有两个实现类:DefaultSqlSession和SqlSessionManager。DefaultSqlSession是单线程使用的,SqlSessionManager是多线程使用的。
SqlSession的作用类似于JDBC中的Connection对象,代表着一个连接资源的启用。
具体地,SqlSession的作用有以下三点:
- 获取Mapper接口
- 发送SQL给数据库
- 控制数据库事务
创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
映射器
映射器是MyBatis中最重要、最复杂的组件,它由一个接口和对应的XML文件(或注解)组成。
映射器可以配置以下内容:
描述映射规则
提供SQL语句,并可以配置SQL参数类型、返回类型、缓存刷新等信息
配置缓存
提供动态SQL
其主要作用就是将SQL查询到的结果映射为一个POJO,或者将POJO的数据插入到数据库中,并定义一些有关缓存等的重要内容。
实现映射器之前,先定义一个简单Java对象(POJO)
package com.zpc.pojopublic class Role { private Long id; private String roleName; private String note; /** the Setter and Getter mothods**/}
使用XML实现映射器
使用XML定义映射器分为接口和XML两部分
接口
package com.zpc.mapper;public interface RoleMapper { public Role getRole(Long id);}
SqlSession配置文件
Mapper配置文件
select id, role_name as roleName, note from t_role where id = #{id}
Mapper配置文件讲解
- 元素中的namespace所对用的是一个接口的全限定名,于是MyBatis上下文就可以通过它找到相对应的接口。
- 元素表明这是一条查询语句,其属性id标识了这条SQl,属性parameterType="long"说明传递给SQL的是一个long类型参数,resultType="role"表示返回的是一个role类型的返回值,role是之前在mybatis-config.xml文件中配置的别名,指代com.zpc.pojo.Role
- select语句中的#{id}表示传递进去的参数。
MyBatis默认提供自动映射功能:
只要SQL返回的结果中的列名和POJO中的属性名是对应的,就可以提供自动映射。
在上面的示例中id和note是自动映射的,数据库中的字段role_name在查询的时候设置列别名为roleName和POJO中的roleName是对应的,也是可以自动映射的。
使用注解生成映射器
使用注解生成映射器仅仅需要一个接口就可以实现
package com.zpc.mapperpublic interface RoleMapper2 { @Select("select id,role_name as roleName,note from t_role where id = #{id}") public Role getRole(Long id);}
如果同时使用XML和注解两种方式生成映射器,XML配置会覆盖掉注解内容
使用SqlSession和Mapper接口发送SQL
- 使用SqlSession发送SQL:
Role role = (Role)sqlSession.selectOne("com.zpc.mapper.RoleMapper.getRole", 1L);
selectOne方法表示使用查询并且只返回一个对象,String类型的参数是为了完全定位一条SQL语句,后面传入的参数供SQL语句传参使用。
- 使用Mapper接口发送SQL:
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);Role role = roleMapper.getRole(1L);
两种发送SQL的方法的比较:
使用Mapper接口编程可以消除SqlSession带来的功能性代码,提高可读性,而SqlSession发送SQL,需要一个SQL id去匹配SQL,比较晦涩难懂。使用Mapper接口,类似roleMapper.getRole(1L)完全是面向对象的语言,更能体现业务的逻辑。使用Mapper.getRole(1L)方式,IDE会进行错误校验和提示,而使用sqlSession.selectOne(“getRole”, 1L)语法,只有在运行时才能知道是否产生错误。
到此这篇关于文章就结束了!
总结
外本人整理了一些Mybatis的视频资料,一共有8集,以及各种Java的学习视频以及资料,免费分享给大家,想要资料的可以点赞关注私信 ‘资料’ 即可免费领取。深入底层,剖析源码。了解本质。 爱编程,爱生活,爱分享!
希望对大家有所帮助,有用的话点赞给我支持!