https://rnang0.github.io/2019/12/26/Mybatis的Mapper实现原理/

一、Mapper案例

相信只要是使用过MyBatis开发的同学,都有使用其中的Mapper接口来开发,因为确实是很方便,方便到我们只需要编写接口而不需要写实现类,就能够完成对数据库的CRUD操作。

但是不知道大家有没有去思考过,如果我们真的只有Mapper接口的话,程序又是如何去完成实际的业务的呢?来看看下面的代码

1. UserMapper

cn.wolfcode.mybatis.mapper.UserMapper接口

public interface UserMapper {
    void save(User u);
}

2. UserMapper.xml映射文件

xml

<mappernamespace="cn.wolfcode.mybatis.mapper.UserMapper">
<insertid="save">
        INSERT INTO user (id, username, password) VALUES (NULL, #{username}, #{password})
</insert>
</mapper>


3. UserServiceImpl业务方法

java

publicvoidsave(User u)throws IOException{
        SqlSessionFactory factory =new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession session = factory.openSession();
        UserMapper mapper = session.getMapper(UserMapper.class);
        mapper.save(u);
        session.commit();
        session.close();
    }


从上面的代码中可以看出,我们只需要给MyBatis提供Mapper接口和与之匹配的映射文件,就能够让MyBatis按照我们的需求执行到对应的SQL

这里的实现原理就是我们前面所讲过的 动态代理,接下来我们看一波源码。