国内酒店网站建设,建一个公司网站需要几天,wordpress 图片加链接,建设网站是什么模式Mybatis常见面试题 #{}和#xffe5;{}的区别是什么#xff1f; 【#】#xff1a;底层执行SQL使用PreparedStatement对象#xff0c;预编译SQL#xff0c;相对安全。入参使用占位符的方式。 【$】#xff1a;底层执行SQL使用Statement对象#xff0c;入参使用SQL拼接的…Mybatis常见面试题 #{}和{}的区别是什么 【#】底层执行SQL使用PreparedStatement对象预编译SQL相对安全。入参使用占位符的方式。 【$】底层执行SQL使用Statement对象入参使用SQL拼接的方式存在SQL注入问题。 xml映射文件中除了常见的select、insert、update、delete还有哪些标签。 根标签namespace要求与接口的全类名一致。标签用于编写sql片段可以使用标签引入sql片段。标签描述如何从数据库结果集中加载对象。 一般是resultType解决不了的问题可以使用resultMap。比如多表查询返回多个结果集等复杂情况使用。resultType属性设置结果集期望返回的类型。 动态的九个子标签。 Dao接口的工作原理是什么Dao接口里的方法参数不同方法能重载吗 Dao接口的工作原理是JDK动态代理Mybatis运行时回使用动态代理为Dao生成代理proxy对象代理对象会拦截接口方法执行MapedStatement代表的sql然后返回sql执行结果。 Mybatis 通过解析 XML 和 mapper 接口上的注解生成 sql 对应的 MappedStatement 实例并放入 SqlSessionTemplate 中 configuration 类属性中 Dao接口可以重载多个方法但是多个接口对应的映射只能有一个。 方法的参数不同可以使用在sql语句中使用动态sql。 有多个有参方法时参数数量必须一致并且使用相同的Param注解给参数命名。 Mybatis是如何分页的分页插件原理是什么 在mybatis-config.xml中使用分页插件pagehelper调用startPage方法在执行SQL语句时会为SQL加上limit语句。 简述Mybatis的插件运行原理如何编写一个插件 MyBatis 仅可以编写针对 ParameterHandler 、 ResultSetHandler 、 StatementHandler 、 Executor 这 4 种接口的插件MyBatis 使用 JDK 的动态代理为需要拦截的接口生成代理对象以实现接口方法拦截功能每当执行这 4 种接口对象的方法时就会进入拦截方法具体就是 InvocationHandler 的 invoke() 方法当然只会拦截那些你指定需要拦截的方法。 实现 MyBatis 的 Interceptor 接口并复写 intercept() 方法然后在给插件编写注解指定要拦截哪一个接口的哪些方法即可记住别忘了在配置文件中配置你编写的插件。 Mybatis执行批量插入能返回数据库主键列表吗 批量插入使用标签和标签配合可以实现批量插入。 可以返回数据库主键列表。 Mybatis动态sql是做什么的都有哪些动态sql能简述一下动态sql的执行原理吗 使用动态sql可以根据不同条件编写sql语句。MyBatis 提供了 9 种动态 sql 标签: if/ifwhere/where(trim,set)choose/choosewhen, otherwiseforeach/foreachbind/ 执行原理其执行原理为使用 OGNL 对象导航图语言来实现动态 sql 的功能。 Mybatis是如何将sql执行结果封装为目标对象并返回的 通过获得列名和属性名的映射关系Mybatis通过反射创建对象并且逐一给对象的属性赋值并返回。 Mybatis能一对一一对多关联查询吗 关联对象查询实现方式可以单独发送一个sql查询关联对象再赋值给主对象。 或者通过join嵌套查询。具体实现方式 使用resultMap自定义映射resultMap的子标签association定义一对一的关联关系。collection标签定义一对多的关联关系。 Mybatis是否支持延迟加载如果支持原理是什么 延迟加载需要即加载不需要就不加载。可以提高程序运行效率。 !-- 开启延迟加载 --
setting namelazyLoadingEnabled valuetrue/使用 CGLIB 创建目标对象的代理对象调用目标方法进入拦截器方法拦截器发现是null值就会发送sql语句把具体值查询上来。 CGLIB是一个功能强大高性能的代码生成包。它为没有实现接口的类提供代理为JDK的动态代理提供了很好的补充。 通过Mybatis拦截器我们可以拦截某些方法的调用我们可以选择在这些被拦截的方法执行前后加上某些逻辑也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被拦截的方法。所以Mybatis拦截器的使用范围是非常广泛的。 Mybatis的xml映射文件中不同xml映射文件id是否可以重复 不同的 xml 映射文件如果配置了 namespace那么 id 可以重复如果没有配置 namespace那么 id 不能重复毕竟 namespace 不是必须的只是最佳实践而已。 原因就是 namespaceid 是作为 MapString, MappedStatement 的 key 使用的如果没有 namespace就剩下 id那么id 重复会导致数据互相覆盖。有了 namespace自然 id 就可以重复namespace 不同namespaceid 自然也就不同。 Mybatis批处理 使用 BatchExecutor批处理执行器 完成批处理。批量插入删除 Mybatis都有哪些Executor执行器之间的区别 MyBatis 有三种基本的 Executor 执行器 SimpleExecutor 每执行一次 update 或 select就开启一个 Statement 对象用完立刻关闭 Statement 对象。ReuseExecutor 执行 update 或 select以 sql 作为 key 查找 Statement 对象存在就使用不存在就创建用完后不关闭 Statement 对象而是放置于 MapString, Statement内供下一次使用。简言之就是重复使用 Statement 对象。BatchExecutor 执行 update没有 selectJDBC 批处理不支持 select将所有 sql 都添加到批处理中addBatch()等待统一执行executeBatch()它缓存了多个 Statement 对象每个 Statement 对象都是 addBatch()完毕后等待逐一执行 executeBatch()批处理。与 JDBC 批处理相同。 作用范围Executor 的这些特点都严格限制在 SqlSession 生命周期范围内。 Mybatis中如何指定使用哪一种Executor 在 MyBatis 配置文件中可以指定默认的 ExecutorType 执行器类型也可以手动给 DefaultSqlSessionFactory 的创建 SqlSession 的方法传递 ExecutorType 类型参数。 Mybatis是否可以映射Enum枚举类 MyBatis 可以映射枚举类不单可以映射枚举类MyBatis 可以映射任何对象到表的一列上。映射方式为自定义一个 TypeHandler 实现 TypeHandler 的 setParameter() 和 getResult() 接口方法。 TypeHandler 有两个作用 一是完成从 javaType 至 jdbcType 的转换二是完成 jdbcType 至 javaType 的转换体现为 setParameter() 和 getResult() 两个方法分别代表设置 sql 问号占位符参数和获取列查询结果。 MyBatis 映射文件中如果 A 标签通过 include 引用了 B 标签的内容请问B 标签能否定义在 A 标签的后面还是说必须定义在 A 标签的前面 虽然 MyBatis 解析 xml 映射文件是按照顺序解析的但是被引用的 B 标签依然可以定义在任何地方MyBatis 都可以正确识别。 原理是MyBatis 解析 A 标签发现 A 标签引用了 B 标签但是 B 标签尚未解析到尚不存在此时MyBatis 会将 A 标签标记为未解析状态然后继续解析余下的标签包含 B 标签待所有标签解析完毕MyBatis 会重新解析那些被标记为未解析的标签此时再解析 A 标签时B 标签已经存在A 标签也就可以正常解析完成了。 简述 MyBatis 的 xml 映射文件和 MyBatis 内部数据结构之间的映射关系 MyBatis 将所有 xml 配置信息都封装到 All-In-One 重量级对象 Configuration 内部。在 xml 映射文件中 parameterMap 标签会被解析为 ParameterMap 对象其每个子元素会被解析为 ParameterMapping 对象。 resultMap 标签会被解析为 ResultMap 对象其每个子元素会被解析为 ResultMapping 对象。每一个 select、insert、update、delete 标签均会被解析为 MappedStatement 对象标签内的 sql 会被解析为 BoundSql 对象。 为什么说 MyBatis 是半自动持久化层 ORM 映射工具它与全自动的区别在哪里 半自动化 Hibernate 属于全自动 ORM 映射工具使用 Hibernate 不需要手动编写sql语句。所以它是全自动的。 而 MyBatis 在查询关联对象或关联集合对象时需要手动编写 sql 来完成所以称之为半自动 ORM 映射工具。手写sql为优化SQL提供了可能。 ORM框架遵循对象关系映射。 持久化层数据可以持久化将数据不仅仅放在内存中而是保存在数据库中。也就是我们常说的DAO层。Mybatis可以帮助我们更方便地从数据库中取出数据、插入数据等。