跳至主要內容

映射器与Mapper文件


映射器与Mapper文件

介绍

在MyBatis中,映射器(Mapper)是用于定义数据库操作的接口,而Mapper文件(或称为Mapper XML文件)则是存放映射器接口的SQL映射和配置的文件。

  1. 映射器(Mapper):

    • 映射器是一个Java接口,用于定义与数据库交互的方法。
    • 每个映射器接口对应一个数据库表或一组相关操作。
    • 映射器接口的方法通过注解或XML配置来定义SQL语句、参数映射和结果映射。
    • 映射器接口可以通过动态代理方式由MyBatis自动实现,并提供与数据库交互的功能。
  2. Mapper文件(Mapper XML文件):

    • Mapper文件是一种XML文件,用于存放映射器接口的SQL映射和配置信息。
    • 每个Mapper文件对应一个映射器接口。
    • Mapper文件以<mapper>元素为根元素,包含了一系列的SQL操作和配置元素。
    • 在Mapper文件中,可以定义查询语句(<select>)、插入语句(<insert>)、更新语句(<update>)、删除语句(<delete>)等操作。
    • Mapper文件中的SQL语句可以通过参数映射和结果映射来与Java对象进行交互。
    • 通过Mapper文件,可以将具体的SQL语句和Java代码进行解耦,提供了更好的可维护性和灵活性。

Mapper文件通过提供SQL映射和配置的方式,使得开发人员可以通过简单的XML配置或注解来定义数据库操作,而无需编写繁琐的SQL语句和数据库连接代码。MyBatis会根据Mapper文件的定义,自动将数据库操作与映射器接口关联起来,并提供方便的API供开发人员调用和使用。这种方式使得数据库操作变得简单、可维护和可扩展。

元素/标签详解

在MyBatis的Mapper文件中,有几个顶级元素(Top-Level Elements)用于定义SQL映射和配置,包括:

  1. <mapper>元素:

    • <mapper>元素是Mapper文件的根元素,用于定义一个Mapper接口对应的SQL映射文件。
    • 它可以包含多个子元素,如<select><insert><update><delete>等,用于定义具体的SQL操作。
  2. <select>元素:

    • <select>元素用于定义查询操作的SQL语句和结果映射。
    • 它包含一个唯一的id属性,用于标识查询操作的唯一标识符。
    • 可以指定parameterType属性来指定输入参数的类型。
    • 可以使用resultType属性或resultMap子元素来指定结果集的映射方式。
  3. <insert>元素:

    • <insert>元素用于定义插入操作的SQL语句和参数映射。
    • 它包含一个唯一的id属性,用于标识插入操作的唯一标识符。
    • 可以指定parameterType属性来指定输入参数的类型。
    • 可以使用selectKey子元素来定义生成主键的方式。
  4. <update>元素:

    • <update>元素用于定义更新操作的SQL语句和参数映射。
    • 它包含一个唯一的id属性,用于标识更新操作的唯一标识符。
    • 可以指定parameterType属性来指定输入参数的类型。
  5. <delete>元素:

    • <delete>元素用于定义删除操作的SQL语句和参数映射。
    • 它包含一个唯一的id属性,用于标识删除操作的唯一标识符。
    • 可以指定parameterType属性来指定输入参数的类型。
  6. <resultMap>元素:

    • <resultMap>元素用于定义结果集的映射方式。
    • 它包含一个唯一的id属性,用于标识结果映射的唯一标识符。
    • 可以定义多个<result>子元素,用于定义每个列与Java对象属性之间的映射关系。

这些顶级元素在Mapper文件中提供了灵活的方式来定义SQL操作和结果映射。通过使用这些元素,可以轻松地实现数据的查询、插入、更新和删除操作,并将查询结果映射到Java对象中。此外,还有其他一些顶级元素,如<sql><include><resultType>等,用于进一步增强Mapper文件的功能和可维护性。

select标签

MyBatis的<select>标签是用于定义查询操作的XML标签。它是MyBatis映射文件中最常用的标签之一。通过<select>标签,可以指定查询语句、参数映射、结果映射等信息。以下是<select>标签的主要属性和用法:

  1. 属性:

    • id:查询语句的唯一标识符。
    • parameterType:指定输入参数的类型。可以是Java类的全限定名或者别名。
    • resultType:指定查询结果的类型。可以是Java类的全限定名或者别名。
    • resultMap:指定结果映射的映射器ID。可以引用<resultMap>标签定义的结果映射规则。
    • flushCache:指定是否清空本地缓存,默认值为false
    • useCache:指定是否使用二级缓存,默认值为true
  2. 查询语句:

    • 查询语句可以直接在<select>标签内编写,也可以使用CDATA标签包裹多行SQL语句。
    • 可以使用参数占位符(#{})引用Java对象中的属性值,如WHERE id = #{id}
    • 可以使用${}占位符引用动态的参数值,如WHERE username = '${username}'。注意,${}占位符不会进行参数类型处理和防止SQL注入,慎用。
  3. 参数映射:

    • 可以在查询语句中使用#{}占位符来引用Java对象中的属性值。
    • MyBatis会自动将Java对象中的属性值映射到SQL语句中的对应位置。
  4. 结果映射:

    • 可以通过<resultType>属性指定查询结果的类型。
    • 也可以通过<resultMap>属性引用预定义的结果映射规则,以自定义结果映射方式。

示例:

<select id="getUserById" parameterType="int" resultType="com.example.User">
  SELECT * FROM users WHERE id = #{id}
</select>

上述示例中,<select>标签定义了一个查询语句,通过id属性指定了查询的唯一标识符。parameterType属性指定了输入参数的类型为intresultType属性指定了查询结果的类型为com.example.User。查询语句为SELECT * FROM users WHERE id = #{id},其中#{id}为参数占位符,将会被实际的参数值替换。

通过<select>标签,可以灵活地定义各种查询操作,并进行参数映射和结果映射。在实际使用中,可以根据具体的需求和查询语句的复杂程度,进一步使用MyBatis提供的动态SQL语句构建方式来实现更灵活的查询。

insert标签

在MyBatis中,<insert>标签用于执行插入操作,将数据插入到数据库表中。通过<insert>标签,可以指定插入语句、参数映射、生成主键等信息。以下是<insert>标签的主要属性和用法:

  1. 属性:

    • id:插入语句的唯一标识符。
    • parameterType:指定输入参数的类型。可以是Java类的全限定名或者别名。
    • flushCache:指定是否清空本地缓存,默认值为true
    • keyProperty:指定插入记录后生成的键值将被设置到哪个属性中。
    • keyColumn:指定用于生成键值的列名。
  2. 插入语句:

    • 插入语句可以直接在<insert>标签内编写,也可以使用CDATA标签包裹多行SQL语句。
    • 可以使用参数占位符(#{})引用Java对象中的属性值,如INSERT INTO users (name, age) VALUES (#{name}, #{age})
  3. 参数映射:

    • 可以在插入语句中使用#{}占位符来引用Java对象中的属性值。
    • MyBatis会自动将Java对象中的属性值映射到SQL语句中的对应位置。
  4. 生成主键:

    • 如果数据库表定义了自增主键或序列,可以通过<selectKey>标签来获取生成的主键值,并将其设置到Java对象中。
    • <selectKey>标签可以嵌套在<insert>标签内部,用于执行获取主键的查询操作。

示例:

<insert id="insertUser" parameterType="com.example.User" keyProperty="id" keyColumn="id">
  INSERT INTO users (name, age) VALUES (#{name}, #{age})
</insert>

上述示例中,<insert>标签定义了一个插入语句,通过id属性指定了插入操作的唯一标识符。parameterType属性指定了输入参数的类型为com.example.UserkeyProperty属性指定了插入记录后生成的键值将被设置到User对象的id属性中,keyColumn属性指定了用于生成键值的列名。插入语句为INSERT INTO users (name, age) VALUES (#{name}, #{age}),其中#{name}#{age}为参数占位符,将会被实际的参数值替换。

通过<insert>标签,可以方便地定义插入操作,并进行参数映射和主键生成。在实际使用中,可以根据具体的需求和插入语句的复杂程度,进一步使用MyBatis提供的动态SQL语句构建方式来实现更灵活的插入操作。

update标签

在MyBatis中,<update>标签用于执行更新操作,修改数据库表中的数据。通过<update>标签,可以指定更新语句、参数映射、条件判断等信息。以下是<update>标签的主要属性和用法:

  1. 属性:

    • id:更新语句的唯一标识符。
    • parameterType:指定输入参数的类型。可以是Java类的全限定名或者别名。
    • flushCache:指定是否清空本地缓存,默认值为true
  2. 更新语句:

    • 更新语句可以直接在<update>标签内编写,也可以使用CDATA标签包裹多行SQL语句。
    • 可以使用参数占位符(#{})引用Java对象中的属性值,如UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}
  3. 参数映射:

    • 可以在更新语句中使用#{}占位符来引用Java对象中的属性值。
    • MyBatis会自动将Java对象中的属性值映射到SQL语句中的对应位置。
  4. 条件判断:

    • 可以使用<if>标签在更新语句中添加条件判断,动态生成不同的更新内容。
    • <if>标签可以根据条件判断是否包含特定的SQL语句片段。

示例:

<update id="updateUser" parameterType="com.example.User">
  UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}
</update>

上述示例中,<update>标签定义了一个更新语句,通过id属性指定了更新操作的唯一标识符。parameterType属性指定了输入参数的类型为com.example.User。更新语句为UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id},其中#{name}#{age}#{id}为参数占位符,将会被实际的参数值替换。

通过<update>标签,可以方便地定义更新操作,并进行参数映射和条件判断。在实际使用中,可以根据具体的需求和更新语句的复杂程度,进一步使用MyBatis提供的动态SQL语句构建方式来实现更灵活的更新操作。

delete标签

在MyBatis中,<delete>标签用于执行删除操作,从数据库表中删除数据。通过<delete>标签,可以指定删除语句、参数映射、条件判断等信息。以下是<delete>标签的主要属性和用法:

  1. 属性:

    • id:删除语句的唯一标识符。
    • parameterType:指定输入参数的类型。可以是Java类的全限定名或者别名。
    • flushCache:指定是否清空本地缓存,默认值为true
  2. 删除语句:

    • 删除语句可以直接在<delete>标签内编写,也可以使用CDATA标签包裹多行SQL语句。
    • 可以使用参数占位符(#{})引用Java对象中的属性值,如DELETE FROM users WHERE id = #{id}
  3. 参数映射:

    • 可以在删除语句中使用#{}占位符来引用Java对象中的属性值。
    • MyBatis会自动将Java对象中的属性值映射到SQL语句中的对应位置。
  4. 条件判断:

    • 可以使用<if>标签在删除语句中添加条件判断,动态生成不同的删除条件。
    • <if>标签可以根据条件判断是否包含特定的SQL语句片段。

示例:

<delete id="deleteUser" parameterType="com.example.User">
  DELETE FROM users WHERE id = #{id}
</delete>

上述示例中,<delete>标签定义了一个删除语句,通过id属性指定了删除操作的唯一标识符。parameterType属性指定了输入参数的类型为com.example.User。删除语句为DELETE FROM users WHERE id = #{id},其中#{id}为参数占位符,将会被实际的参数值替换。

通过<delete>标签,可以方便地定义删除操作,并进行参数映射和条件判断。在实际使用中,可以根据具体的需求和删除语句的复杂程度,进一步使用MyBatis提供的动态SQL语句构建方式来实现更灵活的删除操作。

resultMap标签

在MyBatis中,<resultMap>标签用于定义查询结果集的映射关系。通过<resultMap>标签,可以将数据库查询结果映射到Java对象的属性上,实现对象与数据库记录之间的转换。以下是<resultMap>标签的主要属性和用法:

  1. 属性:

    • id:结果映射的唯一标识符。
    • type:指定映射的目标类型,可以是Java类的全限定名或者别名。
    • extends:指定继承的父级结果映射。
  2. <result>元素:

    • <result>元素用于定义每个列与Java对象属性之间的映射关系。

    • 它可以包含以下属性:

      • column:指定数据库列的名称。
      • property:指定Java对象的属性名。
      • javaType:指定Java对象属性的类型。
      • jdbcType:指定数据库列的数据类型。
      • typeHandler:指定类型处理器,用于处理Java对象属性与数据库列之间的类型转换。
  3. <association>元素:

    • <association>元素用于定义关联对象的映射关系。
    • 它可以将查询结果中的一部分映射为一个关联对象。
    • 可以使用select属性指定关联对象的查询语句,或者嵌套<resultMap>元素来定义关联对象的映射关系。
  4. <collection>元素:

    • <collection>元素用于定义集合属性的映射关系。
    • 它可以将查询结果中的一组记录映射为一个集合属性。
    • 可以使用select属性指定集合属性的查询语句,或者嵌套<resultMap>元素来定义集合元素的映射关系。

示例:

<resultMap id="userResultMap" type="com.example.User">
  <id column="id" property="id" />
  <result column="username" property="username" />
  <result column="email" property="email" />
  <association property="address" javaType="com.example.Address">
    <result column="city" property="city" />
    <result column="zipcode" property="zipcode" />
  </association>
  <collection property="orders" ofType="com.example.Order">
    <id column="order_id" property="orderId" />
    <result column="order_name" property="orderName" />
  </collection>
</resultMap>

上述示例中,定义了一个名为userResultMap<resultMap>标签。它将查询结果映射到com.example.User类型的Java对象上。通过<id><result>元素,将数据库查询结果的列与User对象的属性进行了映射。使用<association>元素将查询结果的部分列映射为com.example.Address类型的关联对象,并使用<collection>元素将查询结果的多条记录映射为com.example.Order类型的集合属性。

通过<resultMap>标签,可以灵活地定义复杂的结果映射关系,实现数据库查询结果与Java对象之间的转换。这使得开发人员能够更方便地操作和处理查询结果,提高了代码的可读性和可维护性。

上次编辑于:
贡献者: Neil