编程题

  1. 创建回复表,并且模拟合适的数据
  2. 给定一个评论id,删除该评论下的所有的回复.但是要保留该评论下面的评论.
  3. 给定一个视频id,将这个视频下的所有的评论以及回复信息全部加载出来.

1发布了视频

​ 2(评论)哈哈 ,挺搞笑

​ 3-2 (评论)你笑什么

​ 4-2 (评论)你傻笑?有病?

​ 5-3(回复) 别人不能笑?

​ 2-3(回复) 笑一笑十年少

​ 5-2(回复) 他有病

​ 2-5(回复) 是的

​ 6-2(回复) 嗯嗯,笑别人,确实有毛病

解答题

  1. Mybatis有哪些Executor执行器?
1
2
3
4
5
6
SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map内,供下一次使用。简言之,就是重复使用Statement对象。
BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。

CachingExecutor:CachingExecutor是一个Executor接口的装饰器,它为Executor对象增加了二级缓存的相关功能,委托的执行器对象可以是SimpleExecutor、ReuseExecutor、BatchExecutor中任一一个。执行 update 方法前判断是否清空二级缓存;执行 query 方法前先在二级缓存中查询,命中失败再通过被代理类查询。

  1. Mybatis是如何进行分页的?分页插件的原理是什么?
1
Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页。可以在 sql 内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。分页插件的基本原理是使用 Mybatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写 sql,根据 dialect 方言,添加对应的物理分页语句和物理分页参数
  1. mybatis优缺点
1
2
3
4
5
6
7
8
1.简单易学,容易上手(相比较于hibernate),基于sql编程。
2.JDBC相比减少50%以上的代码量,不需要手动开启连接。
3.与各种数据库兼容。(因为他与JDBC连接数据库)。
4.提供了许多第三方插件。(分页插件,逆向工程)。
5.能够与spring很好的集成。
6.mybatis相当灵活,不会对现有程序影响,sql写在XML中,从程序代码中彻底分离出来,解除了sql与程序耦合,重用
7.提供XML标签,支持编写sql语句。
8.提供映射标签,支持对象与数据库的orm字段关系映射
  1. $和#区别

    1
    2
    3
    4
    5
    相同点:
    都能取到变量的值。
    不同点:
    #可以实现预编译,会先把#{变量}编译成?,在执行时再取值,可以防止sql注入。
    $是直接进行字符串替换。
  2. Mybatis动态sql有什么用?执行原理?有哪些动态sql?

1
2
3
4
5
1、Mybatis 动态 sql 可以让我们在 Xml 映射文件内,以标签的形式编写动态 sql,完成逻辑判断和动态拼接 sql 的功能。

2、Mybatis 提 供 了 9 种 动 态 sql 标 签 : trim|where|set|foreach|if|choose|when|otherwise|bind。

3、其执行原理为,使用 OGNL 从 sql 参数对象中计算表达式的值,根据表达式的值动态拼接 sql,以此来完成动态 sql 的功能。
  1. resultType和resultMap区别
1
2
3
4
5
6
7
8
9
10
11
12
resultmap与resulttype的区别为:对象不同、描述不同、类型适用不同
一、对象不同
1、resultmap:resultMap如果查bai询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
2、resulttype:resultType使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
二、描述不同
1、resultmap:resultMap对于一对一表连接的处理方式通常为在主表的pojo中添加嵌套另一个表的pojo,然后在mapper.xml中采用association节点元素进行对另一个表的连接处理。
2、resulttype:resultType无法查询结果映射到pojo对象的pojo属性中,根据对结构集查询遍历的需要选择使用resultType还是resultMap。
三、类型适用不同
1、resultmap:mybatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap。
2、resulttype:resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。
如果你要用resulttype返回一个复杂对象的话,就必须返回这个对象的所有属性

  1. Mybatis是否支持延迟加载? 如果支持它的原理是什么?
1
2
3
Mybatis 仅支持 association 关联对象和 collection 关联集合对象的延迟加载,association 指的就是一对一,collection 指的就是一对多查询。在 Mybatis配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false。它的原理是,使用 CGLIB 创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用 a.getB().getName(),拦截器 invoke()方法发现 a.getB()是null 值,那么就会单独发送事先保存好的查询关联 B 对象的 sql,把 B 查询上来,然后调用 a.setB(b),于是 a 的对象 b 属性就有值了,接着完成 a.getB().getName()方法的调用。这就是延迟加载的基本原理。
当然了,不光是 Mybatis,几乎所有的包括 Hibernate,支持延迟加载的原理都
是一样的。
  1. 什么是ORM

    1
    2
    3
    ORM是一种思想,ORM (全称为 :Object Relative Mapping)对象-关系映射

    ,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
  2. 当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

1
2
第 1 种: 通过在查询的 sql 语句中定义字段名的别名,让字段名的别名和实体类 的属性名一致。
第 2 种: 通过来映射字段名和实体类属性名的一一对应的关系。
  1. 如何获取自动生成的(主)键值?

    1
    2
    3
    4
    5
    6
    在<insert>标签中使用 useGeneratedKeys   和  keyProperty 两个属性来获取自动生成的主键值。
    示例:
    <insert id=”insertname” usegeneratedkeys=”true” keyproperty=”id”>
    insert into names (name) values (#{name})
    </insert>