07-MyBatis Dao代理实现数据库操作

1.相关介绍

public class UserDaoImpl implements UserDao {
    @Override
    public List<User> getAllUser() {
        SqlSession session = MyBatisUtil.getSqlSession();
        //执行数据库操作, namespace.id的方式确定使用哪个sql语句
        List<User> userList = session.selectList("com.limi.dao.UserDao.getAllUser");
        //关闭 SqlSession,释放资源
        session.close();
        return userList;
    }
}

如上代码所示, 在例子中自定义 Dao 接口实现类时发现一个问题:Dao 的实现类其实并没有干什么实质性的工
作,它仅仅就是通过 SqlSession 的相关 API 定位到映射文件 mapper 中相应 id 的 SQL 语句,真正对 DB 进行操作的工作其实是由框架通过 mapper 中的 SQL 完成的。

所以,MyBatis 框架就抛开了 Dao 的实现类,直接定位到映射文件 mapper 中的相应 SQL 语句,对
DB 进行操作。这种对 Dao 的实现方式称为 Mapper 的动态代理方式。

Mapper 动态代理方式无需程序员实现 Dao 接口。接口是由 MyBatis 结合映射文件自动生成的动态代
理实现的。

使用代理的要求:

  1. mapper文件中的namespace一定要和dao接口的全限定名称一致
  2. mapper文件中的标签id一定要和到接口中的方法名一致

2.dao 代理操作数据库

1.实现类就不需要了

在这里插入图片描述

在这里插入图片描述

2.使用代理

package com.limi;

import com.limi.dao.UserDao;
import com.limi.entity.User;
import com.limi.utils.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.io.IOException;
import java.util.List;

public class MyTest {

    @Test
    public void test1() throws IOException {

        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        //上面这行代码等价于UserDao userDao = new UserDaoImpl();


        //使用dao接口操作数据库
        List<User> userList = userDao.getAllUser();
        userList.forEach(user -> System.out.println(user));

        sqlSession.close();  //关闭会话一定要在数据库操作执行之后
    }
}

3.运行结果

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐