Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
1 个回答
世间行乐亦如此,古来万事东流水。狄青秋MyBatis 提供了多种方式将 SQL 执行结果映射为目标对象,并通过反射机制进行对象的创建和属性赋值。以下是主要的映射形式: #### 映射形式 1. **使用 `resultMap` 标签逐一定义映射关系** - **描述**:在 MyBatis 配置文件中使用 `resultMap` 标签,逐一定义数据库列名和对象属性名之间的映射关系。 - **示例**: ```xml <resultMap id="orderResultMap" type="me.gacl.domain.Order"> <id property="id" column="order_id"/> <result property="orderNo" column="order_no"/> <result property="price" column="order_price"/> </resultMap> <select id="selectOrder" parameterType="int" resultMap="orderResultMap"> SELECT order_id, order_no, order_price FROM orders WHERE order_id = #{id} </select> ``` 2. **使用 SQL 列的别名功能** - **描述**:在 SQL 语句中使用列别名,将数据库列的别名设置为对象的属性名,从而自动完成映射。 - **示例**: ```xml <select id="selectOrder" parameterType="int" resultType="me.gacl.domain.Order"> SELECT order_id AS id, order_no AS orderNo, order_price AS price FROM orders WHERE order_id = #{id} </select> ``` #### 封装和返回对象的过程 1. **获取映射关系** - MyBatis 解析 `resultMap` 或 SQL 列别名,获取数据库列名和对象属性名之间的映射关系。 2. **创建对象** - MyBatis 通过反射机制,根据映射关系创建目标对象的实例。 3. **属性赋值** - MyBatis 使用反射机制,逐一给目标对象的属性赋值。 - 如果某些属性找不到对应的映射关系,则无法完成赋值。 ### 总结 - **使用 `resultMap` 标签逐一定义映射关系** - 通过 `resultMap` 标签明确指定数据库列名和对象属性名之间的对应关系。 - **示例**: ```xml <resultMap id="orderResultMap" type="me.gacl.domain.Order"> <id property="id" column="order_id"/> <result property="orderNo" column="order_no"/> <result property="price" column="order_price"/> </resultMap> <select id="selectOrder" parameterType="int" resultMap="orderResultMap"> SELECT order_id, order_no, order_price FROM orders WHERE order_id = #{id} </select> ``` - **使用 SQL 列的别名功能** - 通过 SQL 语句中的列别名将数据库列名映射为对象属性名。 - **示例**: ```xml <select id="selectOrder" parameterType="int" resultType="me.gacl.domain.Order"> SELECT order_id AS id, order_no AS orderNo, order_price AS price FROM orders WHERE order_id = #{id} </select> ``` - **封装和返回对象的过程** - 获取映射关系:解析 `resultMap` 或 SQL 列别名。 - 创建对象:通过反射机制创建目标对象的实例。 - 属性赋值:使用反射机制逐一赋值,找不到映射关系的属性无法赋值。 通过以上方式,MyBatis 能够灵活地将 SQL 执行结果封装为目标对象并返回,确保数据访问和对象映射的高效性和可维护性。发布于 2024-07-26 17:48 •IP属地 黑龙江举报评论收藏
公众号进入网站体验更佳

