MyBatis中的Mapper.xml文件解析

具体可以参见MyBatis中文开发文档:https://mybatis.org/mybatis-3/zh/sqlmap-xml.html

我所述的主要有常用的几个标签和属性

一、parameterType

parameterType:入参值,与接口中对应方法的参数一致,id要与方法名一致。它可以:

   1、传递简单数据类型  (如:Integer、String)
   2、传递pojo对象     (如:com.jjxy.pojo.User)
   3、传递包装pojo对象 (如:在查询的时候传入很多属性,但是这些属性只是该类的部分属性,这时候我们可以创建一个包装类实现)

ParameterType传递包装类具体的实现:

包装类:QueryVo,里面有pojo类并生成它的set和get方法。然后在Mapper.xml文件中,sql语句传入的参数类型就是QueryVo。

其实就是原始类属性的部分封装。

public class QueryVo {

    private User user;
    public User getUser() {
        return user;
    }

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

二、resultType 、resultMap

1.返回简单类型
2、pojo、list只需设置集合类的数据类型
3、resultMap 配置数据库字段和实体属性之间的映射关系,在引入映射
<?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">

<mapper namespace="com.jjxy.mapper.OrderMapper">
    <!-- 配置数据库字段和实体属性之间的映射关系
        定义resultMap-->
    <resultMap id="order_list_map" type="order">
        <!-- id用于映射主键 -->
        <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>
    <!-- 引用resultMap -->
    <select id="getOrderList" resultMap="order_list_map">
        select *from `order`
    </select>
</mapper>

三、sql标签

这个元素可以用来定义可重用的 SQL 代码片段,以便在其它语句中使用。 参数可以静态地(在加载的时候)确定下来,并且可以在不同的 include 元素中定义不同的参数值。比如:

<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>
这个 SQL 片段可以在其它语句中使用,例如:
<select id="selectUsers" resultType="map">
  select
    <include refid="userColumns"><property name="alias" value="t1"/></include>,
    <include refid="userColumns"><property name="alias" value="t2"/></include>
  from some_table t1
    cross join some_table t2
</select>

四、mybaits错误解决:There is no getter for property named 'id' in class 'java.lang.String'

产生错误的原因:在使用mybaitis传参数的时候,如果仅传入一个类型为String的参数,那么在 xml文件中应该使用_parameter来代替参数名,这也是在我初学时令我头痛的一个问题。        具体解决路口:https://blog.csdn.net/aitcax/article/details/44337271

5、 sql动态查询标签   官方中文文档:https://mybatis.org/mybatis-3/zh/dynamic-sql.html

①:if

②:where

    <!--2、where标签  :自动补上where关键字,同时处理多余的and  -->
    <!-- 根据用户的用户名和性别来查询用户 -->
    <select id="getUserByPojo" parameterType="user" resultType="com.jjxy.pojo.User">
        SELECT *from user
        <where>
            <if test="username !=null and username != ''">
                username LIKE '%${username}%'
            </if>
            <if test="sex !=null and sex !=''">
                and sex = #{sex}
            </if>
        </where>
    </select>

③:foreach 

<!--4、 foreach标签
            collection :要遍历的集合
            open:循环开始之前输出的内容
            item:设置循环变量
            separator :分隔符
            close: 循环结束之后输出的内容
     -->
<!-- 查询id为 1,2,3,5的用户信息 -->
<select id="getUserByIds" parameterType="QueryVo" resultType="user">
        SELECT *from USER
        <where>
            /*目的输出 id in(1,2,3,5)*/
            <foreach collection="ids" open="id in(" item="uid" separator="," close=")">
                #{uid}
            </foreach>
        </where>
    </select>
</mapper>

五、处理表映射时用到的标签

具体完成映射关系可先参见:https://blog.csdn.net/sinat_41803693/article/details/103736479   与Hibernate框架类似,在处理映射关系时,MyBatis与其类似。

①:一对一、一对多,一方的一方标签

关联(association)元素处理“有一个”类型的关系。 比如,在我们的示例中,一个博客有一个用户。关联结果映射和其它类型的映射工作方式差不多。 你需要指定目标属性名以及属性的javaType(很多时候 MyBatis 可以自己推断出来),在必要的情况下你还可以设置 JDBC 类型,如果你想覆盖获取结果值的过程,还可以设置类型处理器。

关联的不同之处是,你需要告诉 MyBatis 如何加载关联。MyBatis 有两种不同的方式加载关联:

  • 嵌套 Select 查询:通过执行另外一个 SQL 映射语句来加载期望的复杂类型。
  • 嵌套结果映射:使用嵌套的结果映射来处理连接结果的重复子集。
<!-- 配置一对一的映射关系 column:主键id; javaType:类的全限定名,或一个类型别名-->
        <association property="user" column="user_id" select="com.jjxy.mapper.UserMapper.getUserById"
        javaType="com.jjxy.pojo.User"/>
    </resultMap>
    <!-- 引用resultMap  在执行getOrderById方法时,会执行引用中的getUserById方法,
    从而完成对根据订单id查询订单信息并级联查询用户的信息,他们公用了一个入参,完成一
    对一的映射,一对一的关系,不管在哪边都可以配置associate实现 -->

②:一对多   

总体思想: 一的一方(放置多的一方的集合)                                              

                  多的一方(放置一的一方的对象)

a.一的一方用到的标签

(collection)标签

        <!--设置一对多的关系。在一的一方设置多的一方 :集合
        property :pojo类设置的集合对象属性
        select :在执行根据id查询用户的时候,级联查询用户的订单。
        fetchType:是否执行懒加载策略
        column:数据库中的列名,或者是列的别名。传入的入参 id
        ofType:Java 类的全限定名,或一个类型别名
        -->
        <collection property="listOrder" javaType="List" column="id" ofType="com.jjxy.pojo.Order"
                    select="com.jjxy.mapper.OrderMapper.getOrderList" fetchType="lazy">
           
        </collection>

 

 


版权声明:本文为sinat_41803693原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。