Questions:

  • 它在项目是处理什么问题的?
    • 持久层的框架,数据库增删改查的操作
  • 大概写法是什么?
  • 对于团队有什么好处?
    • Mybatis 通过 xml 的方式将所要执行的 sql 语句封装起来,当我们要修改 sql 的时候,直接修改 xml 中的配置就好;查询回来的数据会自动封装到 java 对象中去,减少了很多代码的编写,例如说不用我们自己去编写查询结果和 java bean 属性之间的映射关系,只要写好 xml 的配置文件即可
    • 但是同时也导致了已经编写好的 sql 语句相当依赖数据库,数据移植性比较差
  • 有没有其他的替代方案
    • hibernate & spring boot jpa
    • Hibernate 是将 java classes 映射到数据库;而 Mybatis 是将 SQL 语句映射到 java的方法中
    • Mybatis 是通过 XML 或者注解的方法来配置需要运行的 SQL 语句,就是 Mybatis 要自己编写所用到的 Mysql 语句,就使得其有较高的灵活性,想要拿什么数据就拿对应的数据,那么就是说要根据不同的数据库改变
    • Hibernate 是直接操作对象来实现数据的写入修改,无需直接编写 SQL 语句,那么就能做到数据库无关性
  • 替代了什么老的技术,解决了老技术的什么问题?(备选)

Mybatis -> OOM (obejct oriented mapping)
Mybatis 使用(最基础版本)

  • pom
    • 依赖:dependencies: mybatis & mysql-connector-java(最低配置…?)
    • 项目打包的时候不扫描 mapper 中的文件,要在 pom 中加上 resource -> directory -> includes 来使得 mapper 中的 xml 文件也会被打包进去
  • mapper:链接 entity & 数据库中的记录
    • namespace.id 定位唯一的 sql 语句
  • 创建对应的 entity 类
  • 编写 conf.xml 文件设置 mybatis 运行的参数
    • typeAliases -> typeAliase
      • type:被替换类的全类名
      • alias:替换成的别名
    • environments -> environment
      • transactionManager(事务提交方式):JDBC, MANAGED
      • dataSource -> property:驱动,数据库链接,数据库用户名和密码
      • 数据库链接方式(dataSource type):POOLED, UNPOOLED, JDNI
    • mappers -> mapper
    • typeHandlers -> typeHandler
      • type:转换器的全类名
    • note: conf.xml 放在 resources 文件夹中,在编译之后 resources 文件夹中的文件将会出现在根目录下,那么 getResourceAsReader 就直接写 conf.xml 的文件名就好
  • 启动类
    • SqlSessionFactoryBuilder -> SqlSessionFactory -> SqlSession
    • 然后调用 SqlSession 所带的各种方法 (selectOne, select, etc)

Mybatis (通过映射接口调用 sql 语句)

  • 约定大于配置,配置大于代码
  • 创建 以 mapper 包名为名字的接口,接口中的方法名字对应 mapper 中的 id 值;接口中方法的参数和返回值都跟 mapper.xml 中的 resultType 和 parameterType 一致
  • 调用:
    • 启动类中调用 session.getMapper 方法获得该接口
    • 然后直接调用接口中的方法来调用对应的 sql 语句

类型转换器

  • 实现 TypeHandler 接口,或者继承 BaseTypeHandler 类
  • 重写当中的 setNonNullParameter & getNullableResult 方法
  • set 方法是 java -> jdbc,将 java 中的数据转换并写入数据库中;get 方法是 jdbc -> java,获得数据库中的数据之中转换成 java 中对应的数据类型

Questions:

  • 占位符 #{} 和 ${} 的不同
    • 当 parameterType 是普通类型 & String 时 -> #{任意名字};${value}
    • 当 parameterType 是对象类型是 -> #{属性名};${属性名}
    • {} 会自动给 String 类型加上单引号;而 ${} 则是原样输出,但是适合用于动态排序

    • 但是 ${} 和 #{} 都能使用层级属性

References:



Mybatis-Plus

  • 快速开始(最低运行配置…?)
    • 添加依赖
    • 创建对应数据库记录的实体类 entity
    • 创建 mapper 接口继承 BaseMapper 接口(泛型为要操作的实体类 entity)

reference:

CodeGenerator -plus

  • MP 是有代码生成器的,不过没有详细看

分页功能 / pagination

  • 使用分页功能需要先在模板中配置分页插件

    @Bean
    public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); }