在 Java 框架如 MyBatis 中,Mapper.xml
文件是用于定義 SQL 查詢的配置文件,而對應的 Dao 接口(Mapper 接口)則提供了與 XML 文件中的 SQL 查詢相對應的方法。這種設計模式使得 Java 代碼與 SQL 語句解耦,提高了代碼的可讀性和可維護性。以下是其工作原理的簡要說明:
1. Mapper 接口
Dao 接口(通常稱為 Mapper 接口)是 Java 類,它定義了數據庫操作的方法。例如:
java復制代碼
public interface UserMapper { User getUserById(int id); void insertUser(User user); // 其他方法... }
2. Mapper.xml 文件
Mapper.xml
文件包含了對應于 Dao 接口中方法的 SQL 語句和結果映射。例如:
xml復制代碼
<mapper namespace="com.example.UserMapper"> <select id="getUserById" resultType="com.example.User"> SELECT * FROM users WHERE id = #{id} </select> <insert id="insertUser" parameterType="com.example.User"> INSERT INTO users(name, email) VALUES (#{name}, #{email}) </insert> <!-- 其他映射元素... --> </mapper>
這里的 namespace
屬性應該與 Dao 接口的全限定類名相匹配,id
屬性與接口方法名對應。
3. 映射配置
在 MyBatis 的配置文件中,我們需要將 Dao 接口與 Mapper.xml
文件關聯起來:
xml復制代碼
<mybatis-config> ... <mappers> <mapper resource="com/example/UserMapper.xml"/> </mappers> ... </mybatis-config>
4. 動態代理
MyBatis 使用 Java 的動態代理機制,在運行時為每個 Dao 接口生成實現了該接口的代理類。這個代理類會攔截接口方法的調用,根據方法名找到對應的 Mapper.xml
文件中的 SQL 語句,并執行它。
5. 執行 SQL 和返回結果
當在業務邏輯中調用 Dao 接口的方法時,實際上是在調用動態生成的代理類的方法。代理類會根據方法參數填充 SQL 語句中的占位符(例如,使用 #{id}
代替 ?
),然后通過 SqlSession 執行 SQL。執行完畢后,代理類將結果轉換為 Java 對象并返回。
例如:
java復制代碼
SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.getUserById(1); sqlSession.close();
總結
Mapper 接口和 Mapper.xml
文件的結合使用,使得 MyBatis 能夠將 SQL 語句與 Java 代碼分離,提供了靈活的數據庫操作方式。在運行時,MyBatis 通過動態代理將 Dao 接口方法映射到 XML 文件中的 SQL 語句,執行 SQL 并處理結果,從而實現了數據庫操作。這種方式降低了代碼的耦合度,提高了可維護性。