1、JDBC执行过程回顾
1)获取Connection连接
2)预编译SQL
3)执行SQL
4)读取结果
1.2、预编译的三种执行器
三种执行器都支持批处理
1)Mysql不支持(setFetchSize)设置一次性读取多少行。
2)addBatch批量操作,将多个SQL合并在一起,最后调executeBatch一起发送至数据库执行。
3)setFetchSize设置从数据库每次读取的数量单位。该举措是为了防止一次性从数据库加载数据过多,导致内存溢出。
1.3、关于防止SQL注入问题
1)简单执行器(Statement)存在sql注入问题,发送一条一条静态sql语句(包含参数)传输体量比较大。
2)预处理执行器(PreparedStatement)可以防止sql注入问题,发送一条sql语句包含若干组参数传输体量比较小。
3)预处理执行器是通过参数转义来防止sql注入问题的,参数转义是在数据库层面进行的而不是应用程序做的。
1.4、简单执行器与预处理执行器的区别
1)简单执行器(Statement)
- 执行静态sql存在sql注入问题,不需要设置参数。
- 相同的sql查询参数不同时会组装成不同参数的多条静态sql进行多次发送,从而多次编译多次执行。
2)预处理执行器(PreparedStatement)
- 执行动态sql可以防止sql注入问题,需要设置预编译参数。
- 相同的sql查询参数不同时会组装成一条动态sql,多组不同参数进行发送,从而一次编译多次执行。
2、MyBatis执行过程
Statement----声明
Handler------处理器
Executor-----执行者,执行器
- 会话SqlSession关闭所有涉及的执行器、声明处理器都会销毁。
- 在一次会话中,SqlSession、Executor、StatementHandler的比例关系:
SqlSession:Executor:StatementHandler=1:1:n
这里的1:1:n指的是一个事务。 - 一个会话可以启动多个事务
- 以上所有的组件都不是线程安全的,不能跨线程使用。