MyBatis记录

时间:2022-06-11 13:33:03

记录一下MyBatis的几个模块大纲,除去缓存以及集合映射两个部分

Mybatis架构

MyBatis记录

1、 mybatis配置

SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。

mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。

2、 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂

3、 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。

4、 mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。

5、 Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。

6、 Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。

7、 Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。


  1. 输入映射(就是映射文件中可以传入哪些参数类型)

    1)基本类型

    2)pojo类型

    3)Vo类型

    1. 输出映射(返回的结果集可以有哪些类型)

      1)基本类型

      2)pojo类型

      3)List类型
    2. 动态sql:动态的拼接sql语句,因为sql中where条件有可能多也有可能少

      1)where:可以自动添加where关键字,还可以去掉第一个条件的and关键字

      2)if:判断传入的参数是否为空

      3)foreach:循环遍历传入的集合参数

      4)sql:封装查询条件,以达到重用的目的

    3. 对单个对象的映射关系:

      1)自动关联(偷懒的办法):可以自定义一个大而全的pojo类,然后自动映射其实是根据数据库总的字段名称和

      pojo中的属性名称对应.

      2)手动关联: 需要指定数据库中表的字段名称和java的pojo类中的属性名称的对应关系.

      使用association标签

    4. 对集合对象的映射关系

      只能使用手动映射:指定表中字段名称和pojo中属性名称的对应关系

      使用collection标签
    5. spring和mybatis整合

      整合后会话工厂都归spring管理

      1)原生Dao实现:

      需要在spring配置文件中指定dao实现类

      dao实现类需要继承SqlSessionDaoSupport超类

      在dao实现类中不要手动关闭会话,不要自己提交事务.

      2)Mapper接口代理实现:

      在spring配置文件中可以使用包扫描的方式,一次性的将所有mapper加载

    6. 逆向工程:自动生成Pojo类,还可以自动生成Mapper接口和映射文件

      注意:生成的方式是追加而不是覆盖,所以不可以重复生成,重复生成的文件有问题.

      如果想重复生成将原来生成的文件删除


一般写的时候三步走:

(1)XXXmapper.xml中配sql语句,也就是映射关系

(2)写XXXmapper接口,注意里面的四个小点和同名xml中要一致

(3)在测试类中获取会话工厂,然后通过会话工程获取mapper代理对象

(4)代理对象就可以调用接口中的方法,并返回值结果集了

tips1

占位符#{} 拼接符${}

动态sql中where标签自动去除and字段

public class UserMapperTest {
    private SqlSessionFactory factory;

    @Before
    // 前置执行
    public void ssf() throws IOException {// 初始化会话工厂
        String resource = "sqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        factory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    @Test
    public void test1() throws Exception {
        // 获取会话
        SqlSession sqlSession = factory.openSession();
        // 获取代理对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> list = mapper.findAll();
        System.out.println(list);
        sqlSession.commit();
    }