MyBatis自定義映射resultMap的實現(xiàn)
1 準備工作
1.1 建表
t_emp


添加測試數(shù)據(jù):

1.2 創(chuàng)建實體類
在src/main/java/com/rqs/mybatis/pojo下創(chuàng)建Emp類:
Emp類:
package com.rqs.mybatis.pojo;
public class Emp {
private Integer eid;
private String empName;
private Integer age;
private String sex;
private String email;
public Integer getEid() {
return eid;
}
public void setEid(Integer eid) {
this.eid = eid;
}
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 getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Emp() {
}
public Emp(Integer eid, String empName, Integer age, String sex, String email) {
this.eid = eid;
this.empName = empName;
this.age = age;
this.sex = sex;
this.email = email;
}
@Override
public String toString() {
return "Emp{" +
"eid=" + eid +
", empName='" + empName + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", email='" + email + '\'' +
'}';
}
}
1.3 引出一個問題

在之前實現(xiàn)查詢功能的時候,用到的都是resultType來設置默認的映射關系,要求字段名(數(shù)據(jù)庫表中的字段名)和屬性名(java類中的屬性名)保持一致,例如下圖所示,字段名和屬性名是一致的。
字段名:

屬性名:

但是,在本例中,出現(xiàn)了字段名和屬性名不一致的情況,如下圖
字段名要求單詞與單詞之間使用下劃線連接:

屬性名,單詞與單詞之間命名遵循駝峰原則:

如下所示,在進行查詢操作的時候,由于無法映射,導致empName的查詢結果為空

既然字段名和屬性名不一致了,那么該如何處理映射關系呢?
方案1
在EmpMapper.xml的SQL語句中為字段起別名,保持和屬性名的一致

結果如下所示:

方案2
在核心配置文件mybatis-config.xml中設置全局配置,將_自動映射為駝峰
<!--設置MyBatis的全局配置-->
<!--將_自動映射為駝峰 -->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
注意:MyBatis核心配置文件標簽的設置順序,要把settings放在properties和typeAlliases中間
properties?,settings?,typeAliases?,typeHandlers?,
objectFactory?,objectWrapperFactory?,reflectorFactory?,
plugins?,environments?,databaseIdProvider?,mappers?測試結果:

方案3
在核心配置文件mybatis-config.xml中,通過resultMap逐一設置自定義的映射關系
<!--
resultMap:設置自定義映射關系
id:唯一標識,不能重復
type:設置映射關系中的實體類類型
子標簽:
id:專門用來設置主鍵的映射關系
result:設置普通字段的映射關系
屬性:
property:設置映射關系中的屬性名,必須是type屬性所設置的實體類類型中的屬性名
column:設置映射關系中的字段名,必須是sql語句查詢出的字段名
要注意:1.屬性名和字段名一致的話也要寫property和column
2.要在select標簽中添加resultMap="對應resultMap的id"
-->
<resultMap id="empResultMap" type="Emp">
<id property="eid" column="eid"></id>
<result property="empName" column="emp_name"></result>
<result property="age" column="age"></result>
<result property="sex" column="sex"></result>
<result property="email" column="email"></result>
</resultMap>
<!--List<Emp> getAllEmp();-->
<select id="getAllEmp" resultMap="empResultMap">
select * from t_emp
</select>
測試結果:

2.完整代碼
項目結構

EmpMapper接口
package com.rqs.mybatis.mapper;
import com.rqs.mybatis.pojo.Emp;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface EmpMapper {
/**
* 查詢所有的員工信息
*/
List<Emp> getAllEmp();
}
Emp類
package com.rqs.mybatis.pojo;
public class Emp {
private Integer eid;
private String empName;
private Integer age;
private String sex;
private String email;
public Integer getEid() {
return eid;
}
public void setEid(Integer eid) {
this.eid = eid;
}
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 getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Emp() {
}
public Emp(Integer eid, String empName, Integer age, String sex, String email) {
this.eid = eid;
this.empName = empName;
this.age = age;
this.sex = sex;
this.email = email;
}
@Override
public String toString() {
return "Emp{" +
"eid=" + eid +
", empName='" + empName + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", email='" + email + '\'' +
'}';
}
}
SqlSessionUtils工具類
package com.rqs.mybatis.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class SqlSessionUtils {
public static SqlSession getSqlSession() {
SqlSession sqlSession = null;
try {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession(true);
} catch (IOException e) {
e.printStackTrace();
}
return sqlSession;
}
}
EmpMapper.xml
<?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.rqs.mybatis.mapper.EmpMapper">
<!--
resultMap:設置自定義映射關系
id:唯一標識,不能重復
type:設置映射關系中的實體類類型
子標簽:
id:設置主鍵的映射關系
result:設置普通字段的映射關系
屬性:
property:設置映射關系中的屬性名,必須是type屬性所設置的實體類類型中的屬性名
column:設置映射關系中的字段名,必須是sql語句查詢出的字段名
-->
<resultMap id="empResultMap" type="Emp">
<id property="eid" column="eid"></id>
<result property="empName" column="emp_name"></result>
<result property="age" column="age"></result>
<result property="sex" column="sex"></result>
<result property="email" column="email"></result>
</resultMap>
<!--List<Emp> getAllEmp();-->
<select id="getAllEmp" resultMap="empResultMap">
select * from t_emp
</select>
<select id="getAllEmpOld" resultType="Emp">
<!--select eid,emp_name empName,age,sex,email from t_emp-->
select * from t_emp
</select>
</mapper>
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis jdbc.username=root jdbc.password=root
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>
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 resource="jdbc.properties"></properties>
<!-- <!–設置MyBatis的全局配置–>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>-->
<!--設置類型別名,大小寫不敏感。
如果不設置alias,則默認為類名(大小寫不敏感)-->
<typeAliases>
<!--
typeAlias: 設置某個類型的別名
屬性:
type 設置需要設置別名的類型
alias 設置某個類型的別名,如果不設置該屬性,那么該類型擁有默認的類名,且不區(qū)分大小寫
-->
<!--<typeAlias type="com.rqs.mybatis.pojo.User" alias="User"></typeAlias>-->
<!--推薦以包為單位,將包下所有的類型設置默認的類型別名且不區(qū)分大小寫-->
<package name="com.rqs.mybatis.pojo"/>
</typeAliases>
<!--設置連接數(shù)據(jù)庫的環(huán)境-->
<!--每一個environment都是具體連接數(shù)據(jù)庫的環(huán)境-->
<!--
一個項目中只會用一個環(huán)境,default用于使用默認使用的環(huán)境:
id:表示連接數(shù)據(jù)庫的環(huán)境的唯一標識 不能重復
-->
<environments default="development">
<!--
transactionmanager:設置事務管理方式
屬性:
type="JDBC/MANAGED"
JDBC: 在當前環(huán)境中,執(zhí)行sql時,使用的時jdbc原聲的事務管理方式,需要手動的提交和回滾事務
MANAGED:被管理,例如Spring
-->
<environment id="development">
<transactionManager type="JDBC"/>
<!-- dataSource:配置數(shù)據(jù)源
屬性"
type:設置數(shù)據(jù)源的類型
type=""
POOLED:表示使用數(shù)據(jù)庫連接池緩存數(shù)據(jù)庫連接
UNPOOLED:表示不使用數(shù)據(jù)庫連接池
JNDI:表示使用上下文中的數(shù)據(jù)源
-->
<dataSource type="POOLED">
<!--設置連接數(shù)據(jù)庫的驅動-->
<property name="driver" value="${jdbc.driver}"/>
<!--設置連接地址-->
<property name="url" value="${jdbc.url}"/>
<!--注意:如果在建sql表單的時候選了字符集(如utf8),
這里的value要改成:value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8"-->
<!--用戶名和密碼-->
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件-->
<mappers>
<!--
推薦以包為單位引入映射文件,要求:
1。 mapper接口所在的包要和映射文件所在的包一致
2。 mapper接口要和映射文件的名字一致-->
<!-- com.rqs.mybatis.mapper創(chuàng)建包時要用/分隔,這樣才是目錄,否則這整一個就只是文件夾名字而已-->
<package name="com.rqs.mybatis.mapper"/>
</mappers>
</configuration>
ResultMapTest
package com.rqs.mybatis.test;
import com.rqs.mybatis.mapper.EmpMapper;
import com.rqs.mybatis.pojo.Emp;
import com.rqs.mybatis.utils.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class ResultMapTest {
/**
* 解決字段名和屬性名不一致的情況:
* a>為字段起別名,保持和屬性名的一致
* b>設置全局配置,將_自動映射為駝峰
* <setting name="mapUnderscoreToCamelCase" value="true"/>
* c>通過resultMap設置自定義的映射關系
* <resultMap id="empResultMap" type="Emp">
* <id property="eid" column="eid"></id>
* <result property="empName" column="emp_name"></result>
* <result property="age" column="age"></result>
* <result property="sex" column="sex"></result>
* <result property="email" column="email"></result>
* </resultMap>
*/
@Test
public void testGetAllEmp(){
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
List<Emp> list = mapper.getAllEmp();
list.forEach(emp -> System.out.println(emp));
}
}
到此這篇關于MyBatis自定義映射resultMap的實現(xiàn)的文章就介紹到這了,更多相關MyBatis自定義映射resultMap內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java 數(shù)據(jù)結構之堆排序(HeapSort)詳解及實例
這篇文章主要介紹了java 數(shù)據(jù)結構之堆排序(HeapSort)詳解及實例的相關資料,需要的朋友可以參考下2017-03-03
java.lang.Runtime.exec的左膀右臂:流輸入和流讀取詳解
這篇文章主要介紹了java.lang.Runtime.exec的左膀右臂:流輸入和流讀取詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
如何實現(xiàn)自己的spring boot starter
這篇文章主要介紹了如何實現(xiàn)自己的spring boot starter,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-08-08
java 重載(overload)與重寫(override)詳解及實例
這篇文章主要介紹了java 重載(overload)與重寫(override)詳解及實例的相關資料,并附實例代碼,需要的朋友可以參考下2016-10-10

