您好,登錄后才能下訂單哦!
這篇文章主要講解了“MyBatis如何自定義映射resultMap”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“MyBatis如何自定義映射resultMap”吧!
t_emp
添加測試數據:
在src/main/java/com/rqs/mybatis/pojo下創建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 + '\'' + '}'; } }
在之前實現查詢功能的時候,用到的都是resultType來設置默認的映射關系,要求字段名(數據庫表中的字段名)和屬性名(java類中的屬性名)保持一致,例如下圖所示,字段名和屬性名是一致的。
字段名:
屬性名:
但是,在本例中,出現了字段名和屬性名不一致的情況,如下圖
字段名要求單詞與單詞之間使用下劃線連接:
屬性名,單詞與單詞之間命名遵循駝峰原則:
如下所示,在進行查詢操作的時候,由于無法映射,導致empName的查詢結果為空
既然字段名和屬性名不一致了,那么該如何處理映射關系呢?
在EmpMapper.xml的SQL語句中為字段起別名,保持和屬性名的一致
結果如下所示:
在核心配置文件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?
測試結果:
在核心配置文件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>
測試結果:
項目結構
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 設置某個類型的別名,如果不設置該屬性,那么該類型擁有默認的類名,且不區分大小寫 --> <!--<typeAlias type="com.rqs.mybatis.pojo.User" alias="User"></typeAlias>--> <!--推薦以包為單位,將包下所有的類型設置默認的類型別名且不區分大小寫--> <package name="com.rqs.mybatis.pojo"/> </typeAliases> <!--設置連接數據庫的環境--> <!--每一個environment都是具體連接數據庫的環境--> <!-- 一個項目中只會用一個環境,default用于使用默認使用的環境: id:表示連接數據庫的環境的唯一標識 不能重復 --> <environments default="development"> <!-- transactionmanager:設置事務管理方式 屬性: type="JDBC/MANAGED" JDBC: 在當前環境中,執行sql時,使用的時jdbc原聲的事務管理方式,需要手動的提交和回滾事務 MANAGED:被管理,例如Spring --> <environment id="development"> <transactionManager type="JDBC"/> <!-- dataSource:配置數據源 屬性" type:設置數據源的類型 type="" POOLED:表示使用數據庫連接池緩存數據庫連接 UNPOOLED:表示不使用數據庫連接池 JNDI:表示使用上下文中的數據源 --> <dataSource type="POOLED"> <!--設置連接數據庫的驅動--> <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創建包時要用/分隔,這樣才是目錄,否則這整一個就只是文件夾名字而已--> <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”的內容了,經過本文的學習后,相信大家對MyBatis如何自定義映射resultMap這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。