https://blog.csdn.net/ThinkWon/article/details/101292950
https://qqe2.com/java/post/1228.html
关联查询

  1. 集合:一对多 :collection
  2. 关联:多对一:association
  3. JavaType & ofType
    1. JavaType 用于指定属性的类型
    2. ofType 用于指定映射到List或者集合中的 pojo 类型,泛型中的约束类型。
  4. 都可以:按照查询结果嵌套处理,按照结果嵌套处理

Hibernate 和 MyBatis 的区别

Mybatis : MyBatis 是支持定制化 SQL 和 高级映射 持久化层框架,不完全是一个ORM框架,可以通过XML 或注解的方式灵活配置要运行的 SQL 语句
Hibernate:对象-关系映射能力强,数据库的无关性好,Hirberate可以自动生成SQL语句,对于关系模型要求高的软件,如果用HIrbernate开发可以节省很多时间。

XML 映射文件中,除了常见的 select,insert,update, delete 标签之外,还有哪些标签?

  • 结果映射:描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素
  • 可被其它语句引用的可重用语句块。

最佳实践中,通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应,请问,这个 Dao 接口的工作原理是什么?Dao 接口里的方法,参数不同时,方法能重载吗?

  • Mapper 接口的全限定名,就是映射文件中的 namespace
  • 接口中的方法名,就是映射文件中的 MappedStatement 的id值
  • 接口方法的参数就是传递给 sql 的参数。

当调用接口方法时,接口全限定名 + 方法名 拼接成字符串作为 key 值,可唯一定位一个 MappedStatement.
Mapper 接口的原理是 JDK 的动态代理,Mybatis 运行时会使用 JDK 动态代理为 Mapper 接口生成代理 proxy 对象,代理对象会拦截接口方法,转而执行 MappedStatement 所代表的 sql, 然后将 sql 执行结果返回。

Mybatis 是如何进行分页的?分页插件的原理是什么?

Mybatis 可以使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页,可以在 sql 内直接书写带有物理分页的参数来完成分页功能,
也可以用插件来物理分页。在插件的拦截方法内拦截待执行的 sql,然后重写 sql,根据 dialect 方言,添加对应的物理分页语句和物理分页参数。

Mybatis 的一级缓存,二级缓存

  1. 一级缓存 Mybatis的一级缓存是指SQLSession,一级缓存的作用域是SQlSession, Mabits默认开启一级缓存。 在同一个SqlSession中,执行相同的SQL查询时;第一次会去查询数据库,并写在缓存中,第二次会直接从缓存中取。 当执行SQL时候两次查询中间发生了增删改的操作,则SQLSession的缓存会被清空。 每次查询会先去缓存中找,如果找不到,再去数据库查询,然后把结果写到缓存中。 Mybatis的内部缓存使用一个HashMap,key为hashcode+statementId+sql语句。Value为查询出来的结果集映射成的java对象。 SqlSession执行insert、update、delete等操作commit后会清空该SQLSession缓存。
  2. 二级缓存 二级缓存是mapper级别的,Mybatis默认是没有开启二级缓存的。 第一次调用mapper下的SQL去查询用户的信息,查询到的信息会存放代该mapper对应的二级缓存区域。 第二次调用namespace下的mapper映射文件中,相同的sql去查询用户信息,会去对应的二级缓存内取结果。