什么是MyBatis?
mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
#{}和${}的区别是什么?
(1) 1)#{} 为参数占位符 ?,即sql 预编译
2)${} 为字符串替换,即 sql 拼接
(2) 1)#{}:#{}是经过预编译的,是安全的, 能防止sql 注入。
2){}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入**。
在mapper中如何传递多个参数,都有哪几种
方法1:顺序传参法 #{}`里面的数字代表你传入参数的顺序。
方法2:@Param注解传参法 #{}
里面的名称对应的是注解
@Param`括号里面修饰的名称。方法3:Map传参法 #{}
里面的名称对应的是
Map`里面的key名称。方法4:Java Bean传参法 #{}
里面的名称对应的是
User`类里面的成员属性。说出MyBatis动态标签(至少5个)
1.if(用于之后作为条件判断,用于更新的操作)
2.choose(when,otherwise)(类似于我们Java中的switch语句)
trim(where,set)
4.foreach(多用于批量操作)
5.set
parameterType和resultType的区别
resultType: 主要针对于从数据库中提取相应的数据出来
parameterType:通过parameterType传入简单类型或对象
在用MyBatis插入时,如何得到数据库自增的主键值?
keyProperty :返回的主键值赋给哪个属性
useGeneratedKeys: 是否自动生成主键,默认false
主键自动生成,取决于数据库是否支持自增主键。实际上当设置了useGeneratedKeys=“true”,Mybatis会调用JDBC的getGeneratedKeys方法,并将获取的主键值赋值给keyProperty 指定的属性。
MyBatis批量删除时,请问如何实现?
<delete id="batchDeleteUsers"> DELETE FROM user WHERE user_id IN <foreach collection="list" item="id" open="(" separator="," close=")"> #{id} </foreach> </delete>
MyBatis批量添加时,请问如何实现?
<insert id="batchAddUser" parameterType="user"> INSERT INTO user(user_name,create_time) VALUES <foreach collection="users" item="item" separator="," > (#{item.userName},#{item.createTime}) </foreach> </insert>
JDBC为什么比Mybatis效率快?
MyBaties 也是基于JDBC的。Java与数据库操作仅能通过JDBC完成。MyBaties也要通过JDBC完成数据查询、更新这些动作。MyBaties 仅仅是在JDBC基础上做了,OO化、封装事务管理接口这些东西。
反射相对而言是比较影响性能
MyBatis框架中用到了哪些设计模式?(3个)
- Builder模式 : 例如 SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder;
- 工厂模式 : 例如SqlSessionFactory、ObjectFactory、MapperProxyFactory;
- 单例模式 :例如ErrorContext和LogFactory;
- 代理模式 :Mybatis实现的核心,比如MapperProxy、ConnectionLogger,用的jdk的动态代理;还有executor.loader包使用了cglib或者javassist达到延迟加载的效果;
- 组合模式 :例如SqlNode和各个子类ChooseSqlNode等;
- 模板方法模式 : 例如BaseExecutor和SimpleExecutor,还有BaseTypeHandler和所有的子类例如IntegerTypeHandler;
- 适配器模式 : 例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现;
- 装饰者模式 : 例如cache包中的cache.decorators子包中等各个装饰者的实现;
- 迭代器模式 : 例如迭代器模式PropertyTokenizer;