第二节:mybatis之返回值总结

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=‘[email protected]‘, address=‘beijing‘}
Person{id=8, firstName=‘Gao‘, lastName=‘Diego‘, age=45, email=‘[email protected]‘, address=‘beijing‘}
Person{id=9, firstName=‘Piestrzeniewicz‘, lastName=‘Schmitt‘, age=36, email=‘[email protected]‘, address=‘beijing‘}
Person{id=10, firstName=‘Frdrique‘, lastName=‘Juri‘, age=25, email=‘[email protected]‘, 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 protected].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 protected]}

注意: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为哪个属性。

原文地址:https://www.cnblogs.com/ye-feng-yu/p/10987587.html

时间: 2024-11-09 20:00:31

第二节:mybatis之返回值总结的相关文章

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

项目需要从ibatis升级到MyBatis,dao中有一个方法返回Map类型,具体是查询语句查询两个字段,将结果列表字段A的值作为key字段B的值作为value存入Map中作为结果返回: ibatis中Dao继承SqlMapClientDaoSupport类的queryForMap(String statement, Object param, String key, String value)方法可直接实现: MyBatis的SqlSession中只有selectMap(String stat

flask第二篇 三剑客+特殊返回值

1.Flask中的HTTPResponse 在Flask 中的HttpResponse 在我们看来其实就是直接返回字符串 2.Flask中的Redirect 每当访问"/redi"这个地址的时候,视图函数redi会触发redirect("/") 跳转到url地址:  "/" 并会触发"/"对应的视图函数index() 3.Flask 中的 render (render_template) HTML模板渲染是每个Web框架中都必

第二节 MyBatis的技巧优化

MyBatis的技巧优化 2016年3月2日 星期三 09:13 ?配置日志文件 ?练习 作业: 请分别查询 姓为林的数据  LIKE 3种 Select * from sys_user where user_name like '林%' 关于结果集合多个参数传递数据 特殊字符的处理 核心配置文件,加载jdbc.properties的属性文件 封装工具类

深入了解MyBatis返回值

深入了解MyBatis返回值 想了解返回值,我们需要了解resultType,resultMap以及接口方法中定义的返回值. 我们先看resultType和resultMap resultType和resultMap 大家应该都知道在MyBatis的<select>标签中有两种设置返回值的方式,分别是resultMap和resultType. 处理resultMap和resultType的代码如下: private void setStatementResultMap( String resu

mybatis中查询结果为空时不同返回类型对应返回值

今天在别人的代码基础上实现新需求,看到对于mybatis查询结果的判断不是很正确,如果查询结果为空就会异常,不知道大家有没有这样的疑惑:mybatis中resultType有多种返回类型,对于每种不同类型,查询结果为空时dao接口的返回值是一样的吗?接下来我就总结一下常见的几种情况. 第一种:resultType为基本类型,如string(在此暂且把string归纳为基本类型) 如果select的结果为空,则dao接口返回结果为null 第二种,resultType为基本类型,如int 后台报异

myBatis中的注解@Param、返回值为Map、JAVA读取Excel并解析文本、Class.getResource()和ClassLoader.getResource()

myBatis中的注解@Param:http://blog.csdn.net/gao36951/article/details/44258217:  http://www.cnblogs.com/thomas12112406/p/6217211.html. myBatis返回值为Map:http://blog.csdn.net/werewr342352321df/article/details/11892755. ====================== JAVA读取Excel并解析文本:h

第二天,函数的返回值return

首先是前一天问题的答案 第一题: <!DOCTYPE html> <html lang="en"> <heda> <meta charset="UTF-8">  <title></title> </head> <body> </body> </html> 第二题: 结构-HTML 表现-CSS 行为-JavaScript 第三题 <!DOCT

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

Mybatis 实用篇(四)返回值类型 一.返回 List.Map List<User> getUsers(); <select id="getUsers" resultType="User"> select * from user; </select> Map<String, Object> getUsers(); <select id="getUsers" resultType="

MyBatis中Mapper的返回值类型

insert.update.delete语句的返回值类型 对数据库执行修改操作时,数据库会返回受影响的行数. 在MyBatis(使用版本3.4.6,早期版本不支持)中insert.update.delete语句的返回值可以是Integer.Long和Boolean.在定义Mapper接口时直接指定需要的类型即可,无需在对应的<insert><update><delete>标签中显示声明. 对应的代码在 org.apache.ibatis.binding.MapperMe