Rubin's Blog

  • 首页
  • 关于作者
  • 隐私政策
享受恬静与美好~~~
分享生活的点点滴滴~~~
  1. 首页
  2. MyBatis
  3. 正文

MyBatis之配置文件详解

2021年 5月 11日 892点热度 0人点赞 0条评论

前言

随着SpringBoot的流行,我们已经很少会单独拿一个框架出来使用,大部分都会经过starter的包装来使我们对于框架的集成和使用很方便。但是,万变不离其宗,掌握最原始的使用方法对我们对于框架的掌握和使用还是很有帮助的。

本博文主要是记录单独使用MyBatis框架时,配置文件的一些详细配置项,以作记录。

配置文件详解

核心配置文件

总览

MyBatis的核心配置文件的层级结构如下图所示:

下面,我们对主要的配置项展开详细介绍。

environments标签

数据库环境的配置,支持多环境配置,细节如下:

其中,事务管理器(transactionManager)类型有两种:

  • JDBC:这个配置就是直接使用了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
  • MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。

其中,数据源(dataSource)类型有三种:

  • UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接。
  • POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来。
  • JNDI:这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。

mapper标签

该标签的作用是加载映射的,加载方式有如下几种:

  • 使用相对于类路径的资源引用,例如:<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  • 使用完全限定资源定位符(URL),例如:<mapper url="file:///var/mappers/AuthorMapper.xml"/>
  • 使用映射器接口实现类的完全限定类名,例如:<mapper class="org.mybatis.builder.AuthorMapper"/>(注意:保证Mapper接口和xml的包路径一样,也就是说com.rubin.mapper.UserMapper对应的xml路径应该是classpath:com/rubin/mapper/UserMapper.xml)
  • 将包内的映射器接口实现全部注册为映射器,例如:<package name="org.mybatis.builder"/> (注意:保证Mapper接口和xml的包路径一样,也就是说com.rubin.mapper.UserMapper对应的xml路径应该是classpath:com/rubin/mapper/UserMapper.xml)

Properties标签

我们在实际开发中,习惯将数据源的配置信息单独抽取成一个properties文件,properties标签就可以加载额外配置的properties文件。具体使用方式如下:

typeAliases标签

类型别名是为Java 类型设置一个短的名字。比如说原来的类型名称配置如下:

配置typeAliases,为com.lagou.domain.User定义别名为user,如下图所示:

上面我们是自定义的别名,MyBatis框架已经为我们设置好的一些常用的类型的别名,如下图:

映射配置文件mapper.xml

动态SQL之条件判断

动态SQL比较好理解,就是根据条件的变化,我们的SQL也会变化来适应业务。示例如下所示:

<select id="findByCondition" parameterType="user" resultType="user">
 select * from User
  <where>
    <if test="id!=0">
      and id=#{id}
    </if>
    <if test="username!=null">
      and username=#{username}
    </if>
  </where>
</select>

当查询条件id和username都存在时,控制台打印的sql语句如下:

… … …
  //获得MyBatis框架生成的UserMapper接口的实现类
  UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  User condition = new User();
  condition.setId(1);
  condition.setUsername("lucy");
  User user = userMapper.findByCondition(condition);
  … … …

当查询条件只有id存在时,控制台打印的sql语句如下:

… … …
//获得MyBatis框架生成的UserMapper接口的实现类
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User condition = new User();
condition.setId(1);
User user = userMapper.findByCondition(condition);
… … …

动态SQL之条件循环

循环执行SQL的拼接操作是将我们的集合参数为基础,遍历集合来拼装SQL。例如:SELECT * FROM USER WHERE id IN (1,2,5)。

<select id="findByIds" parameterType="list" resultType="user">
 select * from User
  <where>
    <foreach collection="list" open="id in(" close=")" item="id" separator=",">
      #{id}
    </foreach>
  </where>
</select>

测试代码片段以及控制台SQL打印如下:

… … …
//获得MyBatis框架生成的UserMapper接口的实现类
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int[] ids = new int[]{2,5};
List<User> userList = userMapper.findByIds(ids);
System.out.println(userList);
… … …

foreach标签的属性含义如下:

  • collection:代表要遍历的集合元素,注意编写时不要写#{}。
  • open:代表语句的开始部分。
  • close:代表结束部分。
  • item:代表遍历集合的每个元素,生成的变量名。
  • sperator:代表分隔符。

SQL片段抽取

SQL片段去抽也就是将SQL中重复的SQL提取出来,使用时用 include引用即可,最终达到SQL重用的目的。示例如下:

<!--抽取sql片段简化编写-->
<sql id="selectUser" select * from User</sql>

<select id="findById" parameterType="int" resultType="user">
  <include refid="selectUser"></include> where id=#{id}
</select>

<select id="findByIds" parameterType="list" resultType="user">
  <include refid="selectUser"></include>
  <where>
    <foreach collection="array" open="id in(" close=")" item="id"separator=",">
     #{id}
    </foreach>
  </where>
</select>
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: MyBatis
最后更新:2022年 6月 9日

RubinChu

一个快乐的小逗比~~~

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复
文章目录
  • 前言
  • 配置文件详解
    • 核心配置文件
      • 总览
      • environments标签
      • mapper标签
      • Properties标签
      • typeAliases标签
    • 映射配置文件mapper.xml
      • 动态SQL之条件判断
      • 动态SQL之条件循环
      • SQL片段抽取
最新 热点 随机
最新 热点 随机
问题记录之Chrome设置屏蔽Https禁止调用Http行为 问题记录之Mac设置软链接 问题记录之JDK8连接MySQL数据库失败 面试系列之自我介绍 面试总结 算法思维
RocketMQ之源码环境搭建 java面试系列之Linux Elasticsearch之入门使用 Tomcat之手写简易服务器 ZooKeeper之深入进阶 Kafka高级特性之消费者

COPYRIGHT © 2021 rubinchu.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

京ICP备19039146号-1