MyBatis 是一款優秀的持久層框架,它支援自定義 SQL、存儲過程以及高級映射。所有 MyBatis 應用程序的核心都是 SqlSessionFactory 實例,而該實例可通過 SqlSessionFactoryBuilder 從 XML 配置文件或 Configuration 類構建而得。
映射文件中的元素必須按照特定順序定義,主要包括:
| 屬性 | 說明 |
|---|---|
| id | 命名空間中唯一的標識符,用於引用該語句。 |
| parameterType | 傳入語句的參數類完全限定名或別名。 |
| resultType | 返回結果的類型類名或別名;若為集合,則指定集合泛型類型。不可與 resultMap 同時使用。 |
| resultMap | 引用外部定義的 resultMap。 |
| flushCache | 設為 true 時調用該語句會清空緩存,默認 false。 |
| useCache | 設為 true 時結果會被緩存,默認 true。 |
| timeout | 驅動程序等待數據庫響應的最大時間,默認由驅動處理。 |
| fetchSize | 建議驅動程序每次批量返回的結果行數。 |
| statementType | STATEMENT、PREPARED 或 CALLABLE,默認 PREPARED。 |
| resultSetType | FORWARD_ONLY、SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE,默認由驅動處理。 |
getGeneratedKeys 獲取數據庫自增主鍵,默認 false。selectKey 使用。MyBatis 的動態 SQL 通過以下元素實現靈活的 SQL 構建:
處理一對一關系,需指定 Java 實體屬性、javaType、數據庫列名。兩種加載方式:
處理一對多關系,需指定屬性、javaType(通常為 ArrayList)、ofType(泛型類型)、列名。同樣支援 select 和 resultMap 兩種加載策略。
idArg(標記 ID)和 arg(普通注入)。case 子元素。| 屬性 | 說明 |
|---|---|
| property | 映射的字段或屬性名,支援點號路徑如 address.street.number。 |
| column | 數據庫列名或別名,對應 resultSet.getString(columnName)。 |
| javaType | 完整類名或別名;映射 HashMap 時需顯式指定。 |
| jdbcType | 針對可空列在 INSERT/UPDATE/DELETE 時指定 JDBC 類型。 |
| typeHandler | 覆蓋默認類型處理器,值為實現類全限定名或別名。 |
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.study.mybatis.StudyMybatis">
<typeAlias type="com.study.mybatis.model.StudyMybatis" alias="StudyMybatisMap"/>
<resultMap type="StudyMybatisMap" id="selectStudyMybatis">
<id property="id" column="studymybatis_id"/>
<result property="name" column="studymybatis_name"/>
<result property="password" column="studymybatis_password"/>
<result property="phone" column="studymybatis_phone"/>
<result property="classid" column="studymybatis_classid"/>
</resultMap>
<select id="selectByid" resultMap="selectStudyMybatis" parameterType="int">
select studymybatis_id,studymybatis_name,studymybatis_password,studymybatis_phone
from studymybatis where id=#{id}
</select>
<!-- trim 動態 WHERE 示例 -->
<select id="selectByExample" resultMap="selectStudyMybatis" parameterType="java.util.Map">
select studymybatis_id,studymybatis_name,studymybatis_password,studymybatis_phone
from studymybatis sm
<trim prefix="where" prefixOverrides="AND | OR">
<if test="studymybatis_name !=null and studymybatis_name!=''">
and sm.studymybatis_name = #{name}
</if>
<if test="classid != null and classid != ''">
and sm.studymybatis_classid=#{classid}
</if>
</trim>
</select>
<!-- 級聯查詢:association + select -->
<resultMap type="com.study.mybatis.model.StudyMybatis" id="studySelect">
<id property="id" column="studymybatis_id"/>
<result property="name" column="studymybatis_name"/>
<association property="cid" column="classid" javaType="com.study.mybatis.StudyClass" select="classSelect"/>
</resultMap>
<select id="selectStudy" resultMap="studySelect" parameterType="java.math.BigDecimal">
select * from studymybatis where studymybatis_id=#{id}
</select>
<select id="selectClass" resultMap="classSelect" parameterType="java.math.BigDecimal">
select * from studyclass where classid=#{cid}
</select>
<!-- 聚合查詢:collection -->
<resultMap type="com.study.mybatis.model.StudyClass" id="classResultMap">
<id property="id" column="classid"/>
<result property="classage" column="classage"/>
<result property="banji" column="banji"/>
<collection property="studymybatisList" column="classid" javaType="ArrayList" ofType="StudyMybatis" resultMap="com.study.mybatis.model.StudyMybatis"/>
</resultMap>
<select id="classandmybatis" parameterType="int" resultMap="classResultMap">
select * from studyclass sc left outer join studymybatis sm on sc.classid=sm.studymybatis_classid where sc.banji=${banji}
</select>
</mapper>