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======> org.apache.ibatis.binding.MapperProxy@234bef66,果然是一个代理实现。MyBatis的这个设计用起来实在太爽了。

我们来想想接口绑定的好出是什么?其实很明显我们在调用时候是调用接口中的方法,这样调用相比较之前更好的规范了我们参数的传递,大大的降低了我们因为参数类型导致的调用失败。

扫描二维码关注公众号,回复: 3412371 查看本文章

猜你喜欢

转载自blog.csdn.net/u013268066/article/details/82828582
今日推荐