ResultMap是在程序开发中经常使用到的一种返回值类型当开发人员不知道如何进行结果集映射时可以
考虑使用 ResultMap
Mybatis官方文档中是这样描述的:
resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets
数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。实际上,在为一些比如连接
的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的数千行代码。ResultMap 的设
计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
具体用法:
注意:
select
中的resultMap
属性值要和resultMap
标签中的id
属性值保持一致- column 表示要映射的 表中的字段名
- property 表示要映射的 java的属性名
<!-- 编写查询语句 -->
<select id="findByResultMap" resultMap="resultRM_User">
select id user_id,name user_name,age user_age,sex user_sex from user
</select>
<!--手动配置映射规则 -->
<resultMap id="resultRM_User" type="com.atguigu.pojo.User">
<!--1.主键必须映射-->
<id column="user_id" property="id"></id>
<!--2.剩余字段-->
<result column="user_name" property="name"/>
<result column="user_age" property="age"/>
<result column="user_sex" property="sex"/>
</resultMap>
在程序开发过程中,经常会出现 java中的属性用到的是 驼峰命名规则
而 数据库中的表用的是 下划线命名规则
为了在执行SQL语句的过程中
将 ? 字段名 ?和 ? 属性名 ? 进行 映射 Mybatis为我们提供了一个属性为 mapUnderscoreToCamelCase
默认值
为 false
默认是不开启的 将其设置为 true
则表示开启
在mybatis的配置文件中配置
<settings>
<!--开启驼峰命名规则-->
<setting mapUnderscoreToCamelCase="true"></setting>
</settings>
Mybatis 为我们提供了用于进行SQL语句的4个注解分别用于对应增删改查操作
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
@Insert("SQL语句")
public void method insetUser(){
...
}
@Delete("SQL语句")
public void method deleteUser(){
...
}
@Update("SQL语句")
public void method updateUser(){
...
}
@Select("SQL语句")
public void method selectUser(){
...
}
标签:
association
属性:
- property java的映射属性 (实体类中的属性)
- javaType 返回的java类型
- autoMapping 自动映射属性。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.mapper.DeptUserMapper">
<select id="findAll" resultMap="findDeptRM">
SELECT dept_user.*,dept_name from dept_user,dept
where dept_user.dept_id = dept.dept_id
</select>
<resultMap id="findDeptRM" type="com.atguigu.pojo.DeptUser" autoMapping="true">
<!--主键id-->
<id column="id" property="id"/>
<!--其它属性-->
<!--<result column="name" property="name"/>
<result column="age" property="age"/>-->
<!--一对一封装-->
<association property="dept" javaType="com.atguigu.pojo.Dept" autoMapping="true">
<id column="dept_id" property="deptId"/>
<!--<result column="dept_name" property="deptName"/>-->
</association>
</resultMap>
</mapper>
标签:
collection
属性:
- property java的映射属性 (实体类中的属性)
- ofType 返回的java类型
- autoMapping 自动映射属性。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.mapper.DeptMapper">
<select id="findAll" resultMap="findDeptRM">
<!-- select dept.dept_name,dept_user.* from dept,dept_user
where dept.dept_id = dept_user.dept_id -->
select d.dept_id, d.dept_name,u.id,u.name,u.age from dept d LEFT JOIN dept_user u
on d.dept_id = u.dept_id
</select>
<resultMap id="findDeptRM" type="com.atguigu.pojo.Dept" autoMapping="true">
<!--主键必须写 看懂业务主键-->
<id column="dept_id" property="deptId"></id>
<!--<result column="dept_name" property="deptName"></result>-->
<!--一对多-->
<collection property="users" ofType="com.atguigu.pojo.DeptUser" autoMapping="true">
<id column="id" property="id"/>
<!--<result column="name" property="name"/>-->
</collection>
</resultMap>
</mapper>
应用场景: 在海量数据查询的情况下,通常使用子查询会有更高的效率。 但如果数据量比较小的情况下 子查询反而会影响查询效率。
<!--
column="dept_id" 子查询时 依赖的数据字段
select="子查询的关键属性"
-->
<resultMap id="deptRM" type="com.atguigu.pojo.Dept">
<id column="dept_id" property="deptId"/>
<result column="dept_name" property="deptName"/>
<collection property="users" ofType="com.atguigu.pojo.DeptUser"
select="findDeptUserByDeptId" column="dept_id"></collection>
</resultMap>
<select id="findDeptUserByDeptId" resultType="com.atguigu.pojo.DeptUser">
select * from dept_user where dept_id = #{dept_id}
</select>
Mybatis提供了懒加载机制 配合 子查询一起使用 这样会方便 查询
<!--
column="dept_id" 子查询时 依赖的数据字段
select="子查询的关键属性"
fetchType="lazy" 子查询懒加载 用户使用时 才查询数据库
fetchType="eager" 查询所有的数据 -->
<resultMap id="deptRM" type="com.atguigu.pojo.Dept">
<id column="dept_id" property="deptId"/>
<result column="dept_name" property="deptName"/>
<collection property="users" ofType="com.atguigu.pojo.DeptUser"
select="findDeptUserByDeptId" column="dept_id" fetchType="lazy"></collection>
</resultMap>
<select id="findDeptUserByDeptId" resultType="com.atguigu.pojo.DeptUser">
select * from dept_user where dept_id = #{dept_id}
</select>
Mybatis 中默认的缓存机制 同一个SqlSession中数据共享
需要 手动开启 在映射文件中添加 <cache></cache>
标签
但是需要注意的是 在手动开启时 缓存时 在查询完毕后 需要手动的关闭连接。
@CacheNamespace 标识Mapper接口 标识开启二级缓存
注意事项: