回顾
在上一篇Mybatis学习之初步上手我们上手了一个helloworld例子,需要以下几步:
- 创建mybatis-config.xml 全局配置文件,相关连接数据库配置
- 创建Mapper文件,存放对应sql语句,注明唯一表示id和返回数据时封装的类型
- 然后用sqlsession执行sql语句,查询得出结果并自动封装成对应类型
接口编程
面向接口编程通常是编程的良好实践,我们我在查询执行sql中也可以转换成面向接口编程方式。
1.声明Mapper接口
public interface EmployeeMapper {
public Employee getEmpById(Integer id);
}
复制代码
2.修改EmployeeMapper.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.zhang.EmployeeMapper">
<select id="getEmpById" resultType="com.zhang.Employee">
select id,last_name lastName,email,gender from tbl_employee where id = #{id}
</select>
</mapper>
复制代码
3.修改测试代码运行
EmployeeMapper mapper= sqlSession.getMapper(EmployeeMapper.class);
System.out.println(mapper);
Employee employee= mapper.getEmpById(1);
System.out.println(employee);
复制代码
运行结果如下
其实这种也是mybatis推荐的使用方式,原因是它把查询功能与接口进行了绑定, 当我们获取对应Mapper后,调用对应的接口就去查询对应的sql语句 。
原理
那其中的原理是什么呢? 我们打印mapper得到
org.apache.ibatis.binding.MapperProxy@5dfcfece
复制代码
这是个代理对象,我们在java反射机制说过动态代理,这里就是动态代理的一个实践。 当我们调用sqlSession.getMapper(EmployeeMapper.class)时,其构建了一个代理对象,接口的全类名刚好是sql语句的唯一标识id,当我们调用代理对象的getEmpById 时便去执行该id的sql查询的方法。
我们可以理解为EmployeeMapper.xml是对EmployeeMapper接口对一个实现,当调用接口时,mybatis自动创建了个代理对象去实现了我们当接口。
喜欢本文的朋友们,欢迎长按下图关注订阅号"我的编程笔记",收看更多精彩内容~~