mybatis框架让我们能在编程中只需要编写一个接口,然后再编写mapper映射文件,无需编写接口的实现类就可以实现从数据库检索数据。这是mybatis通过动态代理,把mapper映射文件的内容转化为真正的执行部分。因此我们在编程中,需要特别关注接口和映射文件的编写。本节主要讲解接口方法的返回值类型在mapper文件中的编写方式。

我们思考下,返回值类型一般分为

  • 数字类型,比如查询记录的个数
  • 单个对象
  • 多个对象,使用List封装
  • 单个对象,使用map封装
  • 多个对象,使用map封装

由于每次建立工程比较复杂,可以参考第一节:mybatis入门来搭建一个简单的工程,然后来测试本节内容。

注意本节内容关注点是mapper接口方法的返回值类型和mapper文件的resultType的编写。

1、返回值类型为数字类型


1、mapper接口,我们简单查询所有记录,返回Long类型的值。

public interface PersonMapper
{
Long getTotalNumberOfPerson();
}

2、mapper映射文件

<select id="getTotalNumberOfPerson" resultType="long">
select count(*) from person
</select>

注意在mapper文件中,只需要 resultType 为 long 类型即可。

3、测试

public class Main
{
public static void main(String[] args)
throws IOException
{
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
Long totalNumberOfPerson= mapper.getTotalNumberOfPerson();
System.out.println(totalNumberOfPerson); //10
sqlSession.close();
}
}

2、查询单个对象


这种查询直接返回和数据库表对应的相关实体,并且只有一条记录,一般都是按照id去查询,也就是第一节:mybatis入门中演示的样例,我们再次说明下。

1、mapper接口

public interface PersonMapper
{
Person getPerson(Integer id);
}

2、mapper映射文件

<select id="getPerson" resultType="com.yefengyu.mybatis.entity.Person">
select id, first_name firstName, last_name lastName, age, email, address from person where id = #{id}
</select>

3、测试

public class Main
{
public static void main(String[] args)
throws IOException
{
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
Person person = mapper.getPerson(1);
System.out.println(person);
sqlSession.close();
}
}

总结:在查询单个对象,返回的是实体类型的时候,只需要将resultType设置为全类名即可。

3、查询多个对象,使用list封装


这种查询一般是根据某种条件,查询出很多个结果,然后使用List封装起来。

1、mapper接口,根据address查询多个Person对象

public interface PersonMapper
{
List<Person> getPersons(String address);
}

2、mapper映射文件,注意对于mapper接口中返回List类型的,mapper映射文件的resultType只需要设置List所包含的对象的类型即可。

<select id="getPersons" resultType="com.yefengyu.mybatis.entity.Person">
select id, first_name firstName, last_name lastName, age, email, address from person where address = #{address}
</select>

3、测试

public class Main
{
public static void main(String[] args)
throws IOException
{
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
List<Person> persons = mapper.getPersons("beijing");
for (int i = 0; i < persons.size(); i++)
{
System.out.println(persons.get(i));
}
sqlSession.close();
}
}

4、结果:

Person{id=1, firstName='Schmitt', lastName='Carine', age=25, email='null', address='beijing'}
Person{id=2, firstName='King', lastName='Jean', age=36, email='Jean@163.com', address='beijing'}
Person{id=8, firstName='Gao', lastName='Diego', age=45, email='66666@qq.com', address='beijing'}
Person{id=9, firstName='Piestrzeniewicz', lastName='Schmitt', age=36, email='44444@qq.com', address='beijing'}
Person{id=10, firstName='Frdrique', lastName='Juri', age=25, email='99999@qq.com', address='beijing'}

4、查询单个对象,使用map封装


这种情况,类似第二小节,也是单个对象,只不过我们需要返回的是一个map,将单个对象封装成map,数据库的列名对应的属性名称作为key,返回的结果作为value.

1、mapper接口

public interface PersonMapper
{
Map<String, Object> getPersonMap(Integer id);
}

2、mapper映射文件,此时需要把resultType设置为map

<select id="getPersonMap" resultType="map">
select id, first_name firstName, last_name lastName, age, email, address from person where id = #{id}
</select>

3、测试

public class Main
{
public static void main(String[] args)
throws IOException
{
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
Map<String, Object> personMap = mapper.getPersonMap(1);
System.out.println(personMap);
sqlSession.close();
}
}

4、结果如下,注意在使用map接收返回值的时候,如果某个字段为null,那么就不会封装到map中,比如下面的结果中就没有Email字段的结果。

{firstName=Schmitt, lastName=Carine, address=beijing, id=1, age=25}

5、查询多个对象,使用map封装


这个情况,一般是查询多条记录,使用主键作为key,使用对象作为value,见下面mapper接口。

1、mapper接口

public interface PersonMapper
{
@MapKey("id")
Map<Integer, Person> getPersonsMap(String address);
}

2、mapper映射文件

<select id="getPersonsMap" resultType="map">
select id, first_name firstName, last_name lastName, age, email, address from person where address = #{address}
</select>

3、测试

public class Main
{
public static void main(String[] args)
throws IOException
{
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
Map<Integer, Person> personMap = mapper.getPersonsMap("beijing");
for (Map.Entry<Integer, Person> personEntry : personMap.entrySet())
{
System.out.println(personEntry.getKey() + " : " + personEntry.getValue());
}
sqlSession.close();
}
}

4、结果

1 : {firstName=Schmitt, lastName=Carine, address=beijing, id=1, age=25}
2 : {firstName=King, lastName=Jean, address=beijing, id=2, age=36, email=Jean@163.com}
8 : {firstName=Gao, lastName=Diego, address=beijing, id=8, age=45, email=66666@qq.com}
9 : {firstName=Piestrzeniewicz, lastName=Schmitt, address=beijing, id=9, age=36, email=44444@qq.com}
10 : {firstName=Frdrique, lastName=Juri, address=beijing, id=10, age=25, email=99999@qq.com}

注意:mapper接口需要使用MapKey注解指定将某个属性的值作为map的key。本例中使用person表的主键id对应的实体的属性id作为key。除此之外,mapper映射文件中resultType设置为map。此外如果某个字段为null,那么就不插入到map中。

6、总结


  • 数字类型,比如查询记录的个数。resultType为 int 或者 long等。

  • 单个对象。resultType为对象全类名
  • 多个对象,使用List封装。resultType为对象全类名。
  • 单个对象,使用map封装。resultType为map。
  • 多个对象,使用map封装。resultType为map。注意mapper接口的方法需要使用MapKey注解指定key为哪个属性。

mybatis之返回值总结的更多相关文章

  1. Mybatis select返回值为map时,选取表字段的两列作为key,value

    项目需要从ibatis升级到MyBatis,dao中有一个方法返回Map类型,具体是查询语句查询两个字段,将结果列表字段A的值作为key字段B的值作为value存入Map中作为结果返回: ibatis ...

  2. Mybatis(三)返回值

    Mybatis返回值 MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则 ...

  3. mybatis update 返回值

    mybatis sql: <update id="test" parameterType="map"> update test_0731 set n ...

  4. 深入了解MyBatis返回值

    深入了解MyBatis返回值 想了解返回值,我们须要了解resultType,resultMap以及接口方法中定义的返回值. 我们先看resultType和resultMap resultType和r ...

  5. MyBatis中Mapper的返回值类型

    insert.update.delete语句的返回值类型 对数据库执行修改操作时,数据库会返回受影响的行数. 在MyBatis(使用版本3.4.6,早期版本不支持)中insert.update.del ...

  6. Mybatis 实用篇(四)返回值类型

    Mybatis 实用篇(四)返回值类型 一.返回 List.Map List<User> getUsers(); <select id="getUsers" re ...

  7. Mybatis执行sql(insert、update、delete)返回值问题

    数据库:Mysql 在使用mybatis的过程中对执行sql的返回值产生疑问,顺手记录一下. 结论: insert:   插入n条记录,返回影响行数n.(n>=1,n为0时实际为插入失败) up ...

  8. mybatis Mapper 中resultType使用方法及返回值为Map的写法

    mybatis学习(七)——resultType解析 resultType是sql映射文件中定义返回值类型,返回值有基本类型,对象类型,List类型,Map类型等.现总结一下再解释 总结: resul ...

  9. MyBatis查询结果resultType返回值类型详细介绍

    一.返回一般数据类型 比如要根据 id 属性获得数据库中的某个字段值. mapper 接口: // 根据 id 获得数据库中的 username 字段的值 String getEmpNameById( ...

随机推荐

  1. upc组队赛14 As rich as Crassus【扩展中国剩余定理】

    As rich as Crassus 题目链接 题目描述 Crassus, the richest man in the world, invested some of his money with ...

  2. A Bite Of React(1)

    react: component and views : produce html abd add them on a page( in the dom) <import React from ...

  3. a标签的锚点链接

    <a href="#creditor" class="clearfix nav_creditor"> <div class="sec ...

  4. 配置静态IP时候route没有设置的GATEWAY问题

    今天在想把虚拟机里RHEL6.5设置成静态IP来着 在 /etc/sysconfig/betwork-scripts/ifcfg-eth0 文件中将"GATEWAY"拼写成了&qu ...

  5. .net core swagger汉化

    基本swagger使用不再详解,具体百度其它帖子 1.将汉化的swagger js文件复制到项目根目录中 js代码如下 'use strict'; /** * Translator for docum ...

  6. wpf 查找控件

    public List<T> GetChildObjects<T>(DependencyObject obj, Type typename) where T : Framewo ...

  7. 轻量级Spring定时任务(Spring-task)

    Spring3.0以后自主开发的定时任务工具,spring-task,可以将它比作一个轻量级的Quartz,而且使用起来很简单,除spring相关的包外不需要额外的包,而且支持注解和配置文件两种形式. ...

  8. C++中static的作用

    tatic关键字有俩作用:(1).控制存储分配:(2).控制一个名字的可见性和连接.   随着C++名字空间的引入,我们有了更好的,更灵活的方法来控制一个大项目的名字增长.     在类的内部使用st ...

  9. JDBC中如何进行事务处理?

    Connection提供了事务处理的方法,通过调用setAutoCommit(false)可以设置手动提交事务:当事务完成后用commit()显式提交事务:如果在事务处理过程中发生异常则通过rollb ...

  10. Quartz -----定时任务框架

    一.什么是Quartz     由java开发用来执行定时任务,类似于java.util.Timer.   但是相较于Timer,quartz增加了很多功能:                  持久性 ...