Mybatis查询语句返回对象和泛型集合的操作

Mybatis查询语句返回对象和泛型集合 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 { /*** 查询单条数据,*每一列的列名都会去Emp实体类中去匹配对应的属性*匹配时会把二边都转为小字母进行匹配*匹配成功就会调用Emp实体类中对象的set方法* * 如果列名和Emp的属性匹配不上,*1.为查询结果的列设置一个别名*2.将列名ename和属性ename1建立一个关系 单个属性建立关系* *column是不区分大小写的,property是区分大小写的* @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); /*** 查询出多条数据,每一条数据都是一个Emp对象* 每一列的列名都会去Emp实体类中去匹配对应的属性*匹配时会把二边都转为小字母进行匹配*匹配成功就会调用Emp实体类中对象的set方法* 如果没有一条数据匹配成功,则不会创建Emp对象* @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 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); //打开会话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 result = emp.queryEmp(); for (Emp emp2 : result) {System.out.println(emp2); } }}

xml映射-----------
dept_mapper.xml:
select * from dept where deptno=#{0}

测试类:
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); //打开会话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查询结果集有泛型属性时可能出现的问题 问题:
当接收结果为map或者对象的属性为泛型时:
@Datapublic class GenericKeyValueVo {private K key; private V value; }

这时候如果直接将resultType指向对象全限定名称时,可能会出现问题。因为如果查询结果的某个字段大于1000会出现","如:1,000.56 。mybatis不会报错,因为这个对象的这个属性为泛型,可以接收。而当获取结果之后即使定义接收的变量类型为:
Mybatis查询语句返回对象和泛型集合的操作
文章图片

第二个属性也会存入String类型的值。后续再处理可能就会出现将string转为double数据类型转换错误。
解决方法:
【Mybatis查询语句返回对象和泛型集合的操作】定义一个resultMap,指明javaType

再用一个convert函数规范查询结果格式
convert(FORMAT(queryResult, decimal(12, 2))

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    推荐阅读