Mybatis面试整理
#{}和${}的区别
#{}
是预编译处理,${}
是字符串替换。Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理${}时,就是把${}替换成变量的值。使用#{}可以有效的防止SQL注入,提高系统安全性。
当实体类中的属性名和表中的字段名不一样,如果将查询的结果封装到指定pojo
通过在查询的sql语句中定义字段名的别名
通过
<resultMap>
来映射字段名和实体类属性名的一一对应的关系.
模糊查询like语句该怎么写
在java中拼接通配符,通过#{}赋值
在Sql语句中拼接通配符 (不安全 会引起Sql注入)
通常一个Xml映射文件,都会写一个Dao接口与之对应, Dao的工作原理,是否可以重载
不能重载,因为通过Dao寻找Xml对应的sql的时候全限名+方法名的保存和寻找策略。
接口工作原理为jdk动态代理原理,运行时会为dao生成proxy,代理对象会拦截接口方法,去执行对应的sql返回数据
Mybatis是如何进行分页的,分页插件实现的原理
Mybatis使用RowBounds对象进行分页,也可以直接编写sql实现分页,也可以使用Mybatis的分页插件
分页插件的原理:实现Mybatis提供的接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql。
Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签
<resultMap>、<parameterMap>、<sql>、<include>、<selectKey>
加上动态sql的标签,比如where|set|foreach|if|choose|when|otherwise<sql>
为sql片段,<include>
引入sql片段
Mybatis动态sql是做什么的?都有哪些动态sql?简述一下动态sql的执行原理
Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能,Mybatis提供了9种动态sql标签trim|where|set|foreach|if|choose|when|otherwise|bind。
使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。
Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式
第一种是使用标签,逐一定义列名和对象属性名之间的映射关系。第二种是使用sql列的别名功能,将列别名书写为对象属性名
有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。
Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别。
Mybatis不仅可以执行一对一、一对多的关联查询,还可以执行多对一,多对多的关联查询,多对一查询,其实就是一对一查询,只需要把selectOne()修改为selectList()即可;多对多查询,其实就是一对多查询,只需要把selectOne()修改为selectList()即可。
一种是单独发送一个sql去查询关联对象,赋给主对象,然后返回主对象。另一种是使用嵌套查询,嵌套查询的含义为使用join查询,一部分列是A对象的属性值,另外一部分列是关联对象B的属性值,好处是只发一个sql查询,就可以把主对象和其关联对象查出来。其去重复的原理是标签内的子标签,指定了唯一确定一条记录的id列,
Mybatis是否支持延迟加载
- Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。
Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复
- 不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;毕竟namespace不是必须的,只是最佳实践而已。原因就是namespace+id是作为Map<String, MappedStatement>的key使用的,如果没有namespace,就剩下id,那么,id重复会导致数据互相覆盖。有了namespace,自然id就可以重复,namespace不同,namespace+id自然也就不同。
如何进行批处理
- 使用BatchExecutor完成批处理。
Mybatis都有哪些Executor执行器?它们之间的区别是什么
Mybatis有三种基本的Executor执行器,SimpleExecutor、ReuseExecutor、BatchExecutor。
SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map<String, Statement>内,供下一次使用。简言之,就是重复使用Statement对象。
批处理
Mybatis中如何指定使用哪一种Executor执行器
- 在Mybatis配置文件中,可以指定默认的ExecutorType执行器类型,也可以手动给DefaultSqlSessionFactory的创建SqlSession的方法传递ExecutorType类型参数。
Mybatis映射文件中,如果A标签通过include引用了B标签的内容,位置问题
- 被引用的B标签依然可以定义在任何地方,Mybatis都可以正确识别。在访问A标签时会标记B标签,然后等全部标签解析完毕会再一次重新解析标记的标签
为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里
- Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。
如何获取自动生成的(主)键值
- 配置文件设置
usegeneratedkeys
为true
- 配置文件设置
在mapper中如何传递多个参数
直接在方法中传递参数,xml文件用#{0} #{1}来获取
使用 @param 注解:这样可以直接在xml文件中通过#{name}来获取
Mybatis对象关联实例:
在单表查询中,属性名和数据库相同的字段可以省略,多表不可省略,省略则为空
// 一对一
<resultMap type="Orders" id="orders">
<result column="id" property="id"/> <association property="user" javaType="User">
//关联另一张表
<id column="id" property="id"/> // id
<result column="name" property="name"></result> // 属性 即查询出来显示的名字
</association>
</resultMap> <select id="onemany" resultMap="orders">
select u.id ,o.number,o.dic,u.name from orders o left JOIN user u on o.user_id=u.id
</select>
// 一对多
<resultMap type="User" id="user">
<id column="id" property="id"/>
<result column="name" property="name"/>
<!-- 一对多 -->
<collection property="list2" ofType="Orders"> // ofType : 每个属性的类型
<id column="oid" property="id"/> //需要设置id,如果两个对象属性相同,则会视为一条记录
<result column="number" property="number"/>
</collection>
</resultMap>
<select id="selectUserList" resultMap="user">
select u.id,o.id as oid,o.number,o.dic,u.name from user u left JOIN orders o on o.user_id=u.id
</select>
resultType resultMap的区别
类的名字和数据库相同时,可以直接设置resultType参数为Pojo类
若不同,需要设置resultMap 将结果名字和Pojo名字进行转换,
Map 直接#{key}就可以取得对应的值
最新文章
- asp.net mvc4 添加分区出现错误 找到多个与名为“home”的控制器匹配的类型
- 用C#实现封装
- LeetCode&mdash;&mdash;Best Time to Buy and Sell Stock I (股票买卖时机问题1)
- OCJP(1Z0-851) 模拟题分析(九)over
- [示例]NSDictionary编程题-字典的排序应用(iOS5班)
- js date string parse
- CentOS 安装 gcc
- IP路由协议简析
- 快速集成图片浏览器快速集成图片浏览器->;MJPhotoBrowser的使用
- Android之Http通信——3.Android HTTP请求方式:HttpURLConnection
- 【Android进阶】Android面试题目整理与讲解(一)
- SDUT 2498-AOE网上的关键路径(spfa+字典序路径)
- 《HelloGitHub月刊》第10期
- PHP接入芝麻信用续。
- C#中windows服务安装方法
- 简单使用Mysql-Cluster-7.5搭建数据库集群
- [SCOI 2012]滑雪与时间胶囊
- 再遇angular(angular4项目实战指南)
- PS抠图简单粗暴2种方法
- 【jpa】spring data jpa 配置使用
热门文章
- The model backing has changed
- Python自学笔记-递归函数(来自廖雪峰的官网Python3)
- java web jsp原理图 ,静态包含,动态包含,out与response.getWrite()
- 比较两个文件不同以及生成SQL插入语句
- Oracle_11gR2_概念_第06章_数据字典和动态性能视图_英文词汇
- ABAP POH和POV事件中 获得屏幕字段的值
- 如何开发webpack plugin
- wpf C# 数据库 c/s 个人信息管理 wpf局域网通信
- 张高兴的 Xamarin.Android 学习笔记:(四)常用控件
- Android基础知识04—Activity活动之间传递数据