mapper 动态代理

在之前的所有例子中,我们在dao接口的实现类中写了一些获取sqlSession并调用其方法的代码,这些代码并没有什么实质的作用,具体的SQL操作语句我们是写在userMapper.xml文件中的,因此 MyBatis 可以抛开这些实现类,直接通过dao接口来定位到mapper中的 SQL 语句,这种方式被称为mapper 的动态代理。

在之前我们mappernamespace的值为test,现在我们要将其修改为org.example.dao.UserDao。将mapperdao关联起来。

<mapper namespace="org.example.dao.UserDao">
</mapper>

这样 MyBatis 就会将当前的UserMapper.xml文件与UserDao接口对应上。UserDao中的方法名与UserMapper.xml文件中的id名称必须保持一致,这样 MyBatis 就能将方法和sql语句对应起来。

通过mapper代理的方式,要求我们必须将mapperdao放在同一目录下。在Maven工程中我们约定配置放在resources目录下。为了保证mapper和dao在统一层级,我们需要在resources下新建org.example.dao目录,将userMapper.xml放在此目录中。同时修改mybatis.xml中的sql映射文件路径为org/example/dao/userMapper.xml

这样Maven在编译时会将mapper文件放到target对应的目录中,例如(org/example/dao)

在不使用Dao的实现类后,获取SqlSession的操作,我们可以放到测试类中完成。

import org.apache.ibatis.session.SqlSession;
import org.example.dao.UserDao;
import org.example.pojo.User;
import org.example.util.MyBatisUtil;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.sql.Date;
import java.util.List;

public class UserTest {
    private SqlSession sqlSession;
    private UserDao userDao;

    @Before
    public void initUserDao() {
        sqlSession = MyBatisUtil.getSqlSession();
        userDao = sqlSession.getMapper(UserDao.class);
    }

    @After
    public void closeSqlSession() {
        if (sqlSession != null) {
            sqlSession.close();
        }
    }

    @Test
    public void selectUserTest() {
        User user = userDao.selectUser(1);
        System.out.println(user);
    }

    @Test
    public void selectUserLickName() {
        List<User> users = userDao.selectLikeName("John");
        for (User user : users) {
            System.out.println(user);
        }
    }

    @Test
    public void insertUserTest() {
        Date date = new Date(System.currentTimeMillis());
        User user = new User("John 123111", "123@qq.com", 20, "Male", date);
        Integer i = userDao.insertUser(user);
        if (i > 0) {
            System.out.println("Insert user successfully!");
        } else {
            System.out.println("Insert user failed!");
        }
    }

    @Test
    public void testSelectAllUsers() {
        List<User> users = userDao.selectUsers();
        for (User user : users) {
            System.out.println(user);
        }
    }
}

最后更新于

这有帮助吗?