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上博友有涉及到相关知识点的引用。