欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaWeb【Mybatis】动态标签与ResultMap标签

程序员文章站 2022-07-12 22:38:11
...

ResultMap

(1)ResultMap有什么用?
建立查询字段与实体类成员变量的映射关系
即 查询字段是user_id但是Mybatis去赋值userId
》字段名与变量名不一致,可以赋值
》实现一对多,多对多的查询
(2)ResultMap标签映射关系,resultMap使用
在不改表,也不改类的基础上,完成查询数据对变量的赋值。

 <!--
         id:ResultMap标识,标签语句中 resultMap的值必须和该id一致
         type:指定你要映射哪一个JavaBean
         如果字段名和成员名一样,则可以不用指定映射关系
    -->

    <resultMap id="resultMap1" type="com.hx.pojo.Order">
        <!--在这里要指定数据库表字段和JavaBean成员变量之前的映射关系-->
        <!--先指定主键字段和成员之间的映射关系-->
        <id column="id" property="id"></id>

        <!--先指定非主键字段和成员之间的映射关系
          column:字段名
          property:成员变量名
        -->
        <result column="user_id" property="userId"></result>
        <result column="number" property="number"></result>
        <result column="createtime" property="createtime"></result>
        <result column="note" property="note"></result>
    </resultMap>


    <select id="queryAllOrders" resultMap="resultMap1">
        SELECT id,user_id,number,createtime,note FROM orderx
    </select>

动态标签介绍

(1)动态标签是什么?
用于mybatis将sql与java代码分离(sql写在xml中)
if标签,where标签 forEach标签
(2)动态标签有什么用?
用来根据数据的不同来生成对应的sql
(3)应用场景
高级搜索功能
搜索有多个条件,不是每个条件输入框都有值 ,此时需根据值来生成where条件

if标签与where标签

<select id="queryUserBySexAndName"  parameterType="User" resultType="User">
      select * from user
     <where>
          <if test="username != '' and username !=null ">
              and username like '${username}%'
          </if>
          <if test="sex != '' and sex != null">
              and sex = #{sex}
          </if>

         <if test="address != '' and address != null">
             and address = #{address}
         </if>
     </where>

  </select>

在接口实现

   //根据性别或者名字进行查找
    List<User> findByUser(User user);

foreach标签

(1)foreach标签
向sql传递数组或List,mybatis使用foreach解析
(2)如何使用
collection:表示方法传入的集合对象的名字 collection=“xxx”
item:遍历集合时,会将集合中的元素赋值给item
open表示你要拼接的sql以什么开始
close:表示你拼接的sql以什么结束
separator:表示拼接的分隔符
接口中的变量名不能被标签识别,必须在参数的前边加注解@Param(“xxx”)

 <!--根据多个id来查找用户
      select * from user where id in(1,3,5)
      +++++++++
      select * from user where 1=1 and id in(1,3,5)

      collection:表示方法传入的集合对象的名字
      item:遍历集合时,会将集合中的元素赋值给item
      open表示你要拼接的sql以什么开始
      close:表示你拼接的sql以什么结束
      separator:表示拼接的分隔符

    -->
    <select id="queryUsersByIds" resultType="User">
        select * from user
        <where>
            <foreach collection="ids" item="id" open="and id in(" close=")"  separator=",">
                #{id}
            </foreach>
        </where>
    </select>


接口中实现

//根据多个ID来查找用户
//这里定义的变量,在UserDao中是不识别的,要想识别,必须在参数的前边加注解@Param("ids")
    List<User> queryUsersByIds(@Param("ids") List<Integer> ids);

关联查询

(1)项目不可能只有一个表,一般是多表
(2)多表关系为,一对一,一对多,多对多
(3)查询的数据来自多个表,要使用多表查询
笛卡尔集,显示内连接inner join,左外连接left outer join,右外连接right outer join,子查询select嵌套select
(4)查询的结果要封装成javaBean对象 ,在Mybatis中重点掌握resultType与resultMap
JavaWeb【Mybatis】动态标签与ResultMap标签

resultMap与association 配置映射(一对一)

映射配置的重点是 Order类中的 User user 成员变量,它的类型User是自定义实现类的类型
autoMapping:表示如果字段名和属性名一致,则自动映射

   <!--2:查询每个订单属于哪个用户  一对一  方式2-->
    <!--
      如果是关联查询,则必须添加属性:autoMapping="true",自动映射
    -->
    <resultMap id="findAllOrder2Map" type="com.wzx.bean.Order" autoMapping="true">
        <!--先指定Order类属性和字段之间的映射关系-->
        <id column="id" property="id"></id>
        <result column="user_id" property="userId"></result>
        <!--先指定Order类中User类属性和字段之间的映射关系
        property:表示Order类中User类对象的名字
        javaType:表示Order类中包含的User类的全路径名
        autoMapping:表示如果字段名和属性名一致,则自动映射
          class Order{
            User user;
          }
        -->
        <association property="user" javaType="com.wzx.bean.User" autoMapping="true" >
            <id column="uid" property="id"></id>
        </association>
    </resultMap>

    <select id="findAllOrder2" resultMap="findAllOrder2Map">
   select o.id as id,
	    o.user_id as userId,
	    o.number,
	    o.createtime,
	    o.note,
	    u.id as uid,
	    u.username,
	    u.birthday,
	    u.sex,
	    u.address
    from  `order` o left join `user` u
    on o.user_id=u.id;
    </select>

ResultMap与collection配置映射(一对多)

    <!-- autoMapping="true" 如果字段名与变量名一样,则不需要映射
    如果一个类成员变量出现集合类型,List,则需要使用collection标签了映射,字段与变量的关系
    ofType指定的集合List<元素> 元素的类型,不要写成javaType
    -->
    <resultMap id="findAllUsersMap" type="com.wzx.bean.User" autoMapping="true">
            <id property="id" column="uid"></id>
            <collection property="orders" ofType="com.wzx.bean.Order" autoMapping="true">
                <id property="id" column="oid"></id>
            </collection>
    </resultMap>


    <select id="findAllUsers" resultMap="findAllUsersMap">
	     select u.id as uid,
	        u.username,
	        u.birthday,
	        u.sex,
	        u.address,
	        o.id as oid,
	        o.user_id as userId,
	        o.number,
	        o.createtime,
	        o.note
	    from `user` u left join `order` o
	    on u.id=o.user_id;
    </select>