加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

【MyBatis框架】SqlMapConfig剖析

发布时间:2020-12-16 08:33:55 所属栏目:百科 来源:网络整理
导读:下面对SqlMapConfig.xml中的配置进行详细剖析。 mybatis的全局配置文件SqlMapConfig.xml,配置内容如下: properties(属性) settings(全局配置参数) typeAliases(类型别名) typeHandlers(类型处理器) objectFactory(对象工厂) plugins(插件) env
下面对SqlMapConfig.xml中的配置进行详细剖析。

mybatis的全局配置文件SqlMapConfig.xml,配置内容如下:

properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)



1.properties定义

来看看我们之前的配置文件:
[html] view plain copy
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPEconfiguration
  3. PUBLIC"-//mybatis.org//DTDConfig3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!--和spring整合后environments配置将废除-->
  7. environmentsdefault="development" environmentid="development" <!--使用jdbc事务管理-->
  8. transactionManagertype="JDBC"/>
  9. <!--数据库连接池-->
  10. dataSourcetype="POOLED"propertyname="driver"value="org.gjt.mm.mysql.Driver"/>
  11. propertyname="url"value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"propertyname="username"value="root"propertyname="password"value="1234"</dataSourceenvironmentenvironments
  12. <!--加载映射文件-->
  13. mappersmapperresource="sqlmap/User.xml"mapperresource="mapper/UserMapper.xml">

我们只有environments和mappers标签中配置了东西,而且未来整合Spring的时候environments中的东西还有可能去掉,那么我们都在这里面配什么重要的东西呢?

我们先把数据库连接池的配置转移出去,单独建立一个文件
将数据库连接参数单独配置在db.properties中,只需要在SqlMapConfig.xml中加载db.properties的属性值。
在SqlMapConfig.xml中就不需要对数据库连接参数硬编码。

将数据库连接参数只配置在db.properties中,原因:方便对参数进行统一管理,其它xml可以引用该db.properties:
[plain] copy
    jdbc.driver=org.gjt.mm.mysql.Driver
  1. jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
  2. jdbc.username=root
  3. jdbc.password=1234
然后在SqlMapConfig.xml的environment中加载属性文件,并将相应属性加入到参数:
copy
    <!--加载属性文件-->
  1. propertiesresource="db.properties">properties<!--和spring整合后environments配置将废除-->
  2. <!--使用jdbc事务管理-->
  3. <!--数据库连接池-->
  4. propertyname="driver"value="${jdbc.driver}"propertyname="url"value="${jdbc.url}"propertyname="username"value="${jdbc.username}"propertyname="password"value="${jdbc.password}">

大家该有疑问了,在db.properties依旧还是硬编码呀?为什么还要把它折腾一遍写在db.properties中呢?原因是方便对运行的参数进行统一管理,其它的XML也可以引用这个配置文件,而且将来使用其他数据库,可以建立几个不同的properties属性文件,想引用那个就引用哪个。
还有一个原因,就是SqlMapConfig.xml文件配置的东西非常多,在集群环境下,有许多SqlMapConfig.xml文件,如果不把数据库连接池移出来,一个一个的SqlMapConfig.xml文件更改数据库连接池参数的时候很麻烦,如果配置了db.properties,只需要改它自己就可以了。

在<properties>标签中可以在里面配置属性:
copy
    propertyname=""value="">

properties特性:

注意:
MyBatis 将按照下面的顺序来加载属性:
a.在 properties 元素体内定义的属性首先被读取。
b.然后会读取properties 元素中resource或 url 加载的属性,它会覆盖已读取的同名属性。
c.最后读取parameterType传递的属性,它会覆盖已读取的同名属性。


建议:
不要在properties元素体内添加任何属性值,只将属性值定义在properties文件中。
在properties文件中定义属性名要有一定的特殊性,如:XXXXX.XXXXX.XXXX

2.settings全局参数配置

mybatis框架在运行时可以调整一些运行参数。
比如:开启二级缓存、开启延迟加载。。

全局参数将会影响mybatis的运行行为。

详细参见“学习资料/mybatis-settings.xlsx”文件

3.typeAliases(别名)重点

3.1需求
在mapper.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型、需要resultType指定输出结果的映射类型。

如果在指定类型时输入类型全路径,不方便进行开发,可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发。

3.2mybatis默认支持别名(不用单独配置,直接写默认别名就行)

别名 映射的类型
_bytebyte
_longlong
_shortshort
_intint
_integerint
_doubledouble
_floatfloat
_booleanboolean
stringString
byteByte
longLong
shortShort
intInteger
integerInteger
doubleDouble
floatFloat
booleanBoolean
dateDate
decimalBigDecimal
bigdecimalBigDecimal


例子:
copy
    selectid="findUserByUsername"parameterType="java.lang.String"
  1. resultType="cn.edu.hpu.mybatis.PO.User" select*fromuserwhereusernamelike'%${value}%'
  2. select 改为
  3. selectid="findUserByUsername"parameterType="string"
  4. resultType="cn.edu.hpu.mybatis.PO.User" select*fromuserwhereusernamelike'%${value}%'
  5. >

3.3自定义别名
3.3.1单个别名定义
在SqlMapConfig.xml中配置:
copy
    <!--别名定义-->
  1. typeAliases <!--针对单个别名定义
  2. type:类型的路径
  3. alias:别名--typeAliastype="cn.edu.hpu.mybatis.PO.User"alias="user">

在mapper.xml中使用别名
copy
    resultType="user">

测试成功,可以使用

3.3.2批量别名定义
在某些包下类比较多,使用上面的写法太冗余,使用批量定义,定义一整个包中的类的别名:
copy
    <!--批量定义别名
  1. 指定包名,mybatis自动扫描包中的PO类,自动定义别名,别名就是类名(首字母大写或小写)--packagename="cn.edu.hpu.mybatis.PO"copy
      >

    copy
      resultType="User">
    都可以,测试无误

    在平常开发中,批量别名定义最常用。

    4.typeHandlers(类型处理器)

    mybatis中通过typeHandlers完成jdbc类型和java类型的转换。

    通常情况下,mybatis提供的类型处理器满足日常需要,不需要自定义.

    mybatis支持类型处理器:

    类型处理器 Java类型 JDBC类型
    BooleanTypeHandlerBoolean,boolean任何兼容的布尔值
    ByteTypeHandlerByte,byte任何兼容的数字或字节类型
    ShortTypeHandlerShort,short任何兼容的数字或短整型
    IntegerTypeHandlerInteger,int任何兼容的数字和整型
    LongTypeHandlerLong,long任何兼容的数字或长整型
    FloatTypeHandlerFloat,float任何兼容的数字或单精度浮点型
    DoubleTypeHandlerDouble,double任何兼容的数字或双精度浮点型
    BigDecimalTypeHandlerBigDecimal任何兼容的数字或十进制小数类型
    StringTypeHandlerStringCHAR和VARCHAR类型
    ClobTypeHandlerStringCLOB和LONGVARCHAR类型
    NStringTypeHandlerStringNVARCHAR和NCHAR类型
    NClobTypeHandlerStringNCLOB类型
    ByteArrayTypeHandlerbyte[]任何兼容的字节流类型
    BlobTypeHandlerbyte[]BLOB和LONGVARBINARY类型
    DateTypeHandlerDate(java.util)TIMESTAMP类型
    DateOnlyTypeHandlerDate(java.util)DATE类型
    TimeOnlyTypeHandlerDate(java.util)TIME类型
    SqlTimestampTypeHandlerTimestamp(java.sql)TIMESTAMP类型
    SqlDateTypeHandlerDate(java.sql)DATE类型
    SqlTimeTypeHandlerTime(java.sql)TIME类型
    ObjectTypeHandler任意其他或未指定类型
    EnumTypeHandlerEnumeration类型VARCHAR-任何兼容的字符串类型,作为代码存储(而不是索引)。


    5.mappers(映射配置)
    5.1通过resource加载单个映射文件
    copy
      >

    5.2通过mapper接口加载单个mapper
    [java] copy
      <!--加载映射文件-->
    1. <mappers>
    2. <!--通过mapper接口加载映射文件
    3. 遵循一些规则:需要将mapper接口的类名和mapper.xml映射文件名称保持一致,且在一个目录中。
    4. 上面规范的前提是,使用的是mapper代理方法-->
    5. <mapperclass="cn.edu.hpu.mybatis.mapper.UserMapper"/>
    6. </mappers>

    按照上边的规范,将mapper.java和mapper.xml放在一个目录 ,且同名。

    5.3批量加载mapper(推荐使用)
    copy
      <!--批量加载mapper
    1. 指定mapper接口的报名,mybatis自动扫描包下所有mapper接口进行加载。
    2. 遵循一些规则:需要将mapper接口的类名和mapper.xml映射文件名称保持一致,且在一个目录中。
    3. 上面规范的前提是,使用的是mapper代理方法
    4. --packagename="cn.edu.hpu.mybatis.mapper">

    比较常用的就是批量加载mapper。

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读