MyBatis学习笔记

Mybatis

使用优点

  1. 不屏蔽SQL,有利于对SQL语句进行优化以及改造,符合在现今互联网应用性能优化的要求
  2. 具有强大、灵活的映射机制,方便Java开发者的使用。而且提供动态SQL的功能,开发者可以根据不同的需求组装SQL,提高代码的可维护性和可读性。
  3. 在Mybatis中,使用Mapper接口编程,只要一个接口和xml文件就可以创建映射器,简化开发人员操作,去掉一些不必要的api,让开发者更多的关注业务逻辑。

核心组件

  • SQLSessionFactoryBuilder(构造器):它会根据配置或者代码生成SqlSessionFactory,采用的是分布构建的Builder模式。
  • SqlSessionFactory(工厂接口):依靠它来生成SqlSession,使用的是工厂模式。
  • SqlSession(会话):一个既可以发送SQL执行返回结果,也可以获取Mapper的接口。在现有的技术中,一般我们会让其在业务逻辑代码中“消失”,而使用的是MyBatis提供的SQL Mapper接口编程技术,提高代码的可维护性和可读性。
  • SQL Mapper(映射器):MyBatis新设计存在的组件,由一个Java接口和XML文件(或注解)构成,需要给出对应的SQL和映射规则。负责发送SQL去执行,并返回结果。

SqlSessionFactory(工厂接口)

使用Mybatis首先是使用配置或者代码去生产SqlSessionFactory,Mybatis提供了构造器SqlSessionFactoryBuilder。我们可以通过读取配置的XML文件的形式生成SqlSessionFactory,也可以通过Java代码的形式来生成。更推荐采用XML的形式,有利于日后维护和修改,避免重新编译代码,如果通过代码的方式,修改比较困难,除非密码这种非明文存放的数据需要被加载,其他情况考虑使用XML形式。
有了配置内容以后,MyBatis会读取配置文件,通过Configuration类对象构建整个MyBatis上下文。其中SqlSessionFactory只是一个接口,它有两个实现类:SqlSessionManager和DefaultSqlSessionFactory。一般采用DefaultSqlSessionFactory去实现,SqlSessionManager使用在多线程环境下,它的具体实现依靠DefaultSqlSessionFactory。

通过XML的方式来构建SqlSessionFactory

在Mybatis中,XML有两类,一类是基础配置文件,有且仅有一个,主要是配置一些最基本的上下文参数以及运行环境;另外一类就是映射文件,可以配置映射关系、SQL、参数等信息。
在MyBatis的基础配置文件中有如下一些配置


1. <typeAlias>该元素定义了一个别名,可以免去我们写类名时需要写类的全限定名,更加简洁
2. <envirment>该元素可以用来描述数据库。其子元素<transactionManager>元素是配置事务管理器,如MyBatis的JDBC管理器方式。子元素<dataSource>配置数据库。
3. <mapper>元素代表引入的那些映射器

有了基础配置,我们就可以通过代码来生成SqlSessionFactory。

SqlSessionFactory sqlSessionFactory = null;
String resource = "mybatis-config.xml";
InputStream inputStream;
try{
	inputStream = Resource.getResourceAsStream(resource);
	sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}catch(IOException e){
	e.printStackTrace();
	}

即首先读取xml配置文件,然后通过SqlSessionFactoryBuilder的Builder方法来创建SqlSessionFactory 。这个过程看起来简单,其实里面的步骤比较繁琐,Mybatis采用了Builder模式为开发者隐藏了这些细节。

通过代码的形式配置

采用的方式类似于创建一个dataSource对象,再调用其set方法来实现参数赋值,代码冗长,除非特殊需要,一般不考虑用这种方式。

SqlSession

在MyBatis中,SqlSession是其核心接口。其包含了两个类,DefaultSqlSession和SqlSessionManager。DefaultSqlSession在单线程中使用,SqlSessionManager则在多线程中使用
	其作用有以下三个
		

 1. 获取Mapper接口
 2. 发送SQL给数据库
 3. 控制数据库的事务

创建SqlSession代码如下

SqlSession sqlSession = SqlSessionFactory.openSession();

SqlSession事务控制伪代码

//定义SqlSession
SqlSession sqlSession = null;
try{
	//打开SqlSession会话
	SqlSession = SqlSessionFactory.openSession();
	//业务代码
	
	//提交事务
	sqlSession.commit();
	}catch(Exception ex){
		//回滚事务
		sqlSession.rollback();
	}finally{
	//在finally语句中确保资源被顺利关闭
	if(sqlSession != null){
		sqlSession.close();
		}
}

映射器

映射器由一个接口和对应的xml文件(或者注解)组成。
配置了如下内容
	

 1. 描述映射规则
 2. 提供SQL语句,并可以配置SQL参数类型、返回类型、缓存刷新等信息。
 3. 配置缓存
 4. 提供动态SQL。

在配置映射器之前我们需要先定义一个POJO,它十分简单,只有私有属性和对应的get、set方法和一些其他方法。
注:我们的Mapper只是一个接口,而不是具体的实现类,接口不能直接运行,MyBatis运用了动态代理技术使得接口能够运行起来,即MyBatis会为这个接口生成一个代理对象,代理对象会处理相关逻辑。
在具体工作代码中,更建议使用XML的方式来配置Mapper,而不是注解的方式,因为工作中,Sql语句会十分的长,直接注解会使得代码可读性变差。
MyBatis拥有两种发送SQL的方式

  1. 通过SqlSession直接发送
  2. 通过SqlSession获取Mapper接口再发送
    主要采用后者。

生命周期

  1. SqlSessionFactoryBuilder:其作用在于创建SqlSessionFactory,创建成功后,SqlSessionFactoryBuilder就失去作用了,所以它只存在于创建SqlSessionFactory的方法中,不要让其长期存在。
  2. SqlSessionFactory:我们可以将其当做一个数据库连接池,其作用是创建SqlSession接口对象。MyBatis的本质是Java操作数据库,所以其生命周期存在于整个MyBatis应用之中,所以一旦创建后,就要长期保存它,直至不再使用MyBatis应用,所以可以认为其生命周期等同于MyBatis的应用周期。如果我们创建多个SqlSessionFactory,将会导致数据库连接资源被消耗,出现系统宕机等情况。所以应当采用单例模式来使用,在应用中被共享。
  3. SqlSession:如果说SqlSessionFactory类似于连接池,那么SqlSession就类似与Connection对象,我们可以在一个事务中执行多条语句,然后通过他的commit、rollback等方法,提交或者回滚事务。所以其应该存活在一个业务请求中,处理完后,应该关闭这个连接,让其归还给SqlSessionFactory,否则数据库资源可能会很快耗光,系统瘫痪,所以用try…catch…finally…语句来确保其正确关闭。
  4. Mapper:Mapper是一个接口,由SqlSession所创建,所以它的最大生命周期至多和SqlSession保持一致
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值