MyBatis

1.#{}与${}的区别

  • #{}是sql参数的占位符,所用有该符号的部分,都会被替代为?,是预编译语句。然后在sql语句执行前,会使用PrepareStatemet的set方法,找出对象对应的属性值,给?占位符设置参数值,能够很大程度防止Sql注入
  • ${}是拼接符,只能做字符串的替换,可以用于sql内部和标签属性值,属于静态文本替换,不能防止Sql注入,主要用于Sql拼接的时候
  • 预编译后,前者对应的变量被加上引号,后者对应的变量不会加引号,所以一个可以防止sql注入,一个不可以

2.xml文件中除了select、insert、delete、update之外还有什么标签

还有 sql, resultMap, parameterMap, include, selectKey这些标签
还有关于动态sql的一些标签 有where, if,when,otherwise等

3.xml映射文件都会有一个Dao接口对应,那么Dao接口的工作原理是什么

xml映射文件对应的Dao接口,就是Mapper接口,接口中无实现方法,接口的全限定名称,对应映射文件的namespace 属性,接口中的方法名,对应映射文件的MappedStatement 的id的属性。每当调用接口中的方法时,可以找到接口全限定名+方法名作为字符串key,唯一定位一个MappedStatement,就找到了xml对应的方法。

4.Dao方法里的参数不同能重载么?

不能,因为接口中每一个方法对应一个key(接口全限定名+方法名),对应一个MappedStatement,所以不能重载。

5.Dao接口的工作原理是什么

通过jdk动态代理实现的。Mybatis运行时会调用Jdk动态代理,给接口生成proxy代理对象。
当调用接口中的方法时,proxy代理对象会拦截接口中的方法,转而去执行MappedStatement对应的方法,执行对应的sql语句并返回结果

6.MyBatis如何分页?分页插件原理?

  1. 逻辑分页:Mybatis使用RowBounds对象进行分页,只针对ResultSet结果集进行分页
  2. 物理分页:在sql内存书写物理参数的分页参数

分页插件是使用Mybatis的插件接口,实现自定义插件
分页插件会拦截待执行的sql,对sql进行分页处理。

7.什么是ORM,为什么Mybatis是半自动ORM工具

ORM是 object relational mapping 对象关系映射,表示数据库与对象之间映射的元数据,将对象自动化映射到持久化数据库中
Mybatis需要自己手动写sql,所以是半自动ORM

8.jdbc的不足,Mybatis怎么补足了

1.jdbc频繁的建立连接,释放连接,资源浪费;mybatis可以用mybatis-config.xml配置数据库连接池,从而节约资源
2.sql语句不易于维护,sql语句修改,传参,变动大;mybatis让sql与java分离,更好管理和修改
3.jdbc处理结果集麻烦;mybatis会将结果集自动映射给java对象

9.Mybatis编程步骤

  1. 获取SqlSessionFactory对象
  2. 用 SqlSessionFactory创建SqlSession
  3. 用SqlSession对象执行数据库操作(sqlsession.getMapper(mapper.class) mapper.调用mapper方法)
  4. sqlsession.commit() 事务提交
  5. sqlsession.close() 关闭会话

10. Mybatis的工作原理

  1. 读取mybatis-config配置文件
  2. 加载配置文件内的映射文件
  3. 构建SqlSessionFactory对象
  4. 创建SqlSession会话对象
  5. 开始execute执行数据库操作
  6. 在executor接口执行方法有一个 MappedStatement参数,是映射信息的封装,用于存储sql语句的Id,参数等信息
  7. 根据MappedStatement映射接口和方法,输入参数映射
  8. 输入映射结果

11. Mybatis有哪些Executor

  1. SimpleExecutor :每一次 select或update都开启一个statement对象,用完就关闭
  2. ReuseExecutor :执行select或update根据sql语句作为key查找对应的statement对象,若找到就用;找不到就创建一个新的,用完不关闭,而是放在一个Map< String, statement>中供下次用
  3. BatchExecutor : 只针对update语句,将所有update语句添加到批处理,然后统一处理

12.Mybatis如何指定使用哪种Executor

  1. 在配置文件中 设置setting可以设置executor
  2. 可以给SqlSessionFactory创建SqlSession的方法传递executorTyep。如SqlSession openSession(ExecutorType execType)。

13.为什么要做预编译处理

mybatis默认情况下,都会对sql进行预编译。目的是优化sql的执行。越复杂的sql,编译的操作难度越大,预编译可以合并多次操作为一个操作,同时预编译语句对象可以重复利用。 另外预编译可以有效防止sql注入。

14.模糊查询的方式

  1. %${question}% 不推荐,有sql注入的可能
  2. “%” #{question}“%”,注意前后百分号都必须加双引号,不能是单引号
  3. CONCAT(‘%’,‘#{question}’,‘%’) CONCAT用于将字符串连接起来

15.多个参数传递的方法

  1. 顺序传参
  2. @param 传参, #{}中填写@param的名称
  3. map传参, #{}中填写 map的key
  4. java Bena传参,方法中传入对象,#{}中填写对象的成员属性

16.Mybatis如何执行分批操作

  1. 使用foreach标签(指定collection属性,item,open,separator,close)
  2. 使用Mybatis BatchExecutor
 SqlSession sqlsession=SqlSession.openSession(ExecutorType.Batch);
  1. 使用for循环insert

17.如何获取自增的主键

xml配置sql语句时,在insert标签加

<insert Id="xxx"  useGenerateKeys="true", keyProperties="xxx">

18.实体类中属性名和表中字段名不一样怎么办?

  1. 在sql语句中给字段名起别名,让别名和实体类中的名字一样
  2. 配置返回的 ResultMap。id属性映射主键;result属性映射其他字段
<id properties="xx" column="xx">
<result properties="xx" column="xx">

19.Mapper编写的方式

  1. 使用MapperFactoryBean
  • 如果mapper.xml和mapper接口不在一个目录下,需要在xml中指定mapper接口的位置
  • xml中指定接口方法的namespace
  • 最后在spring 的xml中配置MapperFactoryBean
  1. 使用mapperScanner,前两步方法相似,最后一步需要配置MapperScanner

20.什么是Mybatis的接口绑定

就是把Mapper的接口方法绑定对应的sql语句
在对应的Mapper接口上加注解 @Update, @Select等
或者在xml中配置sql语句

21.Mybatis如何将执行结果封装成对象返回的?

  1. 通过配置resultmap的 列名和对象属性之间的映射关系
  2. 使用sql别名的功能

22.若A标签通过include引用了B标签,那么是不是B必须编写在A标签前?

不是
虽然xml文件是从上往下按顺序解析的,但是当他发现A标签引用的B标签尚未解析时,Mybatis会把A标签标记为未解析的状态,当向下解析到B时,A标签就可以解析了

23.Mybatis是否可以映射Enum类

可以映射Enum类,Mybatis可以映射任何的对象到表的一列上

24.Mybatis的一级缓存和二级缓存

一级缓存:本地缓存,作用域是Session。当Session flush或close后,该Session中的所有Cache就会清空,默认打开一级缓存
二级缓存:存储作用域是Mapper(namespace),并且可以自定义存储源,默认不打开二级缓存

缓存的更新机制: 一个作用域进行了C/U/D操作后,默认该作用域下的所有select中的缓存被clear

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值