MyBatis入門學習——介面繫結
在環境搭建的時候我們知道了SqlSessionFactory,既然有了 SqlSessionFactory ,我們就可以從中獲得 SqlSession 的例項了。SqlSession 完全包含了面向資料庫執行 SQL 命令所需的所有方法。環境搭建中的示例我們是通過 SqlSession 例項來直接執行已對映的 SQL 語句。誠然這種方式能夠正常工作,並且對於使用舊版本 MyBatis 的使用者來說也比較熟悉,不過現在有了一種更直白的方式。使用對於給定語句能夠合理描述引數和返回值的介面(比如說AuthorMapper.class),你現在不但可以執行更清晰和型別安全的程式碼,而且還不用擔心易錯的字串字面值以及強制型別轉換。
以環境搭建中的AuthorMapper.xml對映檔案為例我們來建立一下它所對應的介面。下面給出Author實體類,對映檔案AuthorMapper.xml,即將要繫結的介面AuthorMapper.java以及呼叫方法。
/** Author.java */ public class Author { private Long id;//主鍵 private String username;//使用者名稱 private String password;//密碼 private String email;//郵箱 private String bio;//簡介 public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getBio() { return bio; } public void setBio(String bio) { this.bio = bio; } @Override public String toString() { return "Author{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + ", email='" + email + '\'' + ", bio='" + bio + '\'' + '}'; } }
<!-- AuthorMapper.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="com.ncode.mapper.AuthorMapper"> <select id="selectAuthor" parameterType="int" resultType="com.ncode.model.Author"> SELECT * FROM Author WHERE ID = #{id} </select> <insert id="insertAuthor" parameterType="com.ncode.model.Author"> insert into Author (id,username,password,email,bio) values (#{id},#{username},#{password},#{email},#{bio}) </insert> <update id="updateAuthor" parameterType="com.ncode.model.Author"> update Author set username = #{username}, password = #{password}, email = #{email}, bio = #{bio} where id = #{id} </update> <delete id="deleteAuthor" parameterType="int"> delete from Author where id = #{id} </delete> </mapper>
/** 將要繫結的AuthorMapper介面 */
public interface AuthorMapper {
/** 查詢Author */
Author selectAuthor(Integer id);
/** charu AUthor */
Integer insertAuthor(Author author);
/** 修改Author */
Integer updateAuthor(Author author);
/** 刪除Author */
Integer deleteAuthor(Integer id);
}
public class TestAuthor {
public static void main(String[] args) throws IOException {
//讀取全域性配置檔案
InputStream is = Resources.getResourceAsStream("MyBatis.xml");
//建立SqlSessionFactory例項
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//獲取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//例項化AuthorMapper
AuthorMapper authorMapper = sqlSession.getMapper(AuthorMapper.class);
System.out.println("authorMapper======> "+authorMapper);
//執行selectAuthor
Author author = authorMapper.selectAuthor(1);
System.out.println("author======> "+author);
sqlSession.close();
}
}
上面示例就是介面繫結的過程和呼叫方法;你會發現除了呼叫跟之前不太一樣,其他並沒有什麼改變,那麼MyBatis是如何繫結的呢?我們來看一下AuthorMapper對映檔案中的<mapper namespace="com.ncode.mapper.AuthorMapper">標籤,當要繫結介面時就需要其中的namespace指向要繫結的介面的全路徑。就是這麼簡單,你只需要將namespace指向要繫結的類其他事MyBatis全都幫你搞定。呼叫時sqlSession.getMapper(AuthorMapper.class)然後賦值給剛才我們寫的介面,然後就可以呼叫我們藉口的方法了,這裡你可能會產生疑問我們並沒有寫AuthorMapper介面的實現類啊,AuthorMapper介面是怎麼例項化的啊?我們來大膽的猜一下這裡可能是MyBatis的一個代理實現。示例中我們已經把authorMapper 打印出來了,我們開看看輸出結果:
authorMapper======> [email protected],果然是一個代理實現。MyBatis的這個設計用起來實在太爽了。
我們來想想介面繫結的好出是什麼?其實很明顯我們在呼叫時候是呼叫介面中的方法,這樣呼叫相比較之前更好的規範了我們引數的傳遞,大大的降低了我們因為引數型別導致的呼叫失敗。