简单记录一下Mybatis里面的这个Mapper代理的使用方式。框架的东西就是这样,把好多细节都隐藏了,看到更多的就是配置文件。

    基于二十一文的案例我们使用代理配置,

    有三点要求
    1:定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下。
    基于上次的不使用代理的模块我在复制一份,然后使用代理。首先,我们就定义这个接口。这个接口的路径正确放置就行,在main下的java下面就可以,至于在下面定义多级文件夹也没有关系2,怎样方便就怎样来。
    image.png
    之前我们是有一个UserMapper.xml的映射文件,现在我们定义一个同名的接口文件。
    然后将接口和映射文件放在同一目录的话可以直接拖动,但是这样显得不太分明,我们将java路径下的java文件和resources下面的配置文件层次分明。

    我们可以这样做。然后把UserMapper.xml拖到这个文件夹下面。
    image.png

    我的文件夹比较简单,不是很多级,如果你的是多级的话,在resources下面创建directory,多层级直接要用/分割。

    需要注意到这个是相对类路径,也就是相对于main或者java这两个同名的文件的相对位置得到一致就可以认为放置好了。
    image.png

    2: 设置SQL映射文件的namespace属性为Mapper接口全限定名
    全限定名就是类名全称,带包路径用点隔开
    image.png

    3: 在 Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致 。

    好我们接下来在接口中编写,很简单。我们要返回的是是一个集合List,然后类型是User,所以我们这样写。

    1. package mapper;
    2. import jgdabc.User;
    3. import java.util.List;
    4. public interface UserMapper {
    5. List<User> selectAll();
    6. }

    然后测试类

    1. package jgdabc_;
    2. import jgdabc.User;
    3. import mapper.UserMapper;
    4. import org.apache.ibatis.io.Resources;
    5. import org.apache.ibatis.session.SqlSession;
    6. import org.apache.ibatis.session.SqlSessionFactory;
    7. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    8. import java.io.IOException;
    9. import java.io.InputStream;
    10. import java.util.List;
    11. public class MybatisDemo {
    12. public static void main(String[] args) throws IOException {
    13. // 加载mybatis的核心配置文件
    14. //1. 加载mybatis的核心配置文件,获取 SqlSessionFactory
    15. String resource = "mybatis-config.xml";
    16. InputStream inputStream = Resources.getResourceAsStream(resource);
    17. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    18. //2. 获取SqlSession对象,用它来执行sql
    19. SqlSession sqlSession = sqlSessionFactory.openSession();
    20. // 使用·代理
    21. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    22. List<User> users = mapper.selectAll();
    23. System.out.println(users);
    24. //3. 执行sql
    25. // List<User> users = sqlSession.selectList("test.selectAll");
    26. // System.out.println(users);
    27. // //4. 释放资源
    28. sqlSession.close();
    29. }
    30. }

    测试运行
    image.png
    还有一点就是如果我们使用这种代理的方式也就是Mapper接口的名称和sql映射文件的名称相同,在同一目录下,我们可以在核心配置文件中使用批量注册的方式,也就是包扫描。
    image.png