配色: 字号:
第7章 MyBatis的核心配置
2021-05-25 | 阅:  转:  |  分享 
  
学习目标掌握映射文件中常用元素的使用了解MyBatis的基础知识核心对象的作用熟悉配置文件中各个元素的作用7.1MyBatis的核心对象
7.1.1SqlSessionFactory什么是SqlSessionFactory?SqlSessionFactory是MyB
atis框架中十分重要的对象,它是单个数据库映射关系经过编译后的内存镜像,其主要作用是创建SqlSession。SqlSessio
nFactory对象的实例可以通过SqlSessionFactoryBuilder对象来构建,而SqlSessionFactory
Builder则可以通过XML配置文件或一个预先定义好的Configuration实例构建出SqlSessionFactory的实
例。构建SqlSessionFactory通过XML配置文件构建出的SqlSessionFactory实例现代码如下:InputS
treaminputStream=Resources.getResourceAsStream("配置文件位置");SqlSe
ssionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().
build(inputStream);SqlSessionFactory对象是线程安全的,它一旦被创建,在整个应用执行期间都会存在
。如果我们多次的创建同一个数据库的SqlSessionFactory,那么此数据库的资源将很容易被耗尽。为此,通常每一个数据库都会
只对应一个SqlSessionFactory,所以在构建SqlSessionFactory实例时,建议使用单列模式。7.1.2S
qlSession1.什么是SqlSession?SqlSession是MyBatis框架中另一个重要的对象,它是应用程序与持久层
之间执行交互操作的一个单线程对象,其主要作用是执行持久化操作。每一个线程都应该有一个自己的SqlSession实例,并且该实例是不
能被共享的。同时,SqlSession实例也是线程不安全的,因此其使用范围最好在一次请求或一个方法中,绝不能将其放在一个类的静态字
段、实例字段或任何类型的管理范围(如Servlet的HttpSession)中使用。使用完SqlSession对象后要及时关闭,通
常可以将其放在finally块中关闭。SqlSessionsqlSession=sqlSessionFactory.open
Session();try{//此处执行持久化操作}finally{sqlSession.close();}2.Sql
Session中的方法查询方法:TselectOne(Stringstatement);TselectOne
(Stringstatement,Objectparameter);ListselectList(Strin
gstatement);ListselectList(Stringstatement,Objectpara
meter);ListselectList(Stringstatement,Objectparameter,
RowBoundsrowBounds);voidselect(Stringstatement,Objectparame
ter,ResultHandlerhandler);插入、更新和删除方法:intinsert(Stringstatemen
t);intinsert(Stringstatement,Objectparameter);intupdate(Stri
ngstatement);intupdate(Stringstatement,Objectparameter);int
delete(Stringstatement);intdelete(Stringstatement,Objectpara
meter);其他方法:voidcommit();提交事务的方法。voidrollback();回滚事务的方法。voidcl
ose();关闭SqlSession对象。TgetMapper(Classtype);返回Mapper接口的代理
对象。ConnectiongetConnection();获取JDBC数据库连接对象的方法。3.创建SqlSession为了简化
开发,通常在实际项目中都会使用工具类来创建SqlSession。publicclassMybatisUtils{priv
atestaticSqlSessionFactorysqlSessionFactory=null;static{t
ry{Readerreader=Resources.getResourceAsReader("mybatis-confi
g.xml");sqlSessionFactory=newSqlSessionFactoryBuilder().buil
d(reader);}catch(Exceptione){e.printStackTrace();}}publi
cstaticSqlSessiongetSession(){returnsqlSessionFactory.openS
ession();}}7.2配置文件mybatis-config.xml7.2.1主要元素7.2.2es>元素创建db.propertiesjdbc.driver=com.mysql.jdbc.Driverjdbc.url=j
dbc:mysql://localhost:3306/mybatisjdbc.username=rootjdbc.password
=root配置文件:引入数据库配置torytype="com.unknown.mybatistest.factory.MyObjectFactory">:自定义工
UBLIC"-//mybatis.org//DTDConfig3.0//EN""http://mybatis.org/dt
d/mybatis-3-config.dtd">properties"/>type="com.unknown.mybatistest.po.User"/>ectFactorytype="com.unknown.mybatistest.factory.MyObjectFactory"
>>--1.2.配置id为mysql的数据库环境-->rcetype="POOLED">"${jdbc.driver}"/>"${jdbc.url}"/>e="${jdbc.username}"/>"value="${jdbc.password}"/>onments>known/mybatistest/mapper/CustomerMapper.xml"/>com/unknown/mybatistest/mapper/UserMapper.xml"/>iguration>7.2.3元素元素主要用于改变MyBatis运行时的行为,例如开启二
级缓存、开启延迟加载等。配置方式如下:abled"value="true"/>true"/>>seGeneratedKeys"value="false"/>ior"value="PARTIAL"/>...7.2.4元素Aliases>元素用于为配置文件中的Java类型设置一个简短的名字,即设置别名。别名的设置与XML配置相关,其使用的意义在于减少
全限定类名的冗余。配置是以下二选一。1.使用元素配置别名的方法如下:<
typeAliasalias="user"type="com.unknown.mybatistest.po.User"/><
/typeAliases>2.当POJO类过多时,可以通过自动扫描包的形式自定义别名,具体如下:
MyBat
is框架默认为许多常见的Java类型提供了相应的类型别名,如下表所示。7.2.5元素typeHandl
er的作用就是将预处理语句中传入的参数从javaType(Java类型)转换为jdbcType(JDBC类型),或者从数据库取出结
果时将jdbcType转换为javaType。元素可以在配置文件中注册自定义的类型处理器,它的使用方式
有两种。1.注册一个类的类型处理器wn.mybatistest.type.CustomtypeHandler"/>2.注册一个包中
所有的类型处理器ype"/>7.2.6元素MyBatis中默认的ObjectFa
ctory的作用是实例化目标类,它既可以通过默认构造方法实例化,也可以在参数映射存在的时候通过参数构造方法来实例化。通常使用默认的
ObjectFactory即可。大部分场景下都不用配置和修改默认的ObjectFactory,如果想覆盖ObjectFactor
y的默认行为,可以通过自定义ObjectFactory来实现,具体如下:1.自定义一个对象工厂publicclassMyOb
jectFactoryextendsDefaultObjectFactory{privatestaticfinall
ongserialVersionUID=-4114845625429965832L;publicTcreate
(Classtype){returnsuper.create(type);}publicTcreate
(Classtype,List>constructorArgTypes,List
constructorArgs){returnsuper.create(type,constructorArgTypes,
constructorArgs);}publicvoidsetProperties(Propertiespropert
ies){super.setProperties(properties);}publicbooleanisCol
lection(Classtype){returnCollection.class.isAssignableFrom(
type);}}2.在配置文件中使用元素配置自定义的ObjectFactoryctorytype="com.unknown.mybatistest.factory.MyObjectFactory">opertyname="name"value="MyObjectFactory"/>注意:由于
自定义ObjectFactory在实际开发时不经常使用,这里读者只需要了解即可。7.2.7元素MyBatis允
许在已映射语句执行过程中的某一点进行拦截调用,这种拦截调用是通过插件来实现的。元素的作用就是配置用户所开发的插件
。如果用户想要进行插件开发,必须要先了解其内部运行原理,因为在试图修改或重写已有方法的行为时,很可能会破坏MyBatis原有的核心
模块。关于插件的使用,本教程不做详细讲解,读者只需了解元素的作用即可,有兴趣的读者可以查找官方文档等资料自行学习
。7.2.8元素元素用于对环境进行配置。MyBatis的环境配置实际上就
是数据源的配置,我们可以通过元素配置多种数据源,即配置多种数据库。使用
素进行环境配置的示例如下:d="development">ype="POOLED"><
propertyname="url"value="${jdbc.url}"/>me"value="${jdbc.username}"/>${jdbc.password}"/>...nts>在MyBatis中,可以配置两种类型的事务管理器,分别是JDBC和MANAGED。关于这两个事务管理器的描述如下:JDBC
:此配置直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务的作用域。MANAGED:此配置从来不提交或回滚一
个连接,而是让容器来管理事务的整个生命周期。默认情况下,它会关闭连接,但一些容器并不希望这样,为此可以将closeConnecti
on属性设置为false来阻止它默认的关闭行为。注意:如果项目中使用的是Spring+MyBatis,则没有必要在MyBatis
中配置事务管理器,因为实际开发中,会使用Spring自带的管理器来实现事务管理。1.UNPOOLED(不推荐)配置此数据源类型后,
在每次被请求时会打开和关闭连接。它对没有性能要求的简单应用程序是一个很好的选择。在使用时,需要配置5种属性。2.POOLED(推
荐)此数据源利用“池”的概念将JDBC连接对象组织起来,避免了在创建新的连接实例时所需要初始化和认证的时间。这种方式使得并发Web
应用可以快速的响应请求,是当前流行的处理方式。在使用时,可以配置更多的属性。3.JNDI(不推荐)可以在EJB或应用服务器等容器中
使用。容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用。在使用时,需要配置2个属性。7.2.9
元素元素用于指定MyBatis映射文件的位置,一般可以使用以下4种方法引入映射器文件,具体如下。1.使用类路径引
Mapper.xml"/>2.使用本地文件路径引入/D:/com/unknown/mybatistest/mapper/UserMapper.xml"/>3.使
用接口类引入erMapper"/>4.使用包名引入wn.mybatistest.mapper"/>7.3映射文件7.3.1主要元素在映射文件中,er>元素是映射文件的根元素,其他元素都是它的子元素。7.3.2元素用来映射查询语句,它可
以帮助我们从数据库中读取出数据,并组装数据给业务开发人员。使用元素的
属性大部分相同,但还包含了3个特有属性,这3个属性的描述如下所示。执行插入操作后,很多时候需要返回插入成功的数据生成的主键值,此时
就可以通过上面讲解的3个属性来实现。1.对于支持主键自助增长的数据库(如MySQL),可以通过如下配置实现:="addCustomer"parameterType="com.unknown.mybatistest.po.Customer
"keyProperty="id"useGeneratedKeys="true">insertintot_custom
er(username,jobs,phone)values(#{username},#{jobs},#{phone})ert>2.对于不支持主键自助增长的数据库(如Oracle),可以通过如下配置实现:omer"parameterType="com.unknown.mybatistest.po.Customer">tKeykeyProperty="id"resultType="Integer"order="BEFORE">select
if(max(id)isnull,1,max(id)+1)asnewIdfromt_customerlectKey>insertintot_customer(id,username,jobs,phone)values(#
{id},#{username},#{jobs},#{phone})7.3.4>元素元素的使用比较简单,它们的属性配置也基本相同。1.元素的
常用属性如下:atistest.po.Customer"flushCache="true"statementType="PREPARED"
timeout="20">wn.mybatistest.po.Customer"flushCache="true"statementType="PREP
ARED"timeout="20">2.元素的使用示例如下:eCustomer"parameterType="com.unknown.mybatistest.po.Customer">u
pdatet_customersetusername=#{username},jobs=#{jobs},phone=#{p
hone}whereid=#{id}
rType="Integer">deletefromt_customerwhereid=#{id}
7.
3.5元素在一个映射文件中,通常需要定义多条SQL语句,这些SQL语句的组成可能有一部分是相同的(如多条select语
句中都查询相同的id、username、jobs字段),如果每一个SQL语句都重写一遍相同的部分,势必会增加代码量,导致映射文件过
于臃肿。那么有没有什么办法将这些SQL语句中相同的组成部分抽取出来,然后在需要的地方引用呢?元素的作用就是定义可重用的S
QL代码片段,然后在其他语句中引用这一代码片段。定义一个包含id、username、jobs和phone字段的代码片段如下:lid="customerColumns">id,username,jobs,phone
上述代码片段可以包含在其他语
句中使用,具体如下:esultType="com.unknown.mybatistest.po.Customer">selectrefid="customerColumns"/>fromt_customerwhereid=#{id}ct>7.3.6元素元素表示结果映射集,是MyBatis中最重要也是最强大的元素。它
的主要作用是定义映射规则、级联的更新以及定义类型转化器等。元素中包含了一些子元素,它的元素结构如下所示:esultMaptype=""id="">
onstructor>tionproperty=""/>
discriminator>
使用实例
selectfromt_user7.4本章小结本章主要对MyBatis中的核心对象和核心文件进行了详细讲解。首先讲解了MyBatis中的两个重要核心对象SqlSessionFactory和SqlSession;然后介绍了配置文件中的元素及其使用;最后对映射文件中的几个主要元素进行了详细讲解。通过本章的学习,读者将能够了解MyBatis中两个核心对象的作用,熟悉配置文件中常用元素的使用,并掌握映射文件中常用元素的使用。本章作业简述MyBatis核心对象SqlSessionFactory的获取方式。简述MyBatis映射文件中的主要元素及其作用。预习作业常用的动态SQL元素有哪些?动态SQL元素的作用是什么?
献花(0)
+1
(本文系大量资料原创)