mybatis使用总结(偏面试和项目经验)

mybatis使用总结

之前一直有总结mybatis使用指南的想法,由于各种原因迟迟没有动手。直到面试被频繁问道,才有了好好整理下mybatis的动机。习惯不好,各位莫跟风。平时养成琢磨问题的习惯,面试时才好谈笑风生。

说了这么多废话,开始总结了。

mybatis映射器(就是开发用的xml文件)

映射器部分主要会问到,这里不为了面试而总结,权当重温一下mybatis映射器知识。
在这里插入图片描述
在这里插入图片描述

select标签元素的配置

在这里插入图片描述
在这里插入图片描述

mybatis中传参给映射器总结
在这里插入图片描述
select标签中关于结果集的映射有这两个元素:resultType和resultMap。
日常开发中,一般单表的查询会使用resultType,多表的查询会使用resultMap。
ResultMap和ResultType都是用来表示查询结果集与java对象之间的一种关系,将查询结果集,按照某种关系映射到java对象。
ResultMap:将查询结果集中的列一一映射到java对象的各个属性上去,此处的这个映射关系,是根据用户在“resultMap”的子标签中的配置来决定的,灵活多变,常用于多表查询以及查询时使用别名的情况。

ResultMap标签及其子标签部分属性:
id:指定查询结果集中的唯一标识,即主键,可配置多个;
column:查询结果集中的列名;
property:需要映射到java对象中的属性名。

ResultType:将查询结果集中的各个列,一一映射到java对象中与列名一致的属性中。换句话说,此处查询结果集到java对象的映射关系是固定的,只有列名和属性名相同,该列才能映射成功。

日常开发如果是单表resultType就够用了,不想写什么对应关系的话,可以使用别名。如果多表就用resultMap,重新封装一个实体类与列名形成对应关系。

resultType
在这里插入图片描述
resultMap

<resultMap type="User" id="UserResult">  
		<result property="userId" column="userId" />
		<result property="userName" column="userName" />
		<result property="roleName" column="roleName" />
		<result property="email" column="email" />
		<result property="mobilePhone" column="mobilePhone" />
		<result property="accountName" column="accountName" />
		<result property="password" column="password" />
		<result property="salt" column="salt" />
		<result property="description" column="description" />
		<result property="locked" column="locked" />
		<result property="createTime" column="createTime" />
		<collection property="roles" javaType="java.util.List" resultMap="RoleResult" />
	</resultMap>
<resultMap type="Role" id="RoleResult">
	<result property="roleId" column="roleId" />
	<result property="status" column="status" />
	<result property="roleName" column="roleName" />
	<result property="description" column="description" />
	<result property="createTime" column="createTime" />
	<collection property="permissions" javaType="java.util.List" resultMap="PermissionResult" />
</resultMap>

<resultMap type="Permission" id="PermissionResult">
	<result property="permsId" column="permsId" />
	<result property="permsName" column="permsName" />
	<result property="parentId" column="parentId" />
	<result property="permsKey" column="permsKey" />
	<result property="permsType" column="permsType" />
	<result property="permsUrl" column="permsUrl" />
	<result property="permsLevel" column="permsLevel" />
	<result property="permsIcon" column="permsIcon" />
	<result property="available" column="available" />
	<result property="description" column="description" />
</resultMap>



  <select id="findByUserPermission" parameterType="String"
		resultMap="UserResult">
		SELECT u.userId,u.userName,u.accountName,r.roleId,r.roleName,m.permsId,m.permsName,m.parentId,m.permsKey,m.permsType,m.permsUrl
		FROM sys_user u 
		LEFT JOIN sys_user_role ur ON ur.userId=u.userId
		JOIN sys_role r ON r.roleId=ur.roleId
		JOIN sys_role_permission rm ON rm.roleId=r.roleId
		JOIN sys_permission m ON m.permsId=rm.permsId
		WHERE u.username=#{userName}
	</select>

级联
在这里插入图片描述
在这里插入图片描述
mybatis中级联可以分为三种:association、collection、discriminator。
association:一对一的关系,比如中国公民和身份证是一对一的关系。
collection:一对多的关系,比如班级和学生是一对多的关系,一个班级可以有多个学生。
discriminator:鉴别器(把它理解为java里的switch吧),它可以根据实际选择采用哪个类作为实例,允许你根据特定的条件去关联不同的结果集。比如,人有男人和女人。你可以实例化一个人的对象,但是要根据情况用男人类或者女人类去实例化。
在这里插入图片描述
如觉得上述截图观看不适,可以查看官方文档:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#select
在这里插入图片描述

insert标签

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
https://www.jianshu.com/p/18fc65f7fd89
在这里插入图片描述
如觉得上述截图观看不适,可以查看官方文档:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#insert_update_and_delete
在这里插入图片描述
mybatis获取自增主键(写的很全面):http://www.tianshouzhi.com/api/tutorials/mybatis/378

update标签和delete标签

在这里插入图片描述

动态SQL

在这里插入图片描述

if元素

  <sql id="Query_user">
        <if test="userCustom!=null">
            <if test="userCustom.sex!=null and userCustom.sex!=''">
                and user.sex=#{userCustom.sex}
            </if>
            <if test="userCustom.username!=null and userCustom.username!=''">
                and user.username=#{userCustom.username}
            </if>
        </if>
    </sql>

choose元素
在这里插入图片描述
where元素

  <!--用户综合查询总数-->
        <select id="findUserCount" parameterType="com.nuc.mybatis.po.UserQueryVo"
                resultType="int">
            select count(*) from user
            <!--where可以自动去掉第一个and-->
            <where>
                <!--引用sql的id,如果refid引用的sql的id不在本mapper中,则需要家其他mapper的namespace-->
                <include refid="Query_user"/>
            </where>
        </select>

foreach元素

在这里插入图片描述

 <sql id="Query_user">
        <if test="userCustom!=null">
            <if test="userCustom.sex!=null and userCustom.sex!=''">
                and user.sex=#{userCustom.sex}
            </if>
            <if test="userCustom.username!=null and userCustom.username!=''">
                and user.username=#{userCustom.username}
            </if>
        </if>
        <if test="ids!=null">
            <!--
                collection:指定输入对象集合中的属性
                item:每次遍历生成的对象名
                index:当前元素在集合的位置下标
                open:开始遍历拼接的串
                close:结束时拼接的串
                separator:每个对象的中间拼接的串
                我们要实现 and(id=1 OR id=10 OR id=16)
            -->
            <foreach collection="ids" item="user_id" open="and(" close=")" separator="OR">
              <!--每次遍历拼接的串-->
                id=#{user_id}
            </foreach>
        </if>
    </sql>

bind元素
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上述动态标签有2/3从这里找的:https://blog.csdn.net/Song_JiangTao/article/details/80022214

mybatis的执行过程:
在这里插入图片描述
1、配置mybatis的配置文件,SqlMapConfig.xml(名称不固定)

2、通过配置文件,加载mybatis运行环境,创建SqlSessionFactory会话工厂。SqlSessionFactory在实际使用时按单例方式。
3、通过SqlSessionFactory创建SqlSession。SqlSession是一个面向用户接口(提供操作数据库方法),实现对象是线程不安全的,建议sqlSession应用场合在方法体内。
4、调用sqlSession的方法去操作数据。如果需要提交事务,需要执行SqlSession的commit()方法。
5、释放资源,关闭SqlSession。

mybatis缓存机制:https://tech.meituan.com/2018/01/19/mybatis-cache.html

mybatis面试主要覆盖了常用标签、动态sql、获取自增主键、复杂查询、缓存机制、mybatis执行过程等范围。
参考资料:1、书籍:深入浅出mybatis技术原理与实战。
在这里插入图片描述
2、官方文档:http://www.mybatis.org/mybatis-3/zh/
3、csdn上博友有涉及到相关知识点的引用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值