Mybatis查詢語句返回對(duì)象和泛型集合的操作
Mybatis查詢語句返回對(duì)象和泛型集合
EmpMapper映射接口:
package cn.et.mybatis.lesson03;
import java.util.List;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
public interface EmpMapper {
/**
* 查詢單條數(shù)據(jù),
* 每一列的列名都會(huì)去Emp實(shí)體類中去匹配對(duì)應(yīng)的屬性
* 匹配時(shí)會(huì)把二邊都轉(zhuǎn)為小字母進(jìn)行匹配
* 匹配成功就會(huì)調(diào)用Emp實(shí)體類中對(duì)象的set方法
*
* 如果列名和Emp的屬性匹配不上,
* 1.為查詢結(jié)果的列設(shè)置一個(gè)別名
* 2.將列名ename和屬性ename1建立一個(gè)關(guān)系 單個(gè)屬性建立關(guān)系
*
* column是不區(qū)分大小寫的,property是區(qū)分大小寫的
* @return
*/
@Results(
{
@Result(column="ename",property="ename1"),
@Result(column="empNo",property="empNo1"),
@Result(column="sal",property="sal1"),
}
)
@Select("select * from emp where empno=#{0}")
public Emp queryEmpByEmpNo(String empNo);
/**
* 查詢出多條數(shù)據(jù),每一條數(shù)據(jù)都是一個(gè)Emp對(duì)象
* 每一列的列名都會(huì)去Emp實(shí)體類中去匹配對(duì)應(yīng)的屬性
* 匹配時(shí)會(huì)把二邊都轉(zhuǎn)為小字母進(jìn)行匹配
* 匹配成功就會(huì)調(diào)用Emp實(shí)體類中對(duì)象的set方法
* 如果沒有一條數(shù)據(jù)匹配成功,則不會(huì)創(chuàng)建Emp對(duì)象
* @param empNo
* @return
*/
@Results(
{
@Result(column="ename",property="ename1"),
@Result(column="empNo",property="empNo1"),
@Result(column="sal",property="sal1"),
}
)
@Select("select * from emp")
public List<Emp> queryEmp();
}
測試類:
package cn.et.mybatis.lesson03;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
public class TestMybatis {
public static SqlSession getSession(){
String resource = "/cn/et/mybatis/lesson03/mybatis.xml";
InputStream inputStream = TestMybatis.class.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//打開會(huì)話
SqlSession session = sqlSessionFactory.openSession();
return session;
}
public static void main(String[] args) {
SqlSession session = getSession();
EmpMapper emp = session.getMapper(EmpMapper.class);
Emp obj = emp.queryEmpByEmpNo("8000");
System.out.println(obj);
}
@Test
public void test(){
SqlSession session = getSession();
EmpMapper emp = session.getMapper(EmpMapper.class);
List<Emp> result = emp.queryEmp();
for (Emp emp2 : result) {
System.out.println(emp2);
}
}
}
xml映射-----------
dept_mapper.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">
<!--
接口映射
namespace必需跟接口的全名一致
-->
<mapper namespace="cn.et.mybatis.lesson03.resultEntityXml.DeptMapper">
<!-- column是不區(qū)分大小寫的,property是區(qū)分大小寫的 -->
<resultMap type="cn.et.mybatis.lesson03.resultEntityXml.Dept" id="myDept">
<result column="deptno" property="deptno1"/>
<result column="dname" property="dname1"/>
<result column="loc" property="loc1"/>
</resultMap>
<select id="queryDept" resultMap="myDept">
select * from dept where deptno=#{0}
</select>
</mapper>
測試類:
package cn.et.mybatis.lesson03.resultEntityXml;
import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class TestMybatis {
public static SqlSession getSession(){
String resource = "/cn/et/mybatis/lesson03/mybatis.xml";
InputStream inputStream = TestMybatis.class.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//打開會(huì)話
SqlSession session = sqlSessionFactory.openSession();
return session;
}
public static void main(String[] args) {
SqlSession session = getSession();
DeptMapper dept = session.getMapper(DeptMapper.class);
Dept result = dept.queryDept("10");
System.out.println(result);
}
}
mybatis查詢結(jié)果集有泛型屬性時(shí)可能出現(xiàn)的問題
問題:
當(dāng)接收結(jié)果為map或者對(duì)象的屬性為泛型時(shí):
@Data
public class GenericKeyValueVo<K,V> {
private K key;
private V value;
}
這時(shí)候如果直接將resultType指向?qū)ο笕薅Q時(shí),可能會(huì)出現(xiàn)問題。因?yàn)槿绻樵兘Y(jié)果的某個(gè)字段大于1000會(huì)出現(xiàn)","如:1,000.56 。mybatis不會(huì)報(bào)錯(cuò),因?yàn)檫@個(gè)對(duì)象的這個(gè)屬性為泛型,可以接收。而當(dāng)獲取結(jié)果之后即使定義接收的變量類型為:

第二個(gè)屬性也會(huì)存入String類型的值。后續(xù)再處理可能就會(huì)出現(xiàn)將string轉(zhuǎn)為double數(shù)據(jù)類型轉(zhuǎn)換錯(cuò)誤。
解決方法:
定義一個(gè)resultMap,指明javaType
<resultMap id="StrKeyDoubleValueMap" type="com.meinergy.mkting.commons.entity.wholesale.vo.GenericKeyValueVo">
<result column="key" property="key" javaType="java.lang.String"/>
<result column="value" property="value" javaType="java.lang.Double"/>
</resultMap>
再用一個(gè)convert函數(shù)規(guī)范查詢結(jié)果格式
convert(FORMAT(queryResult, decimal(12, 2))
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決Java & Idea啟動(dòng)tomcat的中文亂碼問題
這篇文章主要介紹了Java & Idea啟動(dòng)tomcat的中文亂碼問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
springboot+websocket+redis搭建的實(shí)現(xiàn)
這篇文章主要介紹了springboot+websocket+redis搭建的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
spring boot集成shiro詳細(xì)教程(小結(jié))
這篇文章主要介紹了spring boot 集成shiro詳細(xì)教程,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01
MyBatis中執(zhí)行SQL語句的幾種方式總結(jié)
MyBatis是一個(gè)優(yōu)秀的持久層框架,它支持定制化SQL、存儲(chǔ)過程以及高級(jí)映射,下面這篇文章主要給大家介紹了關(guān)于MyBatis中執(zhí)行SQL語句的幾種方式,需要的朋友可以參考下2024-04-04
java導(dǎo)出excel 瀏覽器直接下載或者或以文件形式導(dǎo)出
這篇文章主要介紹了java導(dǎo)出excel 瀏覽器直接下載或者或以文件形式導(dǎo)出方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringBoot+TestNG單元測試的實(shí)現(xiàn)
本文主要介紹了SpringBoot+TestNG單元測試的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07
springboot?集成identityserver4身份驗(yàn)證的過程解析
這篇文章主要介紹了springboot?集成identityserver4身份驗(yàn)證的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01
SpringBoot如何實(shí)現(xiàn)持久化登錄狀態(tài)獲取
這篇文章主要介紹了SpringBoot 如何實(shí)現(xiàn)持久化登錄狀態(tài)獲取,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11

