mybatis学习笔记

一.resultType和resultMap在使用中的区别
在使用mybatis进行数据库连接操作时对于SQL语句返回结果的处理通常有两种方式,一种就是resultType另一种就是resultMap。

1.通常来说:resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用。但是resultType跟resultMap不能同时存在。

2.具体来看:

(1)resultType:当使用resultType做SQL语句返回结果类型处理时,对于SQL语句查询出的字段在相应的pojo中必须有和它相同的字段对应,而resultType中的内容就是pojo在本项目中的位置。

因此对于单表查询的话用resultType是最合适的。但是,如果在写pojo时,不想用数据库表中定义的字段名称,也是可以使用resultMap进行处理对应的。多表连接查询时,若是一对一的连接查询,那么需要新建一个pojo,pojo中包括两个表中需要查询出的所有的字段,这个地方的处理方式通常为创建一个继承一个表字段的pojo,再在里面添加另外一个表内需要查询出的字段即可。若是一对多查询时,若是使用内连接查询,则很可能出现查询出的字段有重复。使用双重for循环嵌套处理即可。

(2)resultMap:当使用resultMap做SQL语句返回结果类型处理时,通常需要在mapper.xml中定义resultMap进行pojo和相应表字段的对应。

二.#{}和KaTeX parse error: Expected 'EOF', got '#' at position 9: {}的区别 #̲{}是预编译处理,{}是字符串替换。

(1)mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值。

(2)mybatis在处理 时 , 就 是 把 {}时,就是把 {}替换成变量的值,直接进行字符串拼接。

     :如果是${内容} 的形式,默认找内容的get/set方法,如果是${数字},则SQL语句处就是数字

(3)使用#{}可以有效的防止SQL注入,提高系统安全性。原因在于:预编译机制。预编译完成之后,SQL的结构已经固定,即便用户输入非法参数,也不会对SQL的结构产生影响,从而避免了潜在的安全风险。

(4)预编译是提前对SQL语句进行预编译,而其后注入的参数将不会再进行SQL编译。我们知道,SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作。而预编译机制则可以很好的防止SQL注入。

三.Mybatis运行原理
(一)涉及到的类

  1. 运行过程中涉及到的类
    1.1 Resources MyBatis 中IO 流的工具类
    1.1 加载配置文件
    1.2 SqlSessionFactoryBuilder() 构建器
    1.2.1 作用:创建SqlSessionFactory 接口的实现类
    1.3 XMLConfigBuilder MyBatis 全局配置文件内容构建器类
    1.3.1 作用负责读取流内容并转换为JAVA 代码.
    1.4 Configuration 封装了全局配置文件所有配置信息.
    1.4.1 全局配置文件内容存放在Configuration 中
    1.5 DefaultSqlSessionFactory 是SqlSessionFactory 接口的实现类
    1.6 Transaction 事务类
    1.6.1 每一个SqlSession 会带有一个Transaction 对象.
    1.7 TransactionFactory 事务工厂
    1.7.1 负责生产Transaction
    1.8 Executor MyBatis 执行器
    1.8.1 作用:负责执行SQL 命令
    1.8.2 相当于JDBC 中statement 对象(或PreparedStatement或CallableStatement)
    1.8.3 默认的执行器SimpleExcutor
    1.8.4 批量操作BatchExcutor
    1.8.5 通过openSession(参数控制)
    1.9 DefaultSqlSession 是SqlSession 接口的实现类
    1.10 ExceptionFactory MyBatis 中异常工厂

(二)文字解释

在MyBatis 运行开始时需要先通过Resources 加载全局配置文件.下面需要实例化SqlSessionFactoryBuilder 构建器.帮助SqlSessionFactory 接口实现类DefaultSqlSessionFactory.

在实例化DefaultSqlSessionFactory 之前需要先创建XmlConfigBuilder解析全局配置文件流,并把解析结果存放在Configuration 中.之后把Configuratin 传递给DefaultSqlSessionFactory.到此SqlSessionFactory 工厂创建成功.

由SqlSessionFactory 工厂创建SqlSession.

每次创建SqlSession 时,都需要由TransactionFactory 创建Transaction对象, 同时还需要创建SqlSession 的执行器Excutor, 最后实例化DefaultSqlSession,传递给SqlSession 接口.

根据项目需求使用SqlSession 接口中的API 完成具体的事务操作.

如果事务执行失败,需要进行rollback 回滚事务.
如果事务执行成功提交给数据库.关闭SqlSession

到此就是MyBatis 的运行原理
————————————————
版权声明:本文为CSDN博主「cute。」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41637380/article/details/91986968

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值