SQLSession是否线程安全?
答:否,见DefaultSqlSession的 注释,已经写明是线程不安全的。Mybatis获取Mapper后,多个Mapper对应于一个SQLSession,在底层,1个SQLSession对应于一个数据量的Connection。该Connection对象不是线程安全的。接口调用的时候,会调用Mapper的方法,然后实际上是调用MapperProxy的invoke方法,MapperProxy的属性SqlSession实际上是SqlSessionTemplate,在调用链的下层,会调用到SqlSessionInterceptor的invoke,这里才会创建真实的DefaultSqlSession,该对象便是一次调用的会话。一次调用可能是多个mapper.method的组合。SqlSessionInterceptor的invoke方法会打开DefaultSqlSession和关闭DefaultSqlSession。
Mybatis的返回系统是如何设计的:
答:通过ObjectWrapper接口,该接口会有实现类,分别是CollectionWrapper,BaseWrapper,BeanWrapper,MapWrapper。
如果是接口,则会找到默认实现,如果是实现类(非接口或者抽象类),则直接利用接口引用去设置值。
网友评论