在环境搭建的时候我们知道了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的这个设计用起来实在太爽了。
我们来想想接口绑定的好出是什么?其实很明显我们在调用时候是调用接口中的方法,这样调用相比较之前更好的规范了我们参数的传递,大大的降低了我们因为参数类型导致的调用失败。