MyBatis自定義映射resultMap的實(shí)現(xiàn)
1 準(zhǔn)備工作
1.1 建表
t_emp
添加測(cè)試數(shù)據(jù):
1.2 創(chuàng)建實(shí)體類(lèi)
在src/main/java/com/rqs/mybatis/pojo下創(chuàng)建Emp類(lèi):
Emp類(lèi):
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 引出一個(gè)問(wèn)題
在之前實(shí)現(xiàn)查詢功能的時(shí)候,用到的都是resultType來(lái)設(shè)置默認(rèn)的映射關(guān)系,要求字段名(數(shù)據(jù)庫(kù)表中的字段名)和屬性名(java類(lèi)中的屬性名)保持一致,例如下圖所示,字段名和屬性名是一致的。
字段名:
屬性名:
但是,在本例中,出現(xiàn)了字段名和屬性名不一致的情況,如下圖
字段名要求單詞與單詞之間使用下劃線連接:
屬性名,單詞與單詞之間命名遵循駝峰原則:
如下所示,在進(jìn)行查詢操作的時(shí)候,由于無(wú)法映射,導(dǎo)致empName的查詢結(jié)果為空
既然字段名和屬性名不一致了,那么該如何處理映射關(guān)系呢?
方案1
在EmpMapper.xml的SQL語(yǔ)句中為字段起別名,保持和屬性名的一致
結(jié)果如下所示:
方案2
在核心配置文件mybatis-config.xml中設(shè)置全局配置,將_自動(dòng)映射為駝峰
<!--設(shè)置MyBatis的全局配置--> <!--將_自動(dòng)映射為駝峰 --> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>
注意
:MyBatis核心配置文件標(biāo)簽的設(shè)置順序,要把settings放在properties和typeAlliases中間
properties?,settings?,typeAliases?,typeHandlers?, objectFactory?,objectWrapperFactory?,reflectorFactory?, plugins?,environments?,databaseIdProvider?,mappers?
測(cè)試結(jié)果:
方案3
在核心配置文件mybatis-config.xml中,通過(guò)resultMap逐一設(shè)置自定義的映射關(guān)系
<!-- resultMap:設(shè)置自定義映射關(guān)系 id:唯一標(biāo)識(shí),不能重復(fù) type:設(shè)置映射關(guān)系中的實(shí)體類(lèi)類(lèi)型 子標(biāo)簽: id:專(zhuān)門(mén)用來(lái)設(shè)置主鍵的映射關(guān)系 result:設(shè)置普通字段的映射關(guān)系 屬性: property:設(shè)置映射關(guān)系中的屬性名,必須是type屬性所設(shè)置的實(shí)體類(lèi)類(lèi)型中的屬性名 column:設(shè)置映射關(guān)系中的字段名,必須是sql語(yǔ)句查詢出的字段名 要注意:1.屬性名和字段名一致的話也要寫(xiě)property和column 2.要在select標(biāo)簽中添加resultMap="對(duì)應(yīng)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>
測(cè)試結(jié)果:
2.完整代碼
項(xiàng)目結(jié)構(gòu)
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類(lèi)
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工具類(lèi)
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:設(shè)置自定義映射關(guān)系 id:唯一標(biāo)識(shí),不能重復(fù) type:設(shè)置映射關(guān)系中的實(shí)體類(lèi)類(lèi)型 子標(biāo)簽: id:設(shè)置主鍵的映射關(guān)系 result:設(shè)置普通字段的映射關(guān)系 屬性: property:設(shè)置映射關(guān)系中的屬性名,必須是type屬性所設(shè)置的實(shí)體類(lèi)類(lèi)型中的屬性名 column:設(shè)置映射關(guān)系中的字段名,必須是sql語(yǔ)句查詢出的字段名 --> <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核心配置文件,標(biāo)簽的順序 properties?,settings?,typeAliases?,typeHandlers?, objectFactory?,objectWrapperFactory?,reflectorFactory?, plugins?,environments?,databaseIdProvider?,mappers?--> <properties resource="jdbc.properties"></properties> <!-- <!–設(shè)置MyBatis的全局配置–> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>--> <!--設(shè)置類(lèi)型別名,大小寫(xiě)不敏感。 如果不設(shè)置alias,則默認(rèn)為類(lèi)名(大小寫(xiě)不敏感)--> <typeAliases> <!-- typeAlias: 設(shè)置某個(gè)類(lèi)型的別名 屬性: type 設(shè)置需要設(shè)置別名的類(lèi)型 alias 設(shè)置某個(gè)類(lèi)型的別名,如果不設(shè)置該屬性,那么該類(lèi)型擁有默認(rèn)的類(lèi)名,且不區(qū)分大小寫(xiě) --> <!--<typeAlias type="com.rqs.mybatis.pojo.User" alias="User"></typeAlias>--> <!--推薦以包為單位,將包下所有的類(lèi)型設(shè)置默認(rèn)的類(lèi)型別名且不區(qū)分大小寫(xiě)--> <package name="com.rqs.mybatis.pojo"/> </typeAliases> <!--設(shè)置連接數(shù)據(jù)庫(kù)的環(huán)境--> <!--每一個(gè)environment都是具體連接數(shù)據(jù)庫(kù)的環(huán)境--> <!-- 一個(gè)項(xiàng)目中只會(huì)用一個(gè)環(huán)境,default用于使用默認(rèn)使用的環(huán)境: id:表示連接數(shù)據(jù)庫(kù)的環(huán)境的唯一標(biāo)識(shí) 不能重復(fù) --> <environments default="development"> <!-- transactionmanager:設(shè)置事務(wù)管理方式 屬性: type="JDBC/MANAGED" JDBC: 在當(dāng)前環(huán)境中,執(zhí)行sql時(shí),使用的時(shí)jdbc原聲的事務(wù)管理方式,需要手動(dòng)的提交和回滾事務(wù) MANAGED:被管理,例如Spring --> <environment id="development"> <transactionManager type="JDBC"/> <!-- dataSource:配置數(shù)據(jù)源 屬性" type:設(shè)置數(shù)據(jù)源的類(lèi)型 type="" POOLED:表示使用數(shù)據(jù)庫(kù)連接池緩存數(shù)據(jù)庫(kù)連接 UNPOOLED:表示不使用數(shù)據(jù)庫(kù)連接池 JNDI:表示使用上下文中的數(shù)據(jù)源 --> <dataSource type="POOLED"> <!--設(shè)置連接數(shù)據(jù)庫(kù)的驅(qū)動(dòng)--> <property name="driver" value="${jdbc.driver}"/> <!--設(shè)置連接地址--> <property name="url" value="${jdbc.url}"/> <!--注意:如果在建sql表單的時(shí)候選了字符集(如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)建包時(shí)要用/分隔,這樣才是目錄,否則這整一個(gè)就只是文件夾名字而已--> <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>設(shè)置全局配置,將_自動(dòng)映射為駝峰 * <setting name="mapUnderscoreToCamelCase" value="true"/> * c>通過(guò)resultMap設(shè)置自定義的映射關(guān)系 * <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)); } }
到此這篇關(guān)于MyBatis自定義映射resultMap的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MyBatis自定義映射resultMap內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中重載與重寫(xiě)的對(duì)比與區(qū)別
這篇文章主要介紹了Java中重載與重寫(xiě)的對(duì)比與區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-03-03java 數(shù)據(jù)結(jié)構(gòu)之堆排序(HeapSort)詳解及實(shí)例
這篇文章主要介紹了java 數(shù)據(jù)結(jié)構(gòu)之堆排序(HeapSort)詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03java.lang.Runtime.exec的左膀右臂:流輸入和流讀取詳解
這篇文章主要介紹了java.lang.Runtime.exec的左膀右臂:流輸入和流讀取詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11一文帶你吃透JSP增刪改查實(shí)戰(zhàn)案例詳細(xì)解讀
這篇文章主要為大家詳細(xì)介紹了JSP中增刪改查實(shí)戰(zhàn)案例的相關(guān)知識(shí),文中的示例代碼講解現(xiàn)象,具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下2023-03-03java異步寫(xiě)日志到文件中實(shí)現(xiàn)代碼
這篇文章主要介紹了java異步寫(xiě)日志到文件中實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04如何實(shí)現(xiàn)自己的spring boot starter
這篇文章主要介紹了如何實(shí)現(xiàn)自己的spring boot starter,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08java 重載(overload)與重寫(xiě)(override)詳解及實(shí)例
這篇文章主要介紹了java 重載(overload)與重寫(xiě)(override)詳解及實(shí)例的相關(guān)資料,并附實(shí)例代碼,需要的朋友可以參考下2016-10-10