目录
##Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
##Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?
##mybatis-plus操作https://blog.csdn.net/fhefhffg/article/details/122324051#t83
什么是mybatis
持久层框架, 它内部封装了 JDBC,简化了JDBC的操作方式,是一个半 ORM框架:Mybatis在查询 关联对象或关联集合对象 时,需要手动编写sql来完成,所以,称之为半自动ORM框架。##为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。
什么是mybatis-plus
是MyBatis的增强工具
其中应用到了ORM思想,即以对象的方式操作数据库(对象关系映射)
ORM思想
用于实现 不同系统的数据 之间的转换
#Mybatis的工作流程
Mybatis的工作原理 lpx
1, mybatis应用程序通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件
(也可以用Java文件配置的方式,需要添加@Configuration)中构建出SqlSessionFactory(SqlSessionFactory是线程安全的)————创建SqlSessionFactory
2, SqlSessionFactory的实例直接开启一个SqlSession————通过SqlSessionFactory创建SqlSession
3, 再通过SqlSession实例获得Mapper对象 并 执行Mapper映射的SQL语句,完成对数据库的CRUD和事务提交(通过SqlSession执行数据库操作 调用session.commit()提交事务 调用session.close()关闭事务)
4, 关闭SqlSession
说明:SqlSession是单线程对象,因为它是非线程安全的,是持久化操作的独享对象,类似jdbc中的Connection,底层就封装了jdbc连接。
##Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
答:
第一种是使用<resultMap>标签,列名和对象属性名逐一映射。
第二种是使用sql的列别名功能,列别名和对象属性名逐一映射。
Mybatis 通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回
,那些找不到映射关系的属性,是无法完成赋值的。
-----比如T_NAME AS NAME,对象属性名一般是name,小写,但是列名不区分大小写,Mybatis会忽略列名大小写,智能找到与之对应对象属性名,你甚至可以写成T_NAME AS NaMe,Mybatis一样可以正常工作。
#resulttype和resultmap区别
mybatis单表查询:
1、当表中的字段与POJO中的属性名称一致时,映射文件中使用resultType进行映射
2、当表中的字段与POJO中的属性名称不一致时,不能直接使用resultType进行映射,需要使用resultMap进行映射.
mybatis多表关联查询:
映射文件中使用resultMap进行映射
多表关联查询
MyBatis中resultType和resultMap的区别
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的(对应着我们的model对象中的实体),而resultMap则是对外部ResultMap的引用(提前定义了db和model之间的隐射key:value关系),但是resultType跟resultMap不能同时存在。
在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。
(1)当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。
(2)当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。
##Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?
Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?
不同的 Xml 映射文件,如果配置了 namespace,那么 id 可以重复;如果没有配
置 namespace,那么 id 不能重复;
原因就是 namespace+id 是作为 Map<String, MapperStatement>的 key
使用的,如果没有 namespace,就剩下 id,那么,id 重复会导致数据互相覆盖。
有了 namespace,自然 id 就可以重复,namespace 不同,namespace+id 自然
也就不同。