zoukankan      html  css  js  c++  java
  • 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='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为哪个属性。
  • 相关阅读:
    TCC
    使用RocketMQ实现分布式事务
    CentOS关机
    使用grub手动引导linux和windows
    CentOS下X Window与命令行界面的切换
    Centos下 为firefox安装flash插件
    tar.xz文件如何解压
    用Linux命令wget进行整站下载
    CentOS关闭火狐浏览器Flash过期提示
    CentOS普通用户添加sudo权限
  • 原文地址:https://www.cnblogs.com/ye-feng-yu/p/10987587.html
Copyright © 2011-2022 走看看