• 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查询的列名一致方可映射成功。

           如果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 测试效果

      

  • 相关阅读:
    内置函数二
    内置函数
    【MySQL】纲举目张:打通MySQL架构和业务的任督二脉
    关闭服务器节能模式
    透明大页
    【MySQL】MySQ 8.0启用HugePage
    运维安全之Tripwire
    七字诀,不再憋屈的运维
    利用钉钉机器人发送告警信息
    【MySQL】MySQL 8.0支持utf8mb4
  • 原文地址:https://www.cnblogs.com/yft-javaNotes/p/10198128.html
Copyright © 2020-2023  润新知