关于mybatis的思考(2)——mybatis映射文件的深入理解

1.配置文件

    mybatis进行持久化操作是以SqlSessionFactory对象为基础的,这个对象是整个数据库映射关系经过编译后的内存镜像。

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

    在这里,根据配置文件mybatis-config.xml创建SqlSessionFactory对象,然后产生SqlSession,执行sql语句。


2.配置文件结构

  • properties 属性
  • settings 设置
  • typeAliases 类型命名
  • typeHandlers 类型处理器
  • objectFactory 对象工厂
  • plugins 插件
  • environments 环境
    • enviroment 环境变量
    • transactionManager 事务管理器
    • dataSource 数据源
  • databaseIdProvider 数据库厂商标识
  • mappers 映射器

  2.1 properties 属性

    这些属性都是可外部配置且动态替换的,既可以在java属性文件中配置,也可以通过properties元素的子元素来传递。

未使用properties的时候:

        数据源信息是通过environments的子节点dataSource来进行配置的。

<environments default="mysql">
        <!-- 环境配置,即连接的数据库。 -->
        <environment id="mysql">
            <!--  指定事务管理类型,type="JDBC"指直接简单使用了JDBC的提交和回滚设置 -->
            <transactionManager type="JDBC"/>
            <!--  dataSource指数据源配置,POOLED是JDBC连接对象的数据源连接池的实现。 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="hello"/>
            </dataSource>
        </environment>
    </environments>

使用properties属性的时候:

    首先在resources(在maven使用的时候,我们在pom中指定了src/main/resources/mybatis-config.xml作为配置文件的来源)下增加一个db.properties的java属性文件。

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/mybatis
username=root
password=hello

  然后在配置文件mybatis-config.xml中增加<properties>属性。

<properties resource="db.properties"/>

    此时,指明了数据源的信息。其中的属性就可以在整个配置文件中使用来替换需要动态配置的属性值。

<dataSource type="POOLED">
    <property name="driver" value="${driver}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
</dataSource>

    2.2 setting 设置

    settings会改变mybatis的运行行为,我们在表中给出了各项的参数和默认值等信息。

<!-- settings是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 -->
	<settings>
		<!-- 该配置影响的所有映射器中配置的缓存的全局开关。默认值true -->
	  <setting name="cacheEnabled" value="true"/>
	  <!--延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。默认值false  -->
	  <setting name="lazyLoadingEnabled" value="true"/>
	  	<!-- 是否允许单一语句返回多结果集(需要兼容驱动)。 默认值true -->
	  <setting name="multipleResultSetsEnabled" value="true"/>
	  <!-- 使用列标签代替列名。不同的驱动在这方面会有不同的表现, 具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果。默认值true -->
	  <setting name="useColumnLabel" value="true"/>
	  <!-- 允许 JDBC 支持自动生成主键,需要驱动兼容。 如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。 默认值false  -->
	  <setting name="useGeneratedKeys" value="false"/>
	 <!--  指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套)。 --> 
	 <!-- 默认值PARTIAL -->
	  <setting name="autoMappingBehavior" value="PARTIAL"/>
	  
	  <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
	 <!--  配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。默认SIMPLE  -->
	  <setting name="defaultExecutorType" value="SIMPLE"/>
	  <!-- 设置超时时间,它决定驱动等待数据库响应的秒数。 -->
	  <setting name="defaultStatementTimeout" value="25"/>
	  
	  <setting name="defaultFetchSize" value="100"/>
	  <!-- 允许在嵌套语句中使用分页(RowBounds)默认值False -->
	  <setting name="safeRowBoundsEnabled" value="false"/>
	  <!-- 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。  默认false -->
	  <setting name="mapUnderscoreToCamelCase" value="false"/>
	  <!-- MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。
	  		 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。
	   		若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。  -->
	  <setting name="localCacheScope" value="SESSION"/>
	  <!-- 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。  -->
	  <setting name="jdbcTypeForNull" value="OTHER"/>
	<!--   指定哪个对象的方法触发一次延迟加载。  -->
	  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
	</settings>

  在此,我们给出一个完整的settings设置的实例。

<settings>
  <setting name="cacheEnabled" value="true"/>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="multipleResultSetsEnabled" value="true"/>
  <setting name="useColumnLabel" value="true"/>
  <setting name="useGeneratedKeys" value="false"/>
  <setting name="autoMappingBehavior" value="PARTIAL"/>
  <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
  <setting name="defaultExecutorType" value="SIMPLE"/>
  <setting name="defaultStatementTimeout" value="25"/>
  <setting name="defaultFetchSize" value="100"/>
  <setting name="safeRowBoundsEnabled" value="false"/>
  <setting name="mapUnderscoreToCamelCase" value="false"/>
  <setting name="localCacheScope" value="SESSION"/>
  <setting name="jdbcTypeForNull" value="OTHER"/>
  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

  2.3 typeAliases 类型

    类型别名是为java类设置一个短名字,存在的意义仅在于减少类完全限定名的冗余。

    <typeAliases>
        <typeAlias type="com.fayuan.domain.User" alias="User"/>
    </typeAliases>

  在这里,我们使用User作为com.fayuan.domain.User这个类的别名,此时我们在UserMapping.xml中就可以使用User来代替com.fayuan.domain.User。

    <!--
        id="save"是唯一的标示符
        parameterType属性指明插入时使用的参数类型
        useGeneratedKeys="true"表示使用数据库的自动增长策略
     -->
    <insert id="save" parameterType="com.fayuan.domain.User" useGeneratedKeys="true">
        insert into tb_user (name,sex,age) VALUES (#{name},#{sex},#{age})
    </insert>

    <!-- select操作
    parameterType="int"表示该查询语句需要一个int类型的参数
    resultType="user"表示返回的是一个user对象 -->
    <select id="select" parameterType="int" resultType="User">
        select * from tb_user where id=#{id}
    </select>

    在insert中没有利用TypeAliases,需要将类的完全限定名全部写出来;

    在select中利用TypeAliases,只需要使用User即可表示这个类。

    也可以指定一个包。

<typeAliases>
    <package name="com.fayuan.domain"/>
</typeAliases>

    此时,每一个在包com.fayuan.domain下javaBean,

    在没有注解的情况下,会使用Bean的首字母小写的非限定名来作为别名,若设置了注解,则使用注解作为其注解值。

@Alias("user")
public class User{
    ...
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏帘卷西风的专栏

linux下shell技巧

    经常看到一些大牛操作linux的时候,双手运指如飞,指令如流水般输出,会不会感到羡慕呢?

381
来自专栏破晓之歌

python-web.py开发入门(推荐) 原

输入运行文件命令。(我这里pycharm2018.2不晓得为嘛terminal调整不了字间距,而且文件路径的/都变了,文字颜色也不晓得哪里能改,其他地方的显示都...

742
来自专栏禅林阆苑

Vue2.5源码阅读笔记01—代码结构与初始化

Vue作为当下最流行的渐进式的js框架,其渐进式的思想、虚拟DOM的运用、组件化的开发模式、响应式数据侦听原理值得开发者进行探索学习,其中运用的代码组织的技巧,...

66559
来自专栏扎心了老铁

一个scrapy框架的爬虫(爬取京东图书)

我们的这个爬虫设计来爬取京东图书(jd.com)。 scrapy框架相信大家比较了解了。里面有很多复杂的机制,超出本文的范围。 1、爬虫spider tips:...

3566
来自专栏JavaEE

springboot 整合mybatis(mybatis基于注解形式)

2657
来自专栏前端那些事

起步 - vue-router路由与页面间导航

vue-router 我们知道路由定义了一系列访问的地址规则,路由引擎根据这些规则匹配找到对应的处理页面,然后将请求转发给页进行处理。可以说所有的后端开发都是这...

28310
来自专栏python3

bs4--xlwt存入excel

先写一个简单的python程序测试一下,创建一个名为excelwrite.py文件,代码如下:

712
来自专栏编程

如何用Vim提高开发效率

背景 虽然笔者是Android开发工程师,但也接触过各种IDE(不限于Android开发)。不同的IDE往往都有不同的快捷键,我们总不能对每种IDE都进行配置吧...

1958
来自专栏Python自动化测试

Python接口测试之数据驱动(二十)

在接口的自动化测试中,客户端发送请求给服务端,在客户端发送请求的时候,包含了请求地址,请求方法,以及请求参数等数据,那么在接口的自动化测试中如何来...

794
来自专栏小狼的世界

Firebug Command Line 的使用技巧

Commandlinie是Firebug中总有用的一个特性。如果你有Microsoft Visual Studio的使用经验,你就会知道“Immediate W...

963

扫码关注云+社区