今天想写一下关于Mapper文件的解读,主要流程是参考Mapper官方文档。
namespace
namespace的作用就是关联对应的Mapper接口方法,特别是在接口方法在不同接口中存在重名时,用来作为一个定向防冲突的作用。
resultMap、resultType
resultType:从这条语句中返回的期望类型的类的完全限定名或别名。注意如果是集合情形,那应该是集合可以包含的类型,而不能是集合本身。使用 resultType 或 resultMap,但不能同时使用。他会直接定位到类的所有属性。
resultMap:外部 resultMap 的命名引用。结果集的映射是 MyBatis 最强大的特性,对其有一个很好的理解的话,许多复杂映射的情形都能迎刃而解。使用 resultMap 或 resultType,但不能同时使用。我们可以把它当做成一个Map,key就是property,我类的变量,value就是column,数据库的字段。
<mapper namespace="tk.mybatis.simple.mapper.UserMapper"> <resultMap id="userMap" type="tk.mybatis.simple.model.SysUser"> <id property="id" column="id"/> <result property="userName" column="user_name"/> <result property="userPassword" column="user_password"/> <result property="userEmail" column="user_email"/> <result property="userInfo" column="user_info"/> <result property="headImg" column="head_img" jdbcType="BLOB"/> <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/> </resultMap> <select id="selectById" resultMap="userMap"> SELECT * FROM sys_user WHERE id = #{id} </select> <select id="selectAll" resultType="tk.mybatis.simple.model.SysUser"> SELECT id, user_name , user_password , user_email , user_info , head_img , create_time FROM sys_user </select> </mapper>
如上面给出的代码所示,我一开始就给出了SysUser这个类的全限定名,并把它包装成了一个resulMap,在里面给出了变量和表中字段的key-value关系,然后下面的selectById就是用到了这个resultMap这个结构。第二个用到的就是resultType这种方式,由于我在mybatis-config.xml文件中定义了自动匹配驼峰命名变量的方法,所以我在表字段的后面不用再去声明类的变量名称。
至于这两种方法的利弊呢?我们可以来做个比较
优点 | 缺点 | |
resultType | 比较直观 | 要写许多实体类 |
resultMap | 多个表关联的时候就比较方便了,不用再去写JOIN |