Mybatis接口没有实现类为什么可以执行增删改查?

327 阅读2分钟

MyBatis 是一款持久层框架,它提供了一种将 SQL 语句和数据库操作逻辑与 Java 代码进行分离的方式。在 MyBatis 中,接口没有实现类,但仍然可以执行增删改查操作的原因如下:

  1. 接口与 XML 文件的映射:在 MyBatis 中,我们可以通过编写 XML 文件来定义 SQL 语句和数据库操作逻辑。这些 XML 文件与接口进行了映射关联,即接口方法与 XML 中的 SQL 语句进行了对应关系。

  2. 动态代理:MyBatis 在运行时使用动态代理来动态生成接口实例。当我们调用接口方法时,MyBatis 将根据方法的名称和参数信息在 XML 文件中查找对应的 SQL 语句,并执行相应的数据库操作。

综合当我们定义一个接口方法时,MyBatis 会根据接口方法的名称和参数信息在映射的 XML 文件中找到对应的 SQL 语句。当我们调用这个接口方法时,MyBatis 会通过动态代理将方法调用转化为对应的 SQL 执行,并将结果返回给调用者。

下面是一个简单示例来说明 MyBatis 接口的使用:

  1. 定义接口:
public interface UserMapper {
    User getUserById(int id);
    void insertUser(User user);
}
  1. 编写 XML 文件:
<!-- UserMapper.xml -->
<mapper namespace="com.example.UserMapper">
    <select id="getUserById" parameterType="int" resultType="com.example.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
    
    <insert id="insertUser" parameterType="com.example.User">
        INSERT INTO user (id, username) VALUES (#{id}, #{username})
    </insert>
</mapper>
  1. 使用接口:
public class Main {
    public static void main(String[] args) {
        SqlSessionFactory sqlSessionFactory = // 初始化 SqlSessionFactory
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        User user = new User(1, "John");
        userMapper.insertUser(user);

        User retrievedUser = userMapper.getUserById(1);
        System.out.println(retrievedUser);
    }
}

,通过 getMapper() 方法获取了 UserMapper 接口的实例,并调用了其方法,实际上会执行与之对应的 SQL 语句。SqlSessionFactory 是 MyBatis 的核心类,用于创建 SqlSession,而 SqlSession 则是与数据库交互的会话对象。

MyBatis 借助动态代理和 XML 文件的映射,使得接口可以执行增删改查操作,实现了 SQL 语句与 Java 代码的分离。