开发者学堂课程【高校精品课-厦门大学 -JavaEE 平台技术:执行selectList方法】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/80/detail/15951
执行selectList方法
Default Sqlsession,我们讲其中一条命令就是他的 select,就是如果说那边的那个map method里头绑定的是一个 select的动作,那他最后会调到这个 select的命令。这个正中间啊对应的方法是 select list,他的第一个参数是 statements,第二个参数是它的参数,第三个参数是它的分页,它叫做 rowBound,就是你要返回结果中间的行的上下的边界,就是分页,这是他的 select list的这个方法。
进来以后,第一件就是看配置,因为他的所有东西都在配置里头,对于这个secssion来说,首先从他的这个配置信息中间把这个 statement变成一个map的船舰,这个 statement是什么?
是一个 ID,就是每一个注解,每个标签都有个 ID,所以他需要用这个 ID去得到在配置里头,这个 ID对应的那些信息是什么,这个对应的这个信息就是它的 segment的全部内容,那在看中间他有一个Map的statement的方法。然后把这个ID给他。
就会得到一个 market segment,这个就是在标签里定义的那个 statement的定义。拿到了这个 statement以后,则交给 executer去做执行。
这里我们收到他其实有多种 executer,每种 excuter的执行逻辑都不一样,我们挑一个最简单的就是那个 simple excuter,假如我们现在配的是最简单的simple excuse。就是返回这个 map statement,就去调 excuter的方法,然后把拿到的那个 ID对应的那个 statement的所有的信息,它的传递的参数。
他要返回的这个行的边界。最后一个是结果该怎么处理法,我们默认结果不作处理,所以代码中间它的结果也是一个常量,叫做 No result就是结果就是什么,结果就直接返回,不做任何处理去。去调这个 simple excuter的方法,在 simple
excuter 的方法中间,这个科学方法其实是写在它的父类里头,写在他的这个base excuter 里头,这个 base excuter中间的这个方法中间。
首先来说是要把这个 Parameter和在这个 map里面的这个S ql语句进行组合,最后变成我们可以运行的 Sql语句,因为我们知道在这个 map里面的那个数据的都写的是参数,所以说我们要把这个parameter和那个参数绑在一起,所以首先来做的就是利用他传递了这个 map statement的这个对象,来把这个参数和SQL语句绑定上去,所以他调他的这个 getBoundSql的方法把 parameter的传过来,返回的就是他绑好的 Sql语句,就是 boundsql。这是第一步,第二步,它去产生它的缓存的key,去计算它的缓存的key因为它有一级缓存,就是对于 simple,他都有一级缓存,所有都有缓存,所以大家算一下 key是什么,这是它的一个独立的方法,我们知道他的这个 key的计算是跟他的这个 statement的id有关,跟他的参数有关,就是它的传递的这个参数和值,还有他的 statement的id,会传出来它的这个缓存的参数是什么,至少我们知道他要把这个 map statement parameter,还有他要返回的 Bounds,因为返回这个语句是一样,这个 parameter是一样,但是它要返回的这个行数不一样的话,也没意义,所以 row bounds要返回来,还有他的这个处理的结果常量,最后是 bound的 SQL语句返回回来会产生参数 key,那拿他的 key以后,他首先会去缓存里查一下,那它的这个查询他又写了一个方法,这个方法叫做query的方法,参数是一样的,他写的这个方法里头,他先到他的 local cache里头,对于这个 basic speech来说,他都有一个本地缓存,首先到这个 logo cachr里头去看看这个对象有没有,这个如果 return是有值的话,就直接返回了,他就不会再往下执行了,如果是没有的,他则又写了一个方法,这个方法套了很多,这个方法叫做从数据库里去找,再从数据库里头去找的过程中间,他又在调自己的一个方法,这个方法是 protected的方法,叫做 do query,这个是真实的去做查询,参数
是跟前面一样的参数,查完了以后,然后把它调这个 logo开始的方法,把它put进去,key 这样的一个逻辑。
所以在这个父类里头可以看到它定义了说他的缓存机制,它定义首先它的这个statements parameter 是怎样转换的,那个 statement把它合到一起,最后变成我们要查询的这个 Sql语句,然后去产生它的这个 Key,然后用他的这个 Key去查一下他有没有,如果有的话就会直接返回,如果没有的话,它真的会到数据库里去找。
找的时候真的是去调 do query这个方法去找的,dp query 方法,在 base executer 中间是写的是 protected方法,而这个方法的实现是在底下的子类中间实现了,也就是在 simple里头直接去找,在这个 reuse的 executer也是看这个
statement 是否有缓存,缓存那就不要作预编译,直接拉出来去找,betis 的时候是批量去找,开启的时候是要到二级,缓存你再去找一遍,二级缓存里面有的话就返回,二级缓存没有的话,再看这个开启放的再由他去找。
所以这个 do query是在子类中间去实现不同的这个结果,最后得到这个值,再把它
放到这里然后回来,这是模板方法的模式。
这个 do query就是定义在父类中间是 protected的,在子类中间实现了。