解讀Mapper與Mapper.xml文件之間匹配的問題
Mapper與Mapper.xml文件之間匹配問題
這裡我們做一個實例
user實體類
public class User { private Integer id; private String username; private String password; private String email; private String phone;
數據庫user表
userMapper.xml
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="wdc.dao.UserMapper"> <resultMap id="BaseResultMap" type="wdc.pojo.User"> <!-- column為數據庫字段名 property 為實體類字段名--> <id column="id" property="id" jdbcType="INTEGER"/> <result column="user_name" property="username" jdbcType="VARCHAR"/> <result column="user_password" property="password" jdbcType="VARCHAR"/> <result column="user_email" property="email" jdbcType="VARCHAR"/> <result column="user_phone" property="phone" jdbcType="VARCHAR"/> </resultMap> <!-- 這裡 id 是數據庫字段名 #{id}是實體類字段名,sql語句後面不加封號--> <select id="selectUser" parameterType="java.lang.Integer" resultMap="BaseResultMap"> select *from USER where id=#{id} </select> <!--此sql用於登錄查詢 #{username} 是對應mapper接口文件中 @Param註解中的參數名(防止mapper之間不匹配)--> <select id="login" parameterType="java.lang.String" resultMap="BaseResultMap"> select *from user where user_name=#{username} and user_password=#{password} </select> </mapper>
從上面不難看出,我們使用瞭resultMap作為映射集,目的是為瞭使得 實體類user 中的字段與數據庫中的字段進行匹配。
而在查詢中我們選擇 使用結果集resultMap來進行數據映射
<!-- 這裡 id 是數據庫字段名 #{id}是實體類字段名,sql語句後面不加封號--> <select id="selectUser" parameterType="java.lang.Integer" resultMap="BaseResultMap">
而在另一個查詢中,我們在編寫sql語句時,使用瞭對應userMapper文件中,@Param所對應的參數名
<!-- #{username} 是對應mapper接口文件中 @Param註解中的參數名(防止mapper之間不匹配)--> <select id="login" parameterType="java.lang.String" resultMap="BaseResultMap"> select *from user where user_name=#{username} and user_password=#{password} </select>
這裡也是為瞭防止mapper 文件與 xml文件之間匹配出現異常。
userMapper
package wdc.dao; import org.apache.ibatis.annotations.Param; import wdc.pojo.User; public interface UserMapper { User selectUser(int id)throws Exception; // 登錄 // @Param中的參數名,對應.xml文件中sql語句#{}中的參數名(防止mapper之間不匹配) User login(@Param("username") String username, @Param("password") String password)throws Exception; }
這裡我們重點解釋一下
@Param註解
這裡我們應該,采用#{}的方式把@Param註解括號內的參數進行引用
對應的是使用方法,上述代碼中明確標出。
這裡我們也可以不使用@Param註解,前提是數據庫字段與實體類字段一一對應,例如 數據庫命名為user_name,而我們的實體類就應該使用 駝峰命名 userName,這樣就可以使mybatis將查詢的結果自發的進行一一對應填充置user 對象中。
但是由於此案例,數據庫字段和實體類字段之間的命名方式,使得mybatis 從數據庫中查出的字段,不能正常的識別和對應正確的實體類字段,於是,我們需要使用@Param註解來指明,我們所要引用的參數的名稱,方便再mapper.xml文件中,采用#{}的方式把@Param註解括號內的參數進行引用,
這樣會更方便代碼的閱讀,也便於避免一些未知錯誤的發生。
測試
關於對象判空,和空指針異常(NullPointer)
@Test public void testLogin() throws Exception{ ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:config/spring-mybatis.xml"); UserMapper userMapper = (UserMapper) ac.getBean("userMapper"); User user = null; user = userMapper.login("張","123"); if(user == null) System.out.println("沒數據"); else System.out.println(user); }
這裡測試登錄接口後我們發現,當沒有數據返回時,我們可以直接 使用 user==null 的方式來對 對象進行判空。
而當我們在此代碼中,直接將異常使用 try catch 捕捉時,我們發現,當對象 user 為空時,控制臺並不會報出異常。
而當我們在調用 user對象的toSring方法時,則會出現NullPoint的空指針異常
小結:
導致mapper 與xml之間出現不匹配的原因主要有:
- 1. mapper 文件中 方法名與 xml 中查詢語句id 進行匹配
- 2. mapper 文件中 參數類型,與xml 文件中的參數類型匹配
- 3. mapper 文件中 返回值類型,與xml文件中的 返回值類型匹配
- 4. XML 文件的 namespace 指定的路徑與 相應的實體類對應
- 5. mapper 文件 和xml文件不在同一個包下的,要在配置文件中,將兩個文件的包同時進行掃描
還有一些較為簡單的異常不一一例舉,但說明相應原因以供參考:
- 6. 數據庫密碼填寫錯誤
- 7. 數據庫服務未開啟
- 8. 數據庫路徑 以及亂碼問題
jdbc.url=jdbc:mysql://localhost:3306/blog?characterEncoding=utf-8
Mapper和Mapper.xml的關系
Category.java
CategoryMapper.java
這是mapper接口,面向接口編程的思想還是很重要的。也是本次博文最重要的部分。
接口定義有以下特點:
- Mapper 接口方法名和 CategoryMapper.xml 中定義的每個 sql 的 id 同名。
- Mapper 接口方法的輸入參數類型和 CategoryMapper.xml 中定義的 sql 的parameterType 類型相同。
- Mapper 接口的返回類型和 CategoryMapper.xml 中定義的 sql 的 resultType 類型相同
CategoryMapper.xml
1.xml文件的namespace要寫成mapper接口的路徑。
2.sql的id和mapper中的方法名要對應起來,比如下面,mapper中方法名為add,insert的sql標簽id也要為add
總結
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- mybatis 如何利用resultMap復雜類型list映射
- Mybatis中resultMap的Colum和property屬性詳解
- Mybatis結果集映射與生命周期詳細介紹
- 基於Java SSM實現Excel數據批量導入
- Mybatis是這樣防止sql註入的