1. 程式人生 > >MyBatis入門學習——介面繫結

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的這個設計用起來實在太爽了。

我們來想想介面繫結的好出是什麼?其實很明顯我們在呼叫時候是呼叫介面中的方法,這樣呼叫相比較之前更好的規範了我們引數的傳遞,大大的降低了我們因為引數型別導致的呼叫失敗。