- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
-
什么是MyBatis?
MyBatis是一个实现了JPA规范的用来连接数据库并对其进行增删改查操作的开源框架 (就和传统的JDBC一样,就是个连接数据库的东西),其实,它底层就是一个JDBC封装的组件。 复制代码
-
#{}和${}的区别是什么? 应用场景
#{}是预编译处理,${}是字符串替换。 Mybatis在处理#{}时,会将sql中的#{}替换为?号, 调用PreparedStatement的set方法来赋值; Mybatis在处理${}时,就是把${}替换成变量的值。 使用#{}可以有效的防止SQL注入,提高系统安全性。 复制代码
-
在mapper中如何传递多个参数,都有哪几种
方法1:顺序传参法 #{}里面的数字代表你传入参数的顺序 方法2:@Param注解传参法 #{}里面的名称对应的是注解 @Param括号里面修饰的名称 方法3:Map传参法 #{}里面的名称对应的是 Map里面的key名称。 方法4:Java Bean传参法 #{}里面的名称对应的是 User类里面的成员属性。 复制代码
-
说出MyBatis动态标签(至少5个)
1,用来循环容器的标签foreach 2,concat模糊查詢 3,choose(when,otherwise)标签 4,selectKey标签 5,if标签 复制代码
-
parameterType和resultType的区别
1、使用 resultType :主要针对于从数据库中提取相应的数据出来 2、使用parameterType :主要针对于将信息存入到数据库中 如: insert 增加数据到数据库zhong Update等 复制代码
-
在用MyBatis插入时,如何得到数据库自增的主键值?
1.在insert标签中使用 useGeneratedKeys、keyProperty、keyColumn 属性获取; 2.在insert标签中嵌套 selectKey 标签获取。 复制代码
-
MyBatis批量删除/添加时,代码实现
删除 delete from emp where empno in #{arr} 插入 INSERT INTO 表名 ( 列名1, 列名2, 列名3) VALUES ( #{内容1}, #{内容1}, #{内容1}) 复制代码
-
MyBatis动态SQL执行流程和原理
1、获取sqlSessionFactory对象: 根据配置文件(全局,sql映射)初始化出Configuration对象 解析文件的每一个信息保存在Configuration中,返回包含Configuration的DefaultSqlSession; 注意:MappedStatement:代表一个增删改查的详细信息 2、获取sqlSession对象 返回一个DefaultSQlSession对象,包含Executor和Configuration; 这一步会创建Executor对象; Executor(根据全局配置文件中的defaultExecutorType创建出对应的Executor) 3、获取接口的代理对象(MapperProxy) DefaultSqlSession.getMapper():拿到Mapper接口对应的MapperProxy; 使用MapperProxyFactory创建一个MapperProxy的代理对象 代理对象里面包含了,DefaultSqlSession(Executor) 4、执行增删改查方法 1)调用DefaultSqlSession的增删改查(Executor); 2)会创建一个StatementHandler对象。 (同时也会创建出ParameterHandler和ResultSetHandler) 3)调用StatementHandler预编译参数以及设置参数值; 使用ParameterHandler来给sql设置参数 4)调用StatementHandler的增删改查方法; 5)ResultSetHandler封装结果 复制代码
JDBC和Mybatis性能效率哪个块?为什么
jdbc快
1. jdbc直接是在java中写sql语句,不需要配置xml文件
2. mybatis是在jdbc上进一步封装得,需要去映射和加载配置文件,所以jdbc比mybatis效率快
复制代码
MyBatis框架中用到了哪些设计模式?
1. 工厂模式:例如sqlSessionFactory
2. 代理模式:mybatis实现的核心,比如
MapperProxy用的jdk的动态代理
3. 模板方法模式: 例如BaseExecutor和SimpleExecutor
复制代码
-
MyBatis 一级缓存和二级缓存的区别
一级缓存:
Mybatis 默认只是开启一级缓存,一级缓存只是相对于同一个 SqlSession 而言。
只有在参数和SQL完全一样的情况下,并且使用同一个 SqlSession 的情况下,Mybatis 才会将第一次的查询结果缓存起来,后续同一个SqlSession的再查询,就会命中缓存,而不是去直接查库二级缓存:
一级缓存对于使用不同的 SqlSession 并不会命中缓存,即一级缓存必须 SqlSession,参数与Sql必须完全一致
二级缓存需要手动配置,使得缓存在SqlSessionFactory层面上能够提供给各个Sql Session 共享
二级缓存能够对同样参数,同样Sql语句,当时不同 SqlSession的查询提供命中
近期评论