mybatis 返回string_mybatis核心组件生命周期管理

mybatis核心组件生命周期管理

218edc82250a0f3af82643ce31ab506e.png

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,所以它的责任是唯一的。我们往往会采用单例模式处理它。

663e03167b08aab0df3b6e457b151830.png

使用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}  
90638687155edcf3165520b90f937215.png

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的学习视频以及资料,免费分享给大家,想要资料的可以点赞关注私信 ‘资料’ 即可免费领取。深入底层,剖析源码。了解本质。 爱编程,爱生活,爱分享!

ff45248251861cd1e1c75346754f8958.png

希望对大家有所帮助,有用的话点赞给我支持!

e72a8953417073dbc2629116f7df69c1.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值