resultMap作用是处理数据表中字段与java实体类中属性的映射关系。
准备工作
① 创建数据库&数据表- CREATE DATABASE `dbtest1`;
- CREATE TABLE `t_emp` (
- `emp_id` int NOT NULL AUTO_INCREMENT,
- `emp_name` varchar(20) DEFAULT NULL,
- `age` int DEFAULT NULL,
- `gender` char(1) DEFAULT NULL,
- `dept_id` int DEFAULT NULL,
- PRIMARY KEY (`emp_id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
- CREATE TABLE `t_dept` (
- `dept_id` int DEFAULT NULL,
- `dept_name` varchar(20) DEFAULT NULL
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
复制代码 ② 创建实体类Emp.java&Dept.java③ 创建jdbc.properties,添加如下内容- jdbc.driver=com.mysql.cj.jdbc.Driver
- jdbc.url=jdbc:mysql://localhost:3306/dbtest1?serverTimezone=UTC
- jdbc.username=root
- jdbc.password=123456
- jdbc.driverClassName=com.mysql.jdbc.Driver
复制代码 ④ 创建Mybatis核心配置文件⑤ 添加依赖- <dependencies>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings><dependency>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings> <groupId>org.mybatis</groupId>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings> <artifactId>mybatis</artifactId>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings></dependency>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings><dependency>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings> <groupId>junit</groupId>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings> <artifactId>junit</artifactId>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings> <scope>test</scope>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings></dependency>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings><dependency>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings> <groupId>mysql</groupId>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings> <artifactId>mysql-connector-java</artifactId>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings></dependency>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings><dependency>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings> <groupId>log4j</groupId>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings> <artifactId>log4j</artifactId>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings></dependency>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings><dependency>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings> <groupId>commons-logging</groupId>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings> <artifactId>commons-logging</artifactId>
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings></dependency>
- </dependencies>
复制代码 ⑥ 创建SqlSession工具类- public class SqlSessionUtil {
- private static final Log logger = LogFactory.getLog(SqlSessionUtil.class);
- public static SqlSession getSqlSession() {
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings>SqlSession sqlSession = null;
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings>try(InputStream is = Resources.getResourceAsStream("mybatis-config.xml");) {
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings> SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings> SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings> sqlSession = sqlSessionFactory.openSession(true);
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings>} catch (IOException e) {
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings> logger.error(e);
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings>}
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings>return sqlSession;
- }
- }
复制代码 字段和属性的映射关系处理方案
数据表中字段名与属性名不一致的情况
- /**
- * 根据id查询员工信息
- * @param empId
- * @return
- */
- Emp getEmpById(@Param("id") Integer empId);
复制代码- <select id="getEmpById" resultType="com.evan.mybatis.entity.Emp">
- select emp_id empId,emp_name empName,age,gender from t_emp where emp_id = #{empId}
- </select>
复制代码
- 方式二:设置全局配置,将字段名下换线自动映射为属性名驼峰规则
- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings>
复制代码- <select id="getEmpById" resultType="com.evan.mybatis.entity.Emp">
- select emp_id ,emp_name,age,gender from t_emp where emp_id = #{empId}
- </select>
复制代码- <resultMap id="empResultMap" type="emp">
-
-
- <id column="emp_id" property="empId" javaType="java.lang.Integer"/>
- <result column="emp_name" property="empName" javaType="java.lang.String"/>
- <result column="age" property="age" javaType="java.lang.Integer"/>
- <result column="gender" property="gender" javaType="java.lang.String"/>
- </resultMap>
- <select id="getEmpById" resultMap="empResultMap">
- select emp_id,emp_name,age,gender
- from t_emp
- where emp_id = #{id}
- </select>
复制代码结论:
若字段名和实体类中的属性名不一致,但是字段名符合数据库的规则(使用),实体类中的属性名符合Java的规则(使用驼峰)。
此时也可通过以下两种方式处理字段名和实体类中的属性的映射关系。
- 可以通过为字段起别名的方式,保证和实体类中的属性名保持一致。
- 可以在MyBatis的核心配置文件中设置一个全局配置信息mapUnderscoreToCamelCase,可以在查询表中数据时,自动将下划线类型的字段名转换为驼峰。
例如:字段名user_name,设置了mapUnderscoreToCamelCase,此时字段名就会转换为 userName。
测试
- @Test public void test1() {<settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings>SqlSession sqlSession = SqlSessionUtil.getSqlSession();<settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings>EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);<settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings>System.out.println(mapper.getEmpById(5));<settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings>sqlSession.close(); }
复制代码 多对一的关系映射处理
查询员工信息以及员工所对应的部门信息。
- /**
- * 获取员工及所对应的部门信息
- * @param empId
- * @return
- */
- Emp getEmpAndDeptById(@Param("empId") Integer empId);
复制代码- <resultMap id="empAndDeptResultMap" type="emp">
- <id column="emp_id" property="empId" javaType="java.lang.Integer"/>
- <result column="emp_name" property="empName" javaType="java.lang.String"/>
- <result column="age" property="age" javaType="java.lang.Integer"/>
- <result column="gender" property="gender" javaType="java.lang.String"/>
- <result column="dept_id" property="dept.deptId" javaType="java.lang.Integer"/>
- <result column="dept_name" property="dept.deptName" javaType="java.lang.String"/>
- </resultMap>
- <select id="getEmpAdnDeptById" resultMap="empAndDeptResultMap">
- SELECT
- t_emp.*,t_dept.`dept_name`
- FROM
- t_emp LEFT JOIN t_dept ON t_emp.`dept_id`=t_dept.`dept_id`
- WHERE
- t_emp.emp_id = #{id}
- </select>
复制代码- <resultMap id="empAndDeptResultMap" type="emp">
- <id column="emp_id" property="empId" javaType="java.lang.Integer"/>
- <result column="emp_name" property="empName" javaType="java.lang.String"/>
- <result column="age" property="age" javaType="java.lang.Integer"/>
- <result column="gender" property="gender" javaType="java.lang.String"/>
- <result column="dept_id" property="dept.deptId" javaType="java.lang.Integer"/>
- <result column="dept_name" property="dept.deptName" javaType="java.lang.String"/>
- </resultMap>
- <select id="getEmpAdnDeptById" resultMap="empAndDeptResultMap">
- SELECT
- t_emp.*,t_dept.`dept_name`
- FROM
- t_emp LEFT JOIN t_dept ON t_emp.`dept_id`=t_dept.`dept_id`
- WHERE
- t_emp.emp_id = #{id}
- </select>
复制代码 测试
- @Test public void test2() {<settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings>SqlSession sqlSession = SqlSessionUtil.getSqlSession();<settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings>EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);<settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings>System.out.println(mapper.getEmpAdnDeptById(2));<settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings>sqlSession.close(); }
复制代码 Step 1:查询员工信息- public interface EmpMapper {
- /**
- * 第一步:通过分步查询员工及所对应的部门信息
- * @param empId
- * @return
- */
- Emp getEmpAndDeptByStepOne(@Param("empId") Integer empId);
- }
复制代码 Step 2:查询部门信息- public interface DeptMapper {
- /**
- * 第二步:通过分步查询员工及所对应的部门信息
- * @param deptId
- * @return
- */
- Dept getEmpAndDeptByStepTwo(@Param("deptId") Integer deptId);
- }
复制代码- <select id="getEmpAndDeptByStepTwo" resultType="com.evan.mybatis.entity.Dept">
- select * from t_dept where dept_id = #{deptId}
- </select>
复制代码- <resultMap id="empAndDeptByStepResultMap" type="emp">
- <id column="emp_id" property="empId"/>
- <result column="emp_name" property="empName"/>
- <result column="age" property="age"/>
- <result column="gender" property="gender"/>
-
- <association property="dept" javaType="dept" fetchType="lazy"
- select="com.evan.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
- column="dept_id"/>
- </resultMap>
- <select id="getEmpAndDeptByStepOne" resultMap="empAndDeptByStepResultMap">
- SELECT * FROM t_emp WHERE emp_id = #{empId}
- </select>
复制代码 在Mybatis核心配置文件中设置全局延迟加载:- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings><settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings>
复制代码结论:
分步查询的优点:可以实现延迟加载,但是必须在核心配置文件中设置全局配置信息:
lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。
aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。 否则,每个属性会按需加载。
此时就可以实现按需加载,获取的数据是什么,就只会执行相应的sql。此时可通过association和collection中的fetchType属性设置当前的分步查询是否使用延迟加载,fetchType="lazy(延迟加载)|eager(立即加载)"
测试
- @Test public void test3() {<settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings>SqlSession sqlSession = SqlSessionUtil.getSqlSession();<settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings>EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);<settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings>System.out.println(mapper.getEmpAndDeptByStepOne(5));<settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings>sqlSession.close(); }
复制代码 一对多的关系映射处理
- /**
- * 根据部门id查询部门以及部门中所对应的员工信息
- * @param deptId
- * @return
- */
- Dept getDeptAndEmpById(@Param("deptId") Integer deptId);
复制代码- <resultMap id="deptAndEmpResultMap" type="dept">
- <id column="dept_id" property="deptId" javaType="java.lang.Integer"/>
- <result column="dept_name" property="deptName" javaType="java.lang.String"/>
-
- <collection property="emps" ofType="emp">
- <id column="emp_id" property="empId" javaType="java.lang.Integer"/>
- <result column="emp_name" property="empName" javaType="java.lang.String"/>
- <result column="age" property="age" javaType="java.lang.Integer"/>
- <result column="gender" property="gender" javaType="java.lang.String"/>
- </collection>
- </resultMap>
- <select id="getDeptAndEmpById" resultMap="deptAndEmpResultMap">
- SELECT
- t_emp.*,t_dept.`dept_name`
- FROM t_dept
- LEFT JOIN t_emp ON t_dept.`dept_id` = t_emp.`dept_id`
- WHERE t_dept.`dept_id` = #{deptId}
- </select>
复制代码- /**
- * 分步查询第一步:根据id查询部门信息
- * @param deptId
- * @return
- */
- Dept getDeptById(@Param("deptId") Integer deptId);
复制代码- /**
- * 分步查询第二步: 根据部门id查询部门所属员工
- * @param deptId
- * @return
- */
- List<Emp> getEmpListByDeptId(Integer deptId);
复制代码- <settings>
-
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- </settings> select * from t_emp where dept_id = #{deptId}
复制代码- <resultMap id="deptAndEmpByStepResultMap" type="dept">
- <id column="dept_id" property="deptId" javaType="java.lang.Integer"/>
- <result column="dept_name" property="deptName" javaType="java.lang.String"/>
- <collection property="emps" column="dept_id"
- select="com.evan.mybatis.mapper.EmpMapper.getEmpListByDeptId"/>
- </resultMap>
- <select id="getDeptById" resultMap="deptAndEmpByStepResultMap">
- select * from t_dept where dept_id = #{deptId}
- </select>
复制代码 测试
- @Test
- public void test5() {
- SqlSession sqlSession = SqlSessionUtil.getSqlSession();
- DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
- Dept dept = mapper.getDeptById(2);
- System.out.println(dept);
- sqlSession.close();
- }
复制代码 测试结果:

结果可以看到,多条查询语句执行。
- @Test
- public void test5() {
- SqlSession sqlSession = SqlSessionUtil.getSqlSession();
- DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
- Dept dept = mapper.getDeptById(2);
- System.out.println(dept.getDeptName());
- sqlSession.close();
- }
复制代码 测试结果:

开启延迟加载以后,可以看到按照需求查询指定SQL执行。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |