映射器与Mapper文件
映射器与Mapper文件
介绍
在MyBatis中,映射器(Mapper)是用于定义数据库操作的接口,而Mapper文件(或称为Mapper XML文件)则是存放映射器接口的SQL映射和配置的文件。
映射器(Mapper):
- 映射器是一个Java接口,用于定义与数据库交互的方法。
- 每个映射器接口对应一个数据库表或一组相关操作。
- 映射器接口的方法通过注解或XML配置来定义SQL语句、参数映射和结果映射。
- 映射器接口可以通过动态代理方式由MyBatis自动实现,并提供与数据库交互的功能。
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映射和配置,包括:
<mapper>
元素:<mapper>
元素是Mapper文件的根元素,用于定义一个Mapper接口对应的SQL映射文件。- 它可以包含多个子元素,如
<select>
、<insert>
、<update>
、<delete>
等,用于定义具体的SQL操作。
<select>
元素:<select>
元素用于定义查询操作的SQL语句和结果映射。- 它包含一个唯一的
id
属性,用于标识查询操作的唯一标识符。 - 可以指定
parameterType
属性来指定输入参数的类型。 - 可以使用
resultType
属性或resultMap
子元素来指定结果集的映射方式。
<insert>
元素:<insert>
元素用于定义插入操作的SQL语句和参数映射。- 它包含一个唯一的
id
属性,用于标识插入操作的唯一标识符。 - 可以指定
parameterType
属性来指定输入参数的类型。 - 可以使用
selectKey
子元素来定义生成主键的方式。
<update>
元素:<update>
元素用于定义更新操作的SQL语句和参数映射。- 它包含一个唯一的
id
属性,用于标识更新操作的唯一标识符。 - 可以指定
parameterType
属性来指定输入参数的类型。
<delete>
元素:<delete>
元素用于定义删除操作的SQL语句和参数映射。- 它包含一个唯一的
id
属性,用于标识删除操作的唯一标识符。 - 可以指定
parameterType
属性来指定输入参数的类型。
<resultMap>
元素:<resultMap>
元素用于定义结果集的映射方式。- 它包含一个唯一的
id
属性,用于标识结果映射的唯一标识符。 - 可以定义多个
<result>
子元素,用于定义每个列与Java对象属性之间的映射关系。
这些顶级元素在Mapper文件中提供了灵活的方式来定义SQL操作和结果映射。通过使用这些元素,可以轻松地实现数据的查询、插入、更新和删除操作,并将查询结果映射到Java对象中。此外,还有其他一些顶级元素,如<sql>
、<include>
、<resultType>
等,用于进一步增强Mapper文件的功能和可维护性。
select标签
MyBatis的<select>
标签是用于定义查询操作的XML标签。它是MyBatis映射文件中最常用的标签之一。通过<select>
标签,可以指定查询语句、参数映射、结果映射等信息。以下是<select>
标签的主要属性和用法:
属性:
id
:查询语句的唯一标识符。parameterType
:指定输入参数的类型。可以是Java类的全限定名或者别名。resultType
:指定查询结果的类型。可以是Java类的全限定名或者别名。resultMap
:指定结果映射的映射器ID。可以引用<resultMap>
标签定义的结果映射规则。flushCache
:指定是否清空本地缓存,默认值为false
。useCache
:指定是否使用二级缓存,默认值为true
。
查询语句:
- 查询语句可以直接在
<select>
标签内编写,也可以使用CDATA
标签包裹多行SQL语句。 - 可以使用参数占位符(
#{}
)引用Java对象中的属性值,如WHERE id = #{id}
。 - 可以使用
${}
占位符引用动态的参数值,如WHERE username = '${username}'
。注意,${}
占位符不会进行参数类型处理和防止SQL注入,慎用。
- 查询语句可以直接在
参数映射:
- 可以在查询语句中使用
#{}
占位符来引用Java对象中的属性值。 - MyBatis会自动将Java对象中的属性值映射到SQL语句中的对应位置。
- 可以在查询语句中使用
结果映射:
- 可以通过
<resultType>
属性指定查询结果的类型。 - 也可以通过
<resultMap>
属性引用预定义的结果映射规则,以自定义结果映射方式。
- 可以通过
示例:
<select id="getUserById" parameterType="int" resultType="com.example.User">
SELECT * FROM users WHERE id = #{id}
</select>
上述示例中,<select>
标签定义了一个查询语句,通过id
属性指定了查询的唯一标识符。parameterType
属性指定了输入参数的类型为int
,resultType
属性指定了查询结果的类型为com.example.User
。查询语句为SELECT * FROM users WHERE id = #{id}
,其中#{id}
为参数占位符,将会被实际的参数值替换。
通过<select>
标签,可以灵活地定义各种查询操作,并进行参数映射和结果映射。在实际使用中,可以根据具体的需求和查询语句的复杂程度,进一步使用MyBatis提供的动态SQL语句构建方式来实现更灵活的查询。
insert标签
在MyBatis中,<insert>
标签用于执行插入操作,将数据插入到数据库表中。通过<insert>
标签,可以指定插入语句、参数映射、生成主键等信息。以下是<insert>
标签的主要属性和用法:
属性:
id
:插入语句的唯一标识符。parameterType
:指定输入参数的类型。可以是Java类的全限定名或者别名。flushCache
:指定是否清空本地缓存,默认值为true
。keyProperty
:指定插入记录后生成的键值将被设置到哪个属性中。keyColumn
:指定用于生成键值的列名。
插入语句:
- 插入语句可以直接在
<insert>
标签内编写,也可以使用CDATA
标签包裹多行SQL语句。 - 可以使用参数占位符(
#{}
)引用Java对象中的属性值,如INSERT INTO users (name, age) VALUES (#{name}, #{age})
。
- 插入语句可以直接在
参数映射:
- 可以在插入语句中使用
#{}
占位符来引用Java对象中的属性值。 - MyBatis会自动将Java对象中的属性值映射到SQL语句中的对应位置。
- 可以在插入语句中使用
生成主键:
- 如果数据库表定义了自增主键或序列,可以通过
<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.User
,keyProperty
属性指定了插入记录后生成的键值将被设置到User
对象的id
属性中,keyColumn
属性指定了用于生成键值的列名。插入语句为INSERT INTO users (name, age) VALUES (#{name}, #{age})
,其中#{name}
和#{age}
为参数占位符,将会被实际的参数值替换。
通过<insert>
标签,可以方便地定义插入操作,并进行参数映射和主键生成。在实际使用中,可以根据具体的需求和插入语句的复杂程度,进一步使用MyBatis提供的动态SQL语句构建方式来实现更灵活的插入操作。
update标签
在MyBatis中,<update>
标签用于执行更新操作,修改数据库表中的数据。通过<update>
标签,可以指定更新语句、参数映射、条件判断等信息。以下是<update>
标签的主要属性和用法:
属性:
id
:更新语句的唯一标识符。parameterType
:指定输入参数的类型。可以是Java类的全限定名或者别名。flushCache
:指定是否清空本地缓存,默认值为true
。
更新语句:
- 更新语句可以直接在
<update>
标签内编写,也可以使用CDATA
标签包裹多行SQL语句。 - 可以使用参数占位符(
#{}
)引用Java对象中的属性值,如UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}
。
- 更新语句可以直接在
参数映射:
- 可以在更新语句中使用
#{}
占位符来引用Java对象中的属性值。 - MyBatis会自动将Java对象中的属性值映射到SQL语句中的对应位置。
- 可以在更新语句中使用
条件判断:
- 可以使用
<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>
标签的主要属性和用法:
属性:
id
:删除语句的唯一标识符。parameterType
:指定输入参数的类型。可以是Java类的全限定名或者别名。flushCache
:指定是否清空本地缓存,默认值为true
。
删除语句:
- 删除语句可以直接在
<delete>
标签内编写,也可以使用CDATA
标签包裹多行SQL语句。 - 可以使用参数占位符(
#{}
)引用Java对象中的属性值,如DELETE FROM users WHERE id = #{id}
。
- 删除语句可以直接在
参数映射:
- 可以在删除语句中使用
#{}
占位符来引用Java对象中的属性值。 - MyBatis会自动将Java对象中的属性值映射到SQL语句中的对应位置。
- 可以在删除语句中使用
条件判断:
- 可以使用
<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>
标签的主要属性和用法:
属性:
id
:结果映射的唯一标识符。type
:指定映射的目标类型,可以是Java类的全限定名或者别名。extends
:指定继承的父级结果映射。
<result>
元素:<result>
元素用于定义每个列与Java对象属性之间的映射关系。它可以包含以下属性:
column
:指定数据库列的名称。property
:指定Java对象的属性名。javaType
:指定Java对象属性的类型。jdbcType
:指定数据库列的数据类型。typeHandler
:指定类型处理器,用于处理Java对象属性与数据库列之间的类型转换。
<association>
元素:<association>
元素用于定义关联对象的映射关系。- 它可以将查询结果中的一部分映射为一个关联对象。
- 可以使用
select
属性指定关联对象的查询语句,或者嵌套<resultMap>
元素来定义关联对象的映射关系。
<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对象之间的转换。这使得开发人员能够更方便地操作和处理查询结果,提高了代码的可读性和可维护性。