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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis 目录(?)[-] mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis实战教程mybatis in action之三实现数据的增删改查 mybatis实战教程mybatis in action之四实现关联数据的查询 mybatis实战教程mybatis in action之五与spring3集成附源码 mybatis实战教程mybatis in action之六与Spring MVC 的集成 mybatis实战教程mybatis in action之七实现mybatis分页源码下载 mybatis实战教程mybatis in action之八mybatis 动态sql语句 mybatis实战教程mybatis in action之九mybatis 代码生成工具的使用 mybatis SqlSessionDaoSupport的使用附代码下载 转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过Hibernate了那这个就非常的简单) (再加一条,其实大家可以看官方的教程更好些:http://mybatis.github.io/mybatis-3/,而且如果英文不是很好的那就看中文的:http://mybatis.github.io/mybatis-3/zh/sqlmap-xml.html) 写在这个系列前面的话: 以前曾经用过ibatis,这是mybatis的前身,当时在做项目时,感觉很不错,比hibernate灵活。性能也比hibernate好。而且也比较轻量级,因为当时在项目中,没来的及做很很多笔记。后来项目结束了,我也没写总结文档。已经过去好久了。但最近突然又对这个ORM 工具感兴趣。因为接下来自己的项目中很有可能采用这个ORM工具。所以在此重新温习了一下 mybatis, 因此就有了这个系列的 mybatis 教程. 什么是mybatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个共同点: 1. 从配置文件(通常是XML配置文件中)得到 sessionfactory. 2. 由sessionfactory 产生 session 3. 在session 中完成对数据的增删改查和事务提交等. 4. 在用完之后关闭session 。 5. 在java 对象和 数据库之间有做mapping 的配置文件,也通常是xml 文件。 mybatis实战教程(mybatis in action)之一:开发环境搭建 mybatis 的开发环境搭建,选择: eclipse j2ee 版本,mysql 5.1 ,jdk 1.7,mybatis3.2.0.jar包。这些软件工具均可以到各自的官方网站上下载。 首先建立一个名字为 MyBaits 的 dynamic web project 1. 现阶段,你可以直接建立java 工程,但一般都是开发web项目,这个系列教程最后也是web的,所以一开始就建立web工程。 2. 将 mybatis-3.2.0-SNAPSHOT.jar,mysql-connector-java-5.1.22-bin.jar 拷贝到 web工程的lib目录. 3. 创建mysql 测试数据库和用户表,注意,这里采用的是 utf-8 编码 创建用户表,并插入一条测试数据 程序代码 程序代码 Create TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `userName` varchar(50) DEFAULT NULL, `userAge` int(11) DEFAULT NULL, `userAddress` varchar(200) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; Insert INTO `user` VALUES ('1', 'summer', '100', 'shanghai,pudong'

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值