如何理解Mybatis配置

306 阅读3分钟

如何理解Mybatis配置

1.核心配置文件SqlMapConfig.xml

1.1 MyBatis核心配置文件层级关系

在这里插入图片描述

1.2 MyBatis常用配置解析

1)environments标签

数据库环境的配置,支持多环境配置 在这里插入图片描述 其中,事务管理器(transactionManager)类型有两种:

  • JDBC:这个配置就是直接使用了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作 用域。
  • MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生 命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因 此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。 其中,数据源(dataSource)类型有三种:
  • UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接。
  • POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来。
  • JNDI:这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置 数据源,然后放置一个 JNDI 上下文的引用。

2)mapper标签

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

•使用相对于类路径的资源引用,例如: 
	<mapper resource="org/mybatis/builder/AuthorMapper.xml"/> 
•使用完全限定资源定位符(URL),例如:
 	<mapper url="file:///var/mappers/AuthorMapper.xml"/> 
•使用映射器接口实现类的完全限定类名,例如:
  	<mapper class="org.mybatis.builder.AuthorMapper"/> 
•将包内的映射器接口实现全部注册为映射器,例如:
 	<package name="org.mybatis.builder"/>

3)Properties标签

实际开发中,习惯将数据源的配置信息单独抽取成一个properties文件,该标签可以加载额外配置的 properties文件 在这里插入图片描述

4)typeAliases标签(别名)

类型别名是为Java 类型设置一个短的名字。原来的类型名称配置如下 在这里插入图片描述 配置typeAliases,为com.lagou.domain.User定义别名为user 在这里插入图片描述 上面我们是自定义的别名,mybatis框架已经为我们设置好的一些常用的类型的别名 在这里插入图片描述

2 映射配置文件mapper.xml

动态sql语句 动态sql语句概述 Mybatis 的映射文件中,前面我们的 SQL 都是比较简单的,有些时候业务逻辑复杂时,我们的 SQL是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了。 参考的官方文档,描述如下: 在这里插入图片描述 动态 SQL 之 我们根据实体类的不同取值,使用不同的 SQL语句来进行查询。比如在 id如果不为空时可以根据id查询,如果username 不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。

<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的拼接操作,例如: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>

测试代码片段如下:

//获得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 提取出来,使用时用 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>

3.如何配置打印sql

3.1导入log4j包

  <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
   </dependency>

3.2 全局配置文件,配置

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210522162139558.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1F1YXNpbW9kbzI0,size_16,color_FFFFFF,t_70)