做旅游计划的网站,网站与微信内容建设与运维总结,搜索引擎排名大全,网站富文本的内容怎么做1.xml映射文件都会写一个Dao接口与之对应#xff0c;Dao工作原理是什么#xff0c;Dao接口里的方法参数不同时#xff0c;方法能重载么
Dao接口即Mapper接口#xff0c;接口的全限名#xff0c;映射文件中的namespace的值#xff0c; 接口的方法名就是映射文件中Mapper的…1.xml映射文件都会写一个Dao接口与之对应Dao工作原理是什么Dao接口里的方法参数不同时方法能重载么
Dao接口即Mapper接口接口的全限名映射文件中的namespace的值 接口的方法名就是映射文件中Mapper的Statement的id值 接口方法内的参数就是传递给sql的参数
调用接口时接口全限名方法名拼接字符串作为key值可唯一定位一个MapperStatement每个标签selectinsert…都会被解析为一个MapperStatement对象。
Mapper接口里的方法是不能重载的因为使用全限名方法名的保存和寻找策略。
工作原理JDK动态代理Mybatis运行时会使用JDK 动态代理为Mapper接口生成代理对象proxy代理对象会拦截接口方法转而执行MapperStatement所代表的的sql然而将sql执行结果返回。
2. Mybatis如何分页分页插件原理是什么
使用RowBounds对象进行分页针对ResultSet结果集执行的内存分页而非物理分页可以在sql内直接书写带有物理分页的参数来完成屋里分页功能也有使用分页插件来完成物理分页。
分页插件原理使用Mybatis提供的插件接口实现自定义插件在插件的拦截方法内拦截待执行的sql然后重写sql根据dialect方言添加对应的物理分页语句和物理分页参数。
3.mybatis的xml映射文件中不同的xml映射文件id是否可以重复?
不同的xml映射文件如果配置了namespace那么id可以重复如果没有配置namespace那么id不能重复。
原因namespace id是作为MapString, MapperStatement的key使用的如果没有namespace就剩下id那么id重复会导致数据互相覆盖有了namespace自然id就可以重复namespace不同namespaceid自然就不同
4.mybatis是否支持延迟加载原理
mybatis仅支持association关联对象和collection关联集合对象的延迟加载association指一对一collection指一对多查询在配置文件中lazyLoadingEnabledtrue|false,是否启用延迟加载
原理使用cglib创建目标对象的代理对象当调用目标方法时进入拦截器方法比如调用a.getB().getName,拦截器invoke方法发现a.getB是null值name会单独发送事先保存好的查询关联B对象的sql把B查询上来然后调用a.setB(b)于是a的对象b属性就有值了接着完成a.getB.getName方法的调用。
5.mybatis一级二级缓存
一级缓存基于PerpetualCache的HashMap本地缓存其存储作用域为Session当Session flush或close后该Session中的所有Cache就将清空默认打开一级缓存。
二级缓存与一级缓存机制相同默认PerpetualCacheHashMap存储不同为存储作用域为MapperNamespace并且可自定义存储源如Ehcache默认不打开二级缓存要开启二级缓存使用二级缓存属性累的需要实现Serializable序列化接口保存对象的状态可在它的映射文件中配置
对于缓存数据更新机制当某个作用域一级缓存Session/二级缓存Namespaces的进行CUD操作后默认该作用域下所有select的缓存将被clear。
mybatis中的一级缓存和二级缓存
6.mybatis插件的运行原理如何编写
mybatis仅可以编写针对ParameterHandlerResultSetHandlerStatementHandlerexecutor4种接口的插件mybatis使用jdk动态代理为需要拦截的接口生成代理对象实现接口方法拦截功能每当执行这4种接口对象的方法时就会进入拦截方法具体就是InvocationHandler的invoke方法只会拦截指定需要拦截的方法
编写插件实现Mybatis的interceptor接口并复写intercept方法然后在给插件编写注解指定要拦截哪个接口的哪些方法即可需在配置文件配置编写的插件。
7.mybatis有哪些 ① SimpleExecutor每执行一次update或select就开启一个statement对象用完立刻关闭statement对象 ②ReuseExecutor执行update或select以sql作为key查找statement对象存在就使用不存在就创建用完后不关闭statement对象而是放置于map ③BatchExecutor完成批处理