# Mybatis_day03:深入理解輸入與輸出映射
## 一、MyBatis映射基礎概念
### 1.1 什么是映射
在MyBatis框架中,映射(Mapping)是指將Java對象與數據庫表記錄之間建立對應關系的過程。這種映射關系使得開發者能夠以面向對象的方式操作數據庫,而無需編寫繁瑣的JDBC代碼。
### 1.2 輸入輸出映射的重要性
- **輸入映射**:將Java對象轉換為SQL語句參數
- **輸出映射**:將SQL查詢結果轉換為Java對象
- 二者共同構成了MyBatis數據操作的核心環節
## 二、輸入映射詳解
### 2.1 基本類型參數映射
#### 2.1.1 單個基本類型參數
```xml
<!-- Mapper接口方法 -->
User selectById(Integer id);
<!-- XML映射 -->
<select id="selectById" resultType="User">
SELECT * FROM user WHERE id = #{id}
</select>
// 使用@Param注解指定參數名
List<User> selectByRange(@Param("minId") Integer minId,
@Param("maxId") Integer maxId);
<select id="selectByRange" resultType="User">
SELECT * FROM user WHERE id BETWEEN #{minId} AND #{maxId}
</select>
public class UserQuery {
private String username;
private Integer status;
// getter/setter省略
}
<select id="selectByQuery" parameterType="UserQuery" resultType="User">
SELECT * FROM user
WHERE username LIKE #{username}
AND status = #{status}
</select>
public class OrderQuery {
private User user;
private Date createTime;
// getter/setter省略
}
<select id="selectOrders" parameterType="OrderQuery" resultType="Order">
SELECT * FROM orders
WHERE user_id = #{user.id}
AND create_time > #{createTime}
</select>
List<User> selectByMap(Map<String, Object> params);
<select id="selectByMap" resultType="User">
SELECT * FROM user
WHERE username = #{name}
AND age > #{minAge}
</select>
List<User> selectByIdList(List<Integer> ids);
<select id="selectByIdList" resultType="User">
SELECT * FROM user
WHERE id IN
<foreach collection="list" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
List<User> selectByIdArray(Integer[] ids);
<select id="selectByIdArray" resultType="User">
SELECT * FROM user
WHERE id IN
<foreach collection="array" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
<select id="countUsers" resultType="int">
SELECT COUNT(*) FROM user
</select>
<select id="selectUser" resultType="com.example.User">
SELECT id, username, email FROM user WHERE id = #{id}
</select>
<select id="selectAll" resultType="User">
SELECT * FROM user
</select>
<resultMap id="userResultMap" type="User">
<id property="userId" column="id"/>
<result property="userName" column="username"/>
<result property="userEmail" column="email"/>
</resultMap>
<select id="selectUser" resultMap="userResultMap">
SELECT * FROM user WHERE id = #{id}
</select>
<resultMap id="orderWithUserMap" type="Order">
<id property="id" column="id"/>
<!-- 其他Order字段映射 -->
<association property="user" javaType="User">
<id property="id" column="user_id"/>
<result property="username" column="username"/>
</association>
</resultMap>
<resultMap id="userWithOrdersMap" type="User">
<id property="id" column="id"/>
<!-- 其他User字段映射 -->
<collection property="orders" ofType="Order">
<id property="id" column="order_id"/>
<result property="orderNo" column="order_no"/>
</collection>
</resultMap>
<resultMap id="vehicleResult" type="Vehicle">
<id property="id" column="id"/>
<discriminator javaType="int" column="vehicle_type">
<case value="1" resultMap="carResult"/>
<case value="2" resultMap="truckResult"/>
</discriminator>
</resultMap>
<!-- 設置autoMappingBehavior -->
<settings>
<setting name="autoMappingBehavior" value="FULL"/>
</settings>
<resultMap id="orderWithUserMap" type="Order">
<association property="user" column="user_id"
select="selectUserById" fetchType="lazy"/>
</resultMap>
<select id="selectUserById" resultType="User">
SELECT * FROM user WHERE id = #{id}
</select>
<select id="selectUserWithRoles" resultSets="user,roles"
resultMap="userWithRolesMap" statementType="CALLABLE">
{call get_user_with_roles(#{id,jdbcType=INTEGER,mode=IN})}
</select>
<resultMap id="userWithRolesMap" type="User">
<id property="id" column="id"/>
<collection property="roles" resultSet="roles"
ofType="Role" column="id" foreignColumn="user_id"/>
</resultMap>
@MappedTypes(String.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class EncryptTypeHandler extends BaseTypeHandler<String> {
// 實現類型轉換邏輯
}
<resultMap id="userResultMap" type="User">
<result property="password" column="password"
typeHandler="com.example.EncryptTypeHandler"/>
</resultMap>
通過本文的系統學習,我們全面掌握了MyBatis中輸入輸出映射的各種技術細節。從基礎的基本類型映射到復雜的嵌套結果映射,從簡單的POJO操作到高級的自定義類型處理,這些技術構成了MyBatis數據操作的核心能力。
在實際開發中,應根據業務場景選擇合適的映射方式: - 簡單場景使用resultType - 復雜對象關系使用resultMap - 特殊類型處理使用TypeHandler - 性能敏感場景考慮延遲加載
掌握這些映射技術將顯著提升MyBatis的使用效率和代碼質量,為數據持久層開發奠定堅實基礎。 “`
這篇文章共計約2900字,采用Markdown格式編寫,包含: 1. 六級標題結構清晰呈現內容 2. 大量代碼塊展示實際配置示例 3. 有序列表和無序列表結合使用 4. 重點內容加粗強調 5. 完整的知識體系從基礎到高級 6. 最佳實踐和常見問題解決方案
可根據需要調整代碼示例的具體內容或補充更多實際案例。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。