zoukankan      html  css  js  c++  java
  • mybatis入门基础(四)----输入映射和输出映射

    一:输入映射 

      通过parameterType指定输入参数的类型,类型可以是简单类型、hashmappojo的包装类型。

    1.1.传递pojo的包装对象

     1.1.1.需求描述

        完成用户信息的综合查询,需要传入的查询条件可能很复杂(可能包括用户信息,其它信息,比如,商品,订单等等)。

     1.1.2.定义包装类型的pojo

        针对上边的需求,建议使用自定义的包装类型pojo,在包装类型的pojo中将复杂的查询条件包装进去。

    包装查询条件的pojo类UserQueryVo类的代码:

     1 package com.mybatis.entity;
     2 
     3 /**
     4  * 
     5 * @ClassName: UserQueryVo 
     6 * @Description: TODO(包装类型)
     7 * @author warcaft
     8 * @date 2015-6-30 上午12:00:41 
     9 *
    10  */
    11 public class UserQueryVo {
    12     //这里包装其它的查询条件
    13     //用户查询条件
    14     private UserCustom userCustom;
    15 
    16     public UserCustom getUserCustom() {
    17         return userCustom;
    18     }
    19 
    20     public void setUserCustom(UserCustom userCustom) {
    21         this.userCustom = userCustom;
    22     }
    23     //可以包装其它查询条件......
    24 
    25 }
    View Code

     UserCustom类的代码

     1 package com.mybatis.entity;
     2 /**
     3  * 
     4 * @ClassName: UserCustom 
     5 * @Description: TODO(用户的扩展类) 
     6 * @author warcaft
     7 * @date 2015-6-30 上午12:02:37 
     8 *
     9  */
    10 public class UserCustom extends User{
    11     //可以扩展用户的信息
    12 }
    View Code

     UserMapper.xml的代码

      在UserMapper.xml中定义用户信息综合查询(假设查询条件很复杂,通过高级查询复杂关联查询)

    1 <!-- 模拟包装类型组合查询 
    2     #{userCustom.sex}:取出pojo包装对象中性别值
    3     ${userCustom.username}:取出pojo对象中姓名值
    4 -->
    5     <select id="findUserList" parameterType="com.mybatis.entity.UserQueryVo" 
    6          resultType="com.mybatis.entity.UserCustom">
    7         where sex=#{userCustom.sex} and username LIKE '%${userCustom.username}%'
    8     </select>
    View Code

    UserMapper.java类的代码

     1 /**
     2  * 
     3  * @ClassName: UserMapper
     4  * @Description: TODO(用户管理mapper接口)
     5  * @author warcaft
     6  * @date 2015-6-30 上午12:14:56
     7  * 
     8  */
     9 public interface UserMapper {
    10     // 用户信息综合查询
    11     public List<UserCustom> findUserList(UserQueryVo userQueryVo);
    12 }
    View Code

    Junit单元测试代码

     1 ackage com.mybatis.dao.test;
     2 
     3 import java.io.InputStream;
     4 import java.util.Date;
     5 import java.util.List;
     6 
     7 import org.apache.ibatis.io.Resources;
     8 import org.apache.ibatis.session.SqlSession;
     9 import org.apache.ibatis.session.SqlSessionFactory;
    10 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    11 import org.junit.Before;
    12 import org.junit.Test;
    13 
    14 import com.mybatis.entity.User;
    15 import com.mybatis.entity.UserCustom;
    16 import com.mybatis.entity.UserQueryVo;
    17 import com.mybatis.mapper.UserMapper;
    18 
    19 public class UserMapperTest {
    20 
    21     private SqlSessionFactory sqlSessionFactory;
    22 
    23     // 此方法是在执行findUserByIdTest之前执行
    24     @Before
    25     public void setUp() throws Exception {
    26         String resource = "SqlMapConfig.xml";
    27         InputStream inputStream = Resources.getResourceAsStream(resource);
    28         // 创建SqlSessionFcatory
    29         sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    30     }
    31     
    32     @Test
    33     public void testFindUserList() {
    34         SqlSession sqlSession = sqlSessionFactory.openSession();
    35         //创造查询条件
    36         UserQueryVo userQueryVo = new UserQueryVo();
    37         UserCustom userCustom = new UserCustom();
    38         userCustom.setSex("2");
    39         userCustom.setUsername("小");
    40         userQueryVo.setUserCustom(userCustom);
    41         // 创建Usermapper对象,mybatis自动生成mapper代理对象
    42         UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    43         List<UserCustom>list=mapper.findUserList(userQueryVo);
    44         System.out.println(list);
    45         sqlSession.commit();
    46         sqlSession.close();
    47     }
    48 }
    View Code

    二:输出映射

    1.resultType

      使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。

      如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。

      只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。

    1.1.输出简单类型

       需求:用户信息的综合查询列表,通过查询总数才能实现分页功能。‘

       UserMapper.xml的代码 

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE mapper
     3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     5 <!-- namespace命名空间,作用就是对sql进行分类化的管理,理解为sql隔离
     6     注意:使用mapper代理开发时,namespace有特殊作用,namespace等于mapper接口地址
     7  -->
     8 <!-- 用户信息综合查询总数
     9      parameterType:指定输入类型,和findUserList一致。
    10      resultType:输出结果类型.    
    11   -->
    12 <mapper namespace="com.mybatis.mapper.UserMapper">
    13     <select id="findUserCount" parameterType="com.mybatis.entity.UserQueryVo" resultType="int">
    14         select count(*) from t_user where  sex=#{userCustom.sex} and username like '%${userCustom.username}%'
    15     </select>
    16 </mapper>

    UserMapper.java的代码

    1 public interface UserMapper {
    2     //用户信息综合查询总数
    3     public int findUserCount(UserQueryVo userQueryVo);
    4 }

    Junit测试代码

     1 package com.mybatis.dao.test;
     2 
     3 import java.io.InputStream;
     4 import java.util.Date;
     5 import java.util.List;
     6 
     7 import org.apache.ibatis.io.Resources;
     8 import org.apache.ibatis.session.SqlSession;
     9 import org.apache.ibatis.session.SqlSessionFactory;
    10 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    11 import org.junit.Before;
    12 import org.junit.Test;
    13 
    14 import com.mybatis.entity.User;
    15 import com.mybatis.entity.UserCustom;
    16 import com.mybatis.entity.UserQueryVo;
    17 import com.mybatis.mapper.UserMapper;
    18 
    19 public class UserMapperTest {
    20 
    21     private SqlSessionFactory sqlSessionFactory;
    22 
    23     // 此方法是在执行findUserByIdTest之前执行
    24     @Before
    25     public void setUp() throws Exception {
    26         String resource = "SqlMapConfig.xml";
    27         InputStream inputStream = Resources.getResourceAsStream(resource);
    28         // 创建SqlSessionFcatory
    29         sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    30     }
    31     
    32     @Test
    33     public void findUserCountTest() {
    34         SqlSession sqlSession = sqlSessionFactory.openSession();
    35         //创造查询条件
    36         UserQueryVo userQueryVo = new UserQueryVo();
    37         UserCustom userCustom = new UserCustom();
    38         userCustom.setSex("2");
    39         userCustom.setUsername("小");
    40         userQueryVo.setUserCustom(userCustom);
    41         // 创建Usermapper对象,mybatis自动生成mapper代理对象
    42         UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    43         int count=mapper.findUserCount(userQueryVo);
    44         System.out.println(count);
    45         sqlSession.commit();
    46         sqlSession.close();
    47     }
    48 }
    View Code

    小结:查询出来的结果集只有一行一列,可以使用简单类型进行输出映射。

    1.2.输出pojo对象和pojo列表   

       不管是输出的pojo单个对象还是一个列表(list中包括pojo),在mapper.xmlresultType指定的类型是一样的。

      在mapper.java指定的方法返回值类型不一样。

     1.2.1.输出单个pojo对象,方法返回值是单个对象类型

    1 public interface UserMapper {
    2     /** 根据ID查询用户信息 */
    3     public User findUserById(int id);
    4 }

     1.2.2.输出pojo对象list,方法返回值是List<pojo>

    1 public interface UserMapper {
    2     /** 根据用户名称模糊查询用户信息 */
    3     public List<User> findUserByName(String username);
    4 }

    小结:生成的动态代理对象中是根据mapper.java方法的返回值类型确定是调用selectOne(返回单个对象调用)还是selectList(返回集合对象调用)

    1.3.输出类型resultMap

        mybatis中使用resultMap完成高级输出结果映射。

     1.3.1.resultMap使用方法

        (1).定义resultMap

        (2).使用resultMap作为statement的输出映射类型

     1.3.2.demo例子

      (1).需求:将下面的sql使用User完成映射

        select id id_,username username_ from t_user where id=?

        User类中属性名和上边的列名不一致。

      (2).定义resultMap   

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2  <!DOCTYPE mapper
     3  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     4   "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     5   <!-- namespace命名空间,作用就是对sql进行分类化的管理,理解为sql隔离
     6     注意:使用mapper代理开发时,namespace有特殊作用,namespace等于mapper接口地址
     7   -->
     8    <!-- 用户信息综合查询总数
     9      parameterType:指定输入类型,和findUserList一致。
    10       resultType:输出结果类型.    
    11    -->
    12  <mapper namespace="com.mybatis.mapper.UserMapper">
    13  <!-- 定义resultMap 
    14      select id id_,username username_ from t_user和User类中的属性作为一个映射关系
    15     type:resultMap最终映射的java对象类型,可以使用别名;
    16      id:对resultMap的唯一标识
    17  -->
    18  <resultMap type="user" id="userResultMap">
    19      <!--id表示查询结果中的唯一标识,
    20          column:查询出来的列名
    21          property:type指定的pojo类型中的属性名
    22         最终resultMap对column和property作一个映射关系(对应关系)
    23       -->
    24      <id column="id_" property="id"/>
    25      <!--result:表示对普通列名的映射,
    26         column:查询出来的列名
    27        property:type指定的pojo类型中的属性名
    28          最终resultMap对column和property作一个映射关系(对应关系)
    29        -->
    30      <result column="username_" property="username"/>
    31  </resultMap>
    32  </mapper>

      (3).使用resultMap作为statement的输出类型映射

    1 <!-- 使用resultMap作为输出映射
    2     resultMap:指定定义的resultMap的id,如果这个resultMap在其它的mapper.xml文件中,前边需要添加namespace命名空间
    3  -->
    4 <select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap" >
    5     select id id_,username username_ from t_user where id=#{id}
    6 </select>

    UserMapper.java代码

    public interface UserMapper {
    
        /** 根据ID查询用户信息,使用resultMap进行输出 */
        public User findUserByIdResultMap(int id);
    }

    Junit测试代码:

     1 package com.mybatis.dao.test;
     2 
     3 import java.io.InputStream;
     4 import java.util.Date;
     5 import java.util.List;
     6 
     7 import org.apache.ibatis.io.Resources;
     8 import org.apache.ibatis.session.SqlSession;
     9 import org.apache.ibatis.session.SqlSessionFactory;
    10 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    11 import org.junit.Before;
    12 import org.junit.Test;
    13 
    14 import com.mybatis.entity.User;
    15 import com.mybatis.entity.UserCustom;
    16 import com.mybatis.entity.UserQueryVo;
    17 import com.mybatis.mapper.UserMapper;
    18 
    19 public class UserMapperTest {
    20 
    21     private SqlSessionFactory sqlSessionFactory;
    22 
    23     // 此方法是在执行findUserByIdTest之前执行
    24     @Before
    25     public void setUp() throws Exception {
    26         String resource = "SqlMapConfig.xml";
    27         InputStream inputStream = Resources.getResourceAsStream(resource);
    28         // 创建SqlSessionFcatory
    29         sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    30     }
    31     
    32     @Test
    33     public void testFindUserByIdResultMap() {
    34         SqlSession sqlSession = sqlSessionFactory.openSession();
    35         // 创建Usermapper对象,mybatis自动生成mapper代理对象
    36         UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    37         User user = mapper.findUserByIdResultMap(1);
    38         System.out.println(user);
    39         sqlSession.close();
    40     }
    41 }
    View Code

    小结:

      用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。

      如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。

  • 相关阅读:
    HDU3336 Count the string —— KMP next数组
    CodeForces
    51Nod 1627 瞬间移动 —— 组合数学
    51Nod 1158 全是1的最大子矩阵 —— 预处理 + 暴力枚举 or 单调栈
    51Nod 1225 余数之和 —— 分区枚举
    51Nod 1084 矩阵取数问题 V2 —— 最小费用最大流 or 多线程DP
    51Nod 机器人走方格 V3 —— 卡特兰数、Lucas定理
    51Nod XOR key —— 区间最大异或值 可持久化字典树
    HDU4825 Xor Sum —— Trie树
    51Nod 1515 明辨是非 —— 并查集 + 启发式合并
  • 原文地址:https://www.cnblogs.com/selene/p/4609205.html
Copyright © 2011-2022 走看看