九点钟☆方向

记录成长点滴

欢迎来到我的个人博客~


Mybatis笔记(四) Mybatis参数配置及输出结果封装

目录

Mybatis参数深入:

parameterType 配置参数

  1. 使用标签的 parameterType 属性来设定。该属性的取值可以是基本类型,引用类型(例如:String 类型),还可以是实体类类型(POJO 类)。同时也可以使用实体类的包装类
  2. 基 本 类 型 和 String 我 们 可 以 直 接 写 类 型 名 称 , 也 可 以 使 用 包 名 . 类 名 的 方 式 , 例 如 : java.lang.String
  3. 实体类类型,目前我们只能使用全限定类名。究其原因,是 mybaits 在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名,而我们的是实体类并没有注册别名,所以必须写全限定类名。
  4. 1602638104630

参数绑定

  1. 当DAO接口方法中只存在一个参数,并且类型为基本类型及其包装类或者String类型时,则变量名称与mapper中#{}中的名字没有任何关系

    public interface IUserMapper{
        public User queryUserById(int id);
    }
    
    <select id="queryUserById" parameterType="int" resultType="com.mg.entity.User">
    	select * from user where id=#{uid}
    </select>
    
  2. mapper文件中可通过下标来写,下标起始为0 (可读性差)

    public interface IUserMapper{
    	public User query(String name,String password);
    }
    
    <select id="query" resultType="com.mg.entity.User">
    	select * from user where name=#{0} and password=#{1}
    </select>
    
  3. 注解方式

    public interface IUserMapper{
       public User query(@Param("name")String name,@Param("pwd")String password);
    }
    
    <select id="query" resultType="com.mg.entity.User">
        <!--#{}里面的内容要和注解里的一致-->
    	select * from user where name=#{name} and password=#{pwd}
    </select>
    
  4. 使用Map

    public interface IUserMapper{
       public User query(Map<String,String> params);
    }
    

    实际使用中对map进行赋值

    params.put("name","aa");
    params.put("pwd","123");
    
    <select id="query" parameterType="map" resultType="com.mg.entity.User">
        <!--#{}里面的内容要和map里的一致-->
    	select * from user where name=#{name} and password=#{pwd}
    </select>
    
  5. 传递POJO包装类对象

    查询条件是综合的,比如查询时的信息不仅包含用户信息还包含购买商品的信息。这时就可以通过POJO类传递查询条件。

    新建QueryVo类

    public class QueryVo{
        private User user;
        ………其他属性比如商品的………
        get/set方法
    }
    

    持久层接口中

    List<User> findUserByVo(QueryVo vo);
    

    映射配置文件中

    <select id="findUserByVo" parameterType="com.mg.QueryVo" resultType="com.mg.entity.User">
    	select * from user where username like #{user.username}
    </select>
    

    细节

    #{user.username}要先写QueryVo的属性,再写user的属性

Mybatis输出结果封装:

resultType配置结果集

  1. resultType 属性可以指定结果集的类型,它支持基本类型和实体类类型。
  2. 和 parameterType 一样,如果注册过类型别名的,可以直接使用别名。没有注册过的必须使用全限定类名。
  3. 当是实体类名称是,实体类中的属性名称必须和查询语句中的列名保持一致,否则无法实现封装。 当不一致时需要以下解决方案

解决实体类中的属性名称和查询语句中的列名不一致问题

例如:实体类中属性为userId,userName,userAddress

​ 数据库表中列名为id,username,address

  1. 通过as起别名(执行效率高,如果查询很多书写起来很麻烦)

    <select id="findAll" resultType="com.mg.entity.User" >
        <!--username不做别名也可以,因为mysql 在 windows 系统中不区分大小写!-->
    	select id as userId,username as userName,address as userAddress from user
    </select>
    
  2. 通过resultMap(因为要多解析一段xml执行效率要比起别名慢,但是开发效率高,只需要写一遍以后直接饮用即可)

    <!-- 建立 User 实体和数据库表的对应关系
    type 属性:指定实体类的全限定类名
    id 属性:给定一个唯一标识,是给查询 select 标签引用用的。
    -->
    <resultMap type="com.mg.entity.User" id="userMap">
        <id column="id" property="userId"/>
        <result column="username" property="userName"/>
        <result column="address" property="userAddress"/>
    </resultMap>
    id 标签:用于指定主键字段
    result 标签:用于指定非主键字段
    column 属性:用于指定数据库列名
    property 属性:用于指定实体类属性名称
       
    <!-- 配置查询所有操作,此时直接引用定义的resultMap就可以了 -->
    <select id="findAll" resultMap="userMap">
    	select * from user
    </select>
       
    

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦