Mybatis学习笔记(五) —— Mapper.xml(输入映射和输出映射)

一、parameterType(输入类型)

1.1 传递简单类型

    <!-- 根据用户id查询用户 -->
    <select id="queryUserById" parameterType="int"
        resultType="cn.itcast.mybatis.pojo.User">
        SELECT * FROM `user` WHERE id = #{id}
    </select>

    <!-- 根据用户名模糊查询用户 -->
    <select id="queryUserByUsername" parameterType="string"
        resultType="cn.itcast.mybatis.pojo.User">
        SELECT * FROM `user` WHERE username LIKE '%${value}%'
    </select>

   使用#{}占位符,或者${}进行sql拼接

1.2 传递pojo对象

<!-- 保存用户 -->
    <insert id="saveUser" parameterType="cn.itcast.mybatis.pojo.User">
        INSERT INTO `user`(username,birthday,sex,address) VALUES
        (#{username},#{birthday},#{sex},#{address});
    </insert>

   Mybatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为pojo属性名称。

 1.3 传递pojo包装对象

  包装对象:Pojo类中的一个属性是另外一个pojo。

  需求:根据用户名模糊查询用户信息,查询条件放到QueryVo的user属性中。

1.3.1 编写QueryVo

public class QueryVo {
    // 包含其他的pojo
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
    
}

 1.3.2 Mapper.xml文件

  在UserMapper.xml中配置sql:

    <!-- 使用包装类型查询用户 -->
    <select id="queryUserByQueryVo" parameterType="queryVo" resultType="user">
        SELECT * FROM `user` WHERE username LIKE '%${user.username}%'
    </select>

 1.3.3 Mapper接口

  在UserMapper接口中添加方法:

  /**
     * 根据包装类型查询用户
     * @param queryVo
     * @return
     */
    List<User> queryUserByQueryVo(QueryVo queryVo);

 1.3.4 测试方法

@Test
    public void testQueryUserByQueryVo() throws Exception {
        // mybatis和spring整合,整合之后,交给spring管理
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 创建Mapper接口的动态代理对象,整合之后,交给spring管理
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        
        // 使用userMapper执行查询,使用包装对象
        QueryVo queryVo = new QueryVo();
        // 设置user条件
        User user = new User();
        user.setUsername("张");
        // 设置到包装对象中
        queryVo.setUser(user);
        
        // 执行查询
        List<User> list = userMapper.queryUserByQueryVo(queryVo);
        for (User user2 : list) {
            System.out.println(user2);
        }
        
        // mybatis和spring整合,整合之后,交给spring管理
        sqlSession.close();
    }

二、resultType(输出类型)

2.1 输出简单类型

  需求:查询用户表数据条数

  sql:SELECT count(*) FROM `user`

2.1.1 Mapper.xml文件

  在UserMapper.xml中配置sql:

    <!-- 查询用户数据条数 -->
    <select id="queryUserCount" resultType="int">
        SELECT COUNT(*) FROM `user`
    </select>

2.1.2 Mapper接口

  在UserMapper添加方法:

  /**
     * 查询用户数据条数
     * @return
     */
    int queryUserCount();

2.1.3 测试方法

    @Test
    public void testQueryUserCount() throws Exception {
        // mybatis和spring整合,整合之后,交给spring管理
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 创建Mapper接口的动态代理对象,整合之后,交给spring管理
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        // 使用userMapper执行查询用户数据条数
        int count = userMapper.queryUserCount();
        System.out.println(count);
        
        // mybatis和spring整合,整合之后,交给spring管理
        sqlSession.close();
    }

2.2 输出pojo对象

  <select id="queryUserById" parameterType="int"
        resultType="cn.itcast.mybatis.pojo.User">
        SELECT * FROM `user` WHERE id = #{id}
    </select>

2.3 输出pojo列表

    <!-- 根据用户名模糊查询用户 -->
    <select id="queryUserByUsername" parameterType="string"
        resultType="cn.itcast.mybatis.pojo.User">
        SELECT * FROM `user` WHERE username LIKE '%${value}%'
    </select>

三、resultMap

  resultType可以指定将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。

扫描二维码关注公众号,回复: 4707659 查看本文章

       如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。

       resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。

  需求:查询订单表order的所有数据

  sql:SELECT id, user_id, number, createtime, note FROM `order`

3.1 声明pojo对象

  数据库表如下图:

  

  Order对象:

public class Order {
    // 订单id
    private int id;
    // 用户id
    private Integer userId;
    // 订单号
    private String number;
    // 订单创建时间
    private Date createtime;
    // 备注
    private String note;
   get/set。。。
}

3.2 Mapper.xml文件

  创建OrderMapper.xml配置文件,如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,Mapper动态代理开发的时候使用,需要指定Mapper的类路径 -->
<mapper namespace="cn.itcast.mybatis.mapper.OrderMapper">
    <!-- 查询所有的订单数据 -->
    <select id="queryOrderAll" resultType="order">
        SELECT id,user_id,number,createtime,note FROM `order`
    </select>
</mapper>

 3.3 Mapper接口

public interface OrderMapper {
    /**
     * 查询所有订单
     * @return
     */
    List<Order> queryOrderAll();
}

3.4 测试方法

public class OrderMapperTest {
    
    private SqlSessionFactory sqlSessionFactory;
    
    @Before
    public void init() throws Exception{
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
    }
    
    @Test
    public void testQueryOrderAll() throws Exception {
        // 获取sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 获取OrderMapper
        OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
        // 执行查询
        List<Order> list = orderMapper.queryOrderAll();
        for (Order order : list) {
            System.out.println(order);
        }
        sqlSession.close();
    }
}

 3.5 测试效果

  

  发现userId为null

  解决方案:使用resultMap

3.6 使用resultMap

  由于上边的mapper.xml中sql查询列(user_id)和Order类属性(userId)不一致,所以查询结果不能映射到pojo中。

  需要定义resultMap,把orderResultMap将sql查询列(user_id)和Order类属性(userId)对应起来。

  改造OrderMapper.xml,如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,Mapper动态代理开发的时候使用,需要指定Mapper的类路径 -->
<mapper namespace="cn.itcast.mybatis.mapper.OrderMapper">
    <!-- resultMap最终还是要将结果映射到pojo上,type就是指定映射到哪一个pojo -->
    <!-- id:设置ResultMap的id -->
    <resultMap type="order" id="orderResultMap">
        <!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id -->
        <!-- property:主键在pojo中的属性名 -->
        <!-- column:主键在数据库中的列名 -->
        <id property="id" column="id" />
        
        <!-- 定义普通属性 -->
        <result property="userId" column="user_id" />
        <result property="number" column="number" />
        <result property="createtime" column="createtime" />
        <result property="note" column="note" />
    </resultMap>

    <!-- 查询所有的订单数据 -->
    <select id="queryOrderAll" resultMap="orderResultMap">
        SELECT
        id,user_id,number,createtime,note FROM `order`
    </select>
</mapper>

3.7 测试效果

  

猜你喜欢

转载自www.cnblogs.com/yft-javaNotes/p/10198128.html