Mybatis学习之接口编程

294 阅读2分钟

回顾

在上一篇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自动创建了个代理对象去实现了我们当接口。

喜欢本文的朋友们,欢迎长按下图关注订阅号"我的编程笔记",收看更多精彩内容~~