自定义映射resultMap
一. 准备工作
1. 新建mybatis_resultMap模块 com.atguigu.mybatis
2. 导入依赖
<packaging>jar</packaging> <dependencies> <!-- Mybatis核心 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <!-- junit测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency> <!-- log4j日志 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
3 . 从mybatis_parameter里面复制jdbc.properties和log4j.xml到mybatis_resultMap的resources中
jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC
jdbc.username=root
jdbc.password=123456
log4j.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}
%m (%F:%L) \n" />
</layout>
</appender>
<logger name="java.sql">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis">
<level value="info" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
4 . 创建核心配置文件mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--
MyBatis核心配置文件中的标签必须要按照指定的顺序配置:
properties?,settings?,typeAliases?,typeHandlers?,
objectFactory?,objectWrapperFactory?,reflectorFactory?,
plugins?,environments?,databaseIdProvider?,mappers?
-->
<!--引入properties文件,此后就可以在当前文件中使用的方式访问value-->
<properties resource="jdbc.properties"/>
<typeAliases>
<!--实体类 所在的包,通过包设置类型别名,指定包下所有的类型将全部拥有默认的别名,即类名且不区分大小写-->
<package name="com.atguigu.mybatis.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--引入mybatis的映射文件-->
<mappers>
<package name="com.atguigu.mybatis.mapper"/>
</mappers>
</configuration>
5. 复制工具类
6 .创建实体对应的包 和mapper对应的包和映射文件所在的包com/atguigu/mybatis/mapper
7 . 在SQLyog里面建立表
员工对部门是多对一的关系
所以把关系设置到多的一分 也就是员工的一方
8 . 添加测试数据
因为员工和部门之间是多对一 所以员工所对应的部门用到的是部门的部门的id(在这里没有创建主外键关联)
9. 设置实体类Dept和Emp
Emp
package com.atguigu.mybatis.pojo;
public class Emp {
private Integer empId;
private String empName;
private Integer age;
private String gender;
public Emp() {
}
public Emp(Integer empId, String empName, Integer age, String gender) {
this.empId = empId;
this.empName = empName;
this.age = age;
this.gender = gender;
}
public Integer getEmpId() {
return empId;
}
public void setEmpId(Integer empId) {
this.empId = empId;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Emp{" +
"empId=" + empId +
", empName='" + empName + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
}
Dept
package com.atguigu.mybatis.pojo;
public class Dept {
private Integer deptId;
private String deptName;
public Dept() {
}
public Dept(Integer deptId, String deptName) {
this.deptId = deptId;
this.deptName = deptName;
}
public Integer getDeptId() {
return deptId;
}
public void setDeptId(Integer deptId) {
this.deptId = deptId;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
@Override
public String toString() {
return "Dept{" +
"deptId=" + deptId +
", deptName='" + deptName + '\'' +
'}';
}
}
10 创建mapper接口和映射文件
mapper接口
映射文件
二. 使用全局配置处理字段名和属性名不一致的情况
表里面的字段名用的是下划线 实体类用的是驼峰命名 这个时候字段名和属性名不一致
JDBC工具类:如何映射
将查出来的字段名 通过反射来获取对应的属性名 在用属性名获取属性进行赋值
现在字段名和属性名不一致 如何进行对应
EmpMapper
/**
* 根据id查询员工信息
* @param empId
* @return
*/
Emp getEmpByEmpId(@Param("empId") Integer empId);
EmpMapper.xml
<mapper namespace="com.atguigu.mybatis.mapper.EmpMapper">
<!--Emp getEmpByEmpId(@Param("empId") Integer empId);-->
<select id="getEmpByEmpId" resultType="Emp">
select * from t_emp where emp_id = #{empId}
</select>
</mapper>
测试:ResultMapTest
@Test
public void testGetEmpByEmpId(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp emp = mapper.getEmpByEmpId(1);
System.out.println(emp);
}
因为字段名和属性名不一致测试结果:empId=null, empName='null'
那么如何根据一个下划线对应一个驼峰
解决办法 起别名
第一种方式
<mapper namespace="com.atguigu.mybatis.mapper.EmpMapper">
<!--Emp getEmpByEmpId(@Param("empId") Integer empId);-->
<select id="getEmpByEmpId" resultType="Emp">
select emp_id empId,emp_name empName,age,gender from t_emp where emp_id = #{empId}
</select>
</mapper>
测试
第二方式:
mybatis-config.xml
<settings>
<!--将下划线映射为驼峰-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
EmpMapper.xml
<mapper namespace="com.atguigu.mybatis.mapper.EmpMapper">
<!--Emp getEmpByEmpId(@Param("empId") Integer empId);-->
<select id="getEmpByEmpId" resultType="Emp">
select * from t_emp where emp_id = #{empId}
</select>
</mapper>
测试:
字段名和属性名不一致的情况,如何处理映射关系 1、为查询的字段设置别名,和属性名保持一致 2、当字段符合MySQL的要求使用_,而属性符合java的要求使用驼峰 此时可以在MyBatis的核心配置文件中设置一个全局配置,可以自动将下划线映射为驼峰 emp_id:empId,emp_name:empName
拓展:
1 . mybatis-3.5.11文件内容
2. 将下划线映射为驼峰配置成模板
三. 使用resultMap处理字段名和属性名的不一致的情况
字段名和属性名不一致的情况,如何处理映射关系 1、为查询的字段设置别名,和属性名保持一致 2、当字段符合MySQL的要求使用_,而属性符合java的要求使用驼峰 此时可以在MyBatis的核心配置文件中设置一个全局配置,可以自动将下划线映射为驼峰 emp_id:empId,emp_name:empName 3、使用resultMap自定义映射处理
EmpMapper.xml
<!-- resultMap:设置自定义的映射关系 id:唯一标识 type:处理映射关系的实体类的类型 常用的标签: id:处理主键和实体类中属性的映射关系 result:处理普通字段和实体类中属性的映射关系 association:处理多对一的映射关系(处理实体类类型的属性) collection:处理一对多的映射关系(处理集合类型的属性) column:设置映射关系中的字段名,必须是sql查询出的某个字段 property:设置映射关系中的属性的属性名,必须是处理的实体类类型中的属性名 -->
<!--
resultMap:设置自定义的映射关系
id:唯一标识
type:处理映射关系的实体类的类型
常用的标签:
id:处理主键和实体类中属性的映射关系
result:处理普通字段和实体类中属性的映射关系
association:处理多对一的映射关系(处理实体类类型的属性)
collection:处理一对多的映射关系(处理集合类型的属性)
column:设置映射关系中的字段名,必须是sql查询出的某个字段
property:设置映射关系中的属性的属性名,必须是处理的实体类类型中的属性名
-->
<resultMap id="empResultMap" type="Emp">
<id column="emp_id" property="empId"></id>
<result column="emp_name" property="empName"></result>
<result column="age" property="age"></result>
<result column="gender" property="gender"></result>
</resultMap>
<!--Emp getEmpByEmpId(@Param("empId") Integer empId);-->
<select id="getEmpByEmpId" resultMap="empResultMap">
select * from t_emp where emp_id = #{empId}
</select>
测试: 拓展:
总结:
若字段名和实体类中的属性名不一致,但是字段名符合数据库的规则(使用 _ ),实体类中的属性名符合 Java 的规则(使用驼峰)此时也可通过以下两种方式处理字段名和实体类中的属性的映射关系a> 可以通过为字段起别名的方式,保证和实体类中的属性名保持一致b> 可以在 MyBatis 的核心配置文件中设置一个全局配置信息 mapUnderscoreToCamelCase ,可以在查询表中数据时,自动将 _ 类型的字段名转换为驼峰例如:字段名 user_name ,设置了 mapUnderscoreToCamelCase ,此时字段名就会转换为userName
<!--resultMap :设置自定义映射属性:id :表示自定义映射的唯一标识type :查询的数据要映射的实体类的类型子标签:id :设置主键的映射关系result :设置普通字段的映射关系association :设置多对一的映射关系collection :设置一对多的映射关系属性:property :设置映射关系中实体类中的属性名column :设置映射关系中表中的字段名-->
全部总结:
字段名和属性名不一致的情况,如何处理映射关系 1、为查询的字段设置别名,和属性名保持一致 2、当字段符合MySQL的要求使用_,而属性符合java的要求使用驼峰 此时可以在MyBatis的核心配置文件中设置一个全局配置,可以自动将下划线映射为驼峰 emp_id:empId,emp_name:empName 3、使用resultMap自定义映射处理 resultMap:设置自定义的映射关系 id:唯一标识 type:处理映射关系的实体类的类型 常用的标签: id:处理主键和实体类中属性的映射关系 result:处理普通字段和实体类中属性的映射关系 association:处理多对一的映射关系(处理实体类类型的属性) collection:处理一对多的映射关系(处理集合类型的属性) column:设置映射关系中的字段名,必须是sql查询出的某个字段 property:设置映射关系中的属性的属性名,必须是处理的实体类类型中的属性名