一、 SQL映射文件是什么?
SQL映射文件(SQL Mapping File)是MyBatis框架中用于定义数据库操作的XML文件。它与应用程序的数据访问层进行交互,将Java对象与数据库表之间的映射关系进行配置,并提供了执行SQL语句的方式。
二,SQL映射文件中的几个顶级元素介绍:
mapper:SQL映射文件的根元素。只有一个属性namespace,用于区分不同的mapper,必须全局唯一。
cache:为给定命名空间配置缓存。
cache-ref:引用其他命名空间中的缓存配置。
resultMap:用来描述查询结果集中的字段和Java实体类属性的对应关系。
sql:定义可重用的SQL语句块,可以在其他语句映射中引用,提高编写和维护SQL语句的效率。
insert:映射insert语句。
update:映射update语句。
delete:映射delete语句。
select:映射select语句。
1.mapper
mapper namespace属性
区别不同的mapper namespace和子元素的id联合保证唯一
绑定DAO接口
namespace的命名必须跟某个接口同名
接口中的方法与映射文件中SQL语句id一一对应
2. select
select
元素是MyBatis中最常用的元素之一,因此 MyBatis 在查询和结果映射做了相当多的改进。一个简单查询的select
元素是非常简单的。比如:
<!-- 查询 User 表的全部内容 -->
<!-- id 表示唯一标识符,parameterType 表示查询返回结果全限定名或别名 -->
<select id="getUserAll" resultType="User">
SELECT * FROM User
</select>
select元素的一些比较常见属性:
id:在命名空间中唯一的标识符。
parameterType:传入这条语句的参数的类型。
resultType:语句中返回结果的类全限定名或别名。
resultMap:对外部 resultMap 的命名引用。
resultOrdered:该属性仅仅针对嵌套结果 select 语句,默认值为 false。
resultSets:将列出语句执行后返回的结果集并赋予每个结果集一个名称,多个名称之间以逗号分隔,仅适用于多结果集的情况。
timeout:在抛出异常之前,驱动程序等待数据库返回请求结果的秒数,默认没设置。
statementType:可选STATEMENT,PREPARED 或 CALLABLE,默认值:PREPARED。
3.使用resultMap元素自定义结果映射:
//示例
//Mapper接口
public List<SysUser> getUserListWithRoleName(SysUser sysUser);
//xml文件
//使用resultMap元素定义结果映射
<resultMap id="userWithRoleName" type="sysuser">
<id property="id" column="id">
<result property="userRoleName" column="roleName"/>
</resultMap>
//resultMap元素定义的规则封装查询结果
<select id="getUserListWithRoleName" parameterType="sysuser" resultMap="userWithRoleName">
select u.*,r.roleName from t_sys_user u,t_sys_role r
where u.realName like CONCAT ('%',#{realName},'%')
and u.roleId = #{roleId} and u.roleId = r.id
</select>
4.association
association属性
resultMap:外部引用 值为id值
property:为你在这个类创建的类对象名称
javaType:为完整java类名或者别名
子元素
id:一般用于主键
result元素属性
property :属性名
column:数据库列名或者别名
<resultMap id="SysUserAndSysRoleTow" type="sysUser">
<id property="id" column="id"></id>
<result property="account" column="account"></result>
<result property="realName" column="realName"></result>
<result property="sex" column="sex"></result>
<result property="phone" column="phone"></result>
<result property="roleId" column="roleId"></result>
<result property="createdTime" column="createdTime"></result>
<!--association:处理多对一的映射关系
property:需要处理多对的映射关系的属性名
javaType:该属性的类型
-->
<association property="sysRole" javaType="SysRole">
<id property="id" column="id"></id>
<result property="roleName" column="roleName"></result>
</association>
</resultMap>
5.collection
collection属性
resultMap:外部引用 值为id值
property:为这个类内的集合名称
ofType:完整的类名或别名,就是集合包含的类型
子元素
id:一般用于主键
result元素属性
property :属性名
column:数据库列名或者别名
<resultMap id="SysUserAndSysRoleTow" type="sysUser">
<id property="id" column="id"></id>
<result property="account" column="account"></result>
<result property="realName" column="realName"></result>
<result property="sex" column="sex"></result>
<result property="phone" column="phone"></result>
<result property="roleId" column="roleId"></result>
<result property="createdTime" column="createdTime"></result>
<collection property="sysRole" ofType="SysRole">
<id property="id" column="id"></id>
<result property="roleName" column="roleName"></result>
</collection>
</resultMap>
6.resultType和resultMap小结:
resultmap:resultMap如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
resultType:resultType使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
7.resultMap的自动映射行为:
可以根据查询结果集的列名和 Java 对象的属性名自动进行结果映射,简化了手动编写映射规则的过程,自动映射的前提:属性名与字段名一致,自动映射级别:autoMappingBehavior
自动映射行为 | resultType (不支持嵌套映射) | 没有嵌言映射的resutMap | 有嵌套映射的resultMap |
NONE | 失效 | 手工映射 | 手工映射 |
PARTIAL | 自动映射 | 自动映射 | 手工映射 |
FULL | 自动映射 | 自动映射 | 自动映射 |
三,MyBatis的缓存
1、MyBatis的一级缓存
2、MyBatis的二级缓存
3、二级缓存的相关配置
4、MyBatis缓存查询的顺序
5.设置二级缓存的类型
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>