志在指尖
用双手敲打未来

java框架-Mybatis

java结构-Mybatis
一、Mybatis介绍
mybatis是一个耐久层的结构,是对JDBC操作数据库的封装,使开发者只需求关注业务本身,不需求花费精力去处理加载驱动、创立数据库衔接目标、创立statement句子目标、参数设置、成果集处理等一系列繁杂的进程代码。
mybatis经过xml或注解进行装备,将java目标与sql句子中的参数主动映射生成最终履行的sql句子,并将sql句子履行成果主动映射成java目标,回来给业务层(service)运用。
假如面试时被问到请你说一下你对mybatis的了解,你就能够从下面的几个方面简略说一下。JAVA
二、Mybatis结构的工作原理
1)读取MyBatis装备文件:mybatis-config.xml为MyBatis的大局装备文件,装备了MyBatis的运行环境等信息,例如数据库衔接信息。
2)加载映射文件。映射文件即SQL映射文件,该文件中装备了操作数据库的SQL句子,需求在MyBatis装备文件mybatis-config.xml中加载。mybatis-config.xml文件能够加载多个映射文件,每个文件对应数据库中的一张表。
3)结构会话工厂:经过MyBatis的环境等装备信息构建会话工厂SqlSessionFactory。
4)创立会话目标:由会话工厂创立SqlSession目标,该目标中包含了履行SQL句子的所有办法。
5)Executor履行器:MyBatis底层界说了一个Executor接口来操作数据库,它将根据SqlSession传递的参数动态地生成需求履行的SQL句子,一起担任查询缓存的维护。
6)MappedStatement目标:在Executor接口的履行办法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL句子的id、参数等信息。
7)输入参数映射:输入参数类型能够是Map、List等调集类型,也能够是根本数据类型和POJO类型。输入参数映射进程类似于JDBC对preparedStatement目标设置参数的进程。
8)输出成果映射:输出成果类型能够是Map、List等调集类型,也能够是根本数据类型和POJO类型。输出成果映射进程类似于JDBC对成果集的解析进程。
三、Mybatis的中心组件
1、中心组件
1)SqlSessionFactoryBuilder(结构器):它会根据装备或许代码来生成SqlSessionFactory,采用的是分步构建的Builder形式。
2)SqlSessionFactory(工厂接口):依托它来生成SqlSession,运用的是工厂形式。SqlSessionFactory仅有的效果便是出产MyBatis的中心接口目标SqlSession,所以它的职责是仅有的
3)SqlSession(会话):一个既能够发送SQL履行回来成果,也能够获取Mapper的接口。在现有的技术中,一般咱们会让其在业务逻辑代码中“消失”,而运用的是MyBatis供给的SQLMapper接口编程技术,它能进步代码的可读性和可维护性。
4)SQLMapper(映射器):MyBatis新规划存在的组件,它由一个Java接口和XML文件(或注解)构成,需求给出对应的SQL和映射规则。它担任发送SQL去履行,并回来成果。
2、中心组件的效果域
1)SqlSessionFactoryBuilder的效果在于创立SqlSessionFactory,创立成功后,SqlSessionFactoryBuilder就失去了效果,所以它只能存在于创立SqlSessionFactory的办法中,而不要让其长期存在。因而SqlSessionFactoryBuilder实例的最佳效果域是办法效果域(也便是局部办法变量)。
2)SqlSessionFactory能够被以为是一个数据库衔接池,它的效果是创立SqlSession接口目标。由于MyBatis的本质便是Java对数据库的操作,所以SqlSessionFactory的生命周期存在于整个MyBatis的应用之中,所以一旦创立了SqlSessionFactory,就要长期保存它,直至不再运用MyBatis运用,所以能够以为SqlSessionFactory的生命周期就等同于MyBatis的运用周期。
由于SqlSessionFactory是一个对数据库的衔接池,所以它占有着数据库的衔接资源。假如创立多个SqlSessionFactory,那么就存在多个数据库衔接池,这样不利于对数据库资源的操控,也会导致数据库连接资源被耗费光,呈现体系宕机等状况,所以尽量避免发作这样的状况。因而在一般的运用中咱们往往期望SqlSessionFactory作为一个单例,让它在运用中被同享。所以说SqlSessionFactory的最佳效果域是运用效果域。
3)SqlSession就相当于一个数据库衔接(Connection目标),你能够在一个业务里边履行多条SQL,然后经过它的commit、rollback等办法,提交或许回滚业务。所以它应该存活在一个业务恳求中,处理完整个恳求后,应该封闭这条衔接,让它归还给SqlSessionFactory,否则数据库资源就很快被耗费精光,体系就会瘫痪,所以用try…catch…finally…句子来确保其正确封闭。所以SqlSession的最佳的效果域是恳求或办法效果域。
4)Mapper是一个接口,它由SqlSession所创立,所以它的最大生命周期至多和SqlSession保持共同,尽管它很好用,但是由于SqlSession的封闭,它的数据库衔接资源也会消失,所以它的生命周期应该小于等于SqlSession的生命周期。Mapper代表的是一个恳求中的业务处理,所以它应该在一个恳求中,一旦处理完了相关的业务,就应该废弃它。
3、运用XML构建SqlSessionFactory
在MyBatis中的XML分为两类,一类是根底装备文件,一般只要一个,主要是装备一些最根本的上下文参数和运行环境(数据源库衔接等);另一类是映射文件,它能够装备映射联系、SQL、参数等信息。
创立进程:
首先读取mybatis-config.xml,然后经过SqlSessionFactoryBuilder的Builder办法去创立SqlSessionFactory。整个进程比较简略,而里边的步骤还是比较烦琐的,仅仅MyBatis采用了Builder形式为开发者躲藏了这些细节。这样一个SqlSessionFactory就被创立出来了。
SqlSession有2个完结类,分别是
DefaultSqlSession和SqlSessionManager。
DefaultSqlSession是单线程运用的,而SqlSessionManager在多线程环境下运用。SqlSession的效果类似于一个JDBC中的Connection目标,代表着一个衔接资源的启用。详细而言,它的效果有3个:
○获取Mapper接口。
○发送SQL给数据库。
○操控数据库业务。
先来把握它的创立办法,有了SqlSessionFactory创立的SqlSession就非常简略了,如下所示。
SqlSessionsqlSession=SqlSessionFactory.openSession();
四、Mybatis的缓存机制
mybatis供给了缓存机制减轻数据库压力,进步数据库功能
mybatis的缓存分为两级:一级缓存、二级缓存
一级缓存是SqlSession等级的缓存,缓存的数据只在SqlSession内有效
二级缓存是mapper等级的缓存,同一个namespace共用这一个缓存,所以对SqlSession是同享的
一级缓存的详细流程:
1.第一次履行select完毕会将查到的数据写入SqlSession内的HashMap中缓存起来
2.第二次履行select会从缓存中查数据,假如select相同切传参数一样,那么就能从缓存中回来数据,不用去数据库了,然后进步了效率
注意事项:
1.假如SqlSession履行了DML操作(insert、update、delete),并commit了,那么mybatis就会清空当前SqlSession缓存中的所有缓存数据,这样能够确保缓存中的存的数据永久和数据库中共同,避免呈现脏读
2.当一个SqlSession完毕后那么他里边的一级缓存也就不存在了,mybatis默许是敞开一级缓存,不需求装备
3.mybatis的缓存是根据[namespace:sql句子:参数]来进行缓存的,意思便是,SqlSession的HashMap存储缓存数据时,是运用[namespace:sql:参数]作为key,查询回来的句子作为value保存的。
一级缓存小结:
○MyBatis一级缓存的生命周期和SqlSession共同。
○MyBatis一级缓存内部规划简略,仅仅一个没有容量限定的HashMap,在缓存的功能性上有所欠缺。
○MyBatis的一级缓存最大范围是SqlSession内部,有多个SqlSession或许分布式的环境下,数据库写操作会引起脏数据。所以分布式环境下,建议设定缓存等级为Statement。由于在查询办法履行的最后,会判断一级缓存等级是否是STATEMENT等级,假如是的话,就清空缓存。如此一来,便相当于不运用一级缓存。
二级缓存的详细流程:
1.当一个sqlseesion履行了一次select后,在封闭此session的时候,会将查询成果缓存到二级缓存
2.当另一个sqlsession履行select时,首先会在他自己的二级缓存中找(前提是二级缓存敞开),假如没找到,就回去一级缓存中找,找到了就回来,就不用去数据库了,然后减少了数据库压力进步了功能
注意事项与一级缓存共同
二级缓存小结:
○MyBatis的二级缓存相对于一级缓存来说,完结了SqlSession之间缓存数据的同享,一起粒度更加的细,能够到namespace等级,经过Cache接口完结类不同的组合,对Cache的可控性也更强。
○MyBatis在多表查询时,极大或许会呈现脏数据,有规划上的缺陷,安全运用二级缓存的条件比较严苛。
○在分布式环境下,由于默许的MyBatisCache完结都是根据本地的,分布式环境下必然会呈现读取到脏数据,需求运用集中式缓存将MyBatis的Cache接口完结,有必定的开发本钱,直接运用Redis,Memcached等分布式缓存或许本钱更低,安全性也更高。
意思便是,在分布式环境下面,一般不会运用myBatis缓存,由于假如要安全运用,这样开发本钱更高,直接运用Redis会更好。
当敞开缓存后,数据的查询履行的流程便是二级缓存->一级缓存->数据库。
五、Mybatis的业务管理分为两种方法
1)运用JDBC的业务管理机制,便是利用java.sql.Connection目标完结对事物的提交。
2)运用Managed的业务管理机制,这种机制MyBatis本身不会去完结业务管理,而是让程序的容器来完结对业务的管理。

未经允许不得转载:IT技术网站 » java框架-Mybatis
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载