1)Mybaits是什么?
Mybaits是一款优秀的持久层架构,一个半ORM(对象关系映射)框架,它支持定制化SQL,存储过程以及高级映射,Mybatis避免了所有JDBC代码和手动设置参数以及获取结果集,Mybatis可以使用简单的XML和注解配置和映射原生类型、接口和JAVA的POJO(Plain Old Java Objects,普通老式对象)为数据库中的记录。
2)ORM是什么?
ORM(Object Retational Mapping) 对象关系映射,为了解决关系型数据库和简单Java对象(POJO)映射关系的技术。
ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系型数据库中。
3)Mybatis 和 Hibernate 的区别?
相同点:都是对jdbc的封装,都是持久层框架,都基于dao层开发 。
不同点:
映射关系:
Hibernate是全自动ORM映射工具,使用Hibernate查询关联对象或关联集合对象时,可以通过对象关系模型直接获取。
Mybatis查询关联对象或关联集合对象时,通过手动编写SQL完成。
SQL优化和移植性:
Hiberdate对SQL语句封装,提供了日志、缓存、级联等特性,提供HQL操作数据库,数据库无关性支持好,但会消耗性能,代码开发量少,但SQL语句优化比较困难。
Mybatis手动编写SQL,支持动态SQL ,动态生成表名,支持存储过程,但开发工作量大,直接一用SQL支持数据库,不支持数据库无关性,但SQL优化比较容易。
开发难易程度和学习成本:
Hibernate重量级框架,学习使用门槛高,适合于需求相对稳定,中小型项目,比如办公自动化系统,
Mybatis轻量级框架,学习使用门槛低,适合于需求变化频繁,大型项目,比如:电子商务系统。
4)Mybatis编程步骤是什么样的?
1 创建SqlSessionFactory
2 通过SqlSessionFactory 创建SqlSession。
3 通过Sqlsession执行数据操作。
4 调用session.commit()提交事务。
5 调用session.close() 关闭会话。
5)#{}和${}区别:
#{}是占位符,预编译处理,${}是拼接符,字符串替换
#{}有效防止SQL注入,提高系统安全性,${}不能防止SQL注入
#{}传入参数是以字符串传入,会将SQL中的#{}替换成?号,调用preparedStatement的set方法赋值。
${}原值传入,把{}替换成变量的值,相当于jdbc的Statement编译。
变量替换后,#{}对应的变量自动加上单引号'',${}对应的变量不会自动加上单引号''.
#{}的变量替换是在BDMS中,${}的变量替换是在BDMS外。
6)模糊查询like语句怎么写:
“%”#{value}"%" 注意:#{}解析成SQL语句,会在变量外自动加入单引号,
CONCAT('%',#{value},'%'),使用CONCAT函数。
使用bind标签
<select id="name" resultType="com.io.po.user">
<bind name="part" value=" '%' + username + '%' ">
select id name age from person where username like #{par}
</select>
7)在mapper中如何传递多个参数?
1) 使用顺序传参法
public User selectUser(String name,int id);
<select id ="selectUser" resultMap="UserResultMap">
select * from user where user_name=#{0} and id =#{1}
</select>
备注:#{}里面的数字表示传入参数的顺序。
这种方法不推荐使用,SQL层表达不直观,一旦顺序调整容易出错。
2) 使用@Param注解传参法
public User selectUser(@Param("userName") String name,int @Param("deptId") depeId);
<select id="selectUser" resultMap="UserResultMap">
select * from user where user_name=#{userName} and dept_id = #{depeId}
</select>
备注:#{}里面的名称对应注解里@Param括号里修饰的名称。
参数不多的情况下推荐使用。比较直观
3)Map传参法
public User selectUser(Map<String,Object> params);
<select id="selectUser" paramterType="java.util.map" resultMap="UserResultMap">
select * from user where user_name=#{user_name} and dept_id=#{depeId}
<select>
备注:#{}里面的名称参数对应Map里面的key名称。
适合多个参数传递,参数异变能灵活传递的情况。
4) java bean 传参法
public User selectUser(User user);
<select id="selectUser" paramterType="com.io.po.User" resultMap="UserResultMap">
select * from user where user_name =#{username} and dept_id =#{deptId}
</select>
备注: #{}里面的名称对应的是User类里面的成员属性。
这种方法直观,需要建一个实体类,扩展不容易,需要加属性,但代码可读性强,业务逻辑处理方便,推荐使用。
8)Mybatis如何进行批量操作?
使用foreach标签
foreach主要用在构建in条件中,在SQL语句中进行迭代一个集合,foreach标签的主要属性主要有item,index,collection,open,separator,close。
item 集合中每一个元素进行迭代的别名,随便起的变量名
inex 指定一个名字,用于在迭代过程中,每次迭代的位置,不常用
open 表示语句以什么开始,常用“(”;
separator 每次进行迭代之间以什么符合进行分隔符,常用“,”;
close 表示以什么结束,常用“)”;
collection属性指定的三种属性情况:
1)传入的是单参数且参数类型是List,collection属性值为List
2) 传入的是单参数且参数类型是array数组,collection属性值为array
3) 多参数使用map,map的key是参数名,collection属性值传入的lsit或者array对象在封装的map里的key.
具体用法如下:
<insert id="addEmp">
INSERT INTO EMP(ID ,NAME,AGE) VALUES
<foreach collection="emps" item ="emp" separator=",">
(#{emp.id},#{emp.name},#{emp.age})
<foreach>
</insert>
<insert id="addEmp">
<foreach collection="emps" item="emp" separatoe=",">
INSERT INTO EMP(ID,NAME,AGE) VALUES (#{emp.id},#{emp.name},#{emp.age})
</insert>
9)什么是Mybatis的接口绑定?有哪些实现方式?
在mybatis定义任意接口,将接口的方法与SQL语句绑定,直接调用接口方法
两种方式:
注解实现,在接口的方法上加上@select @update等注解,里面包含SQL绑定
通过XML写SQL绑定,指定XML映射文件的namespace必须为接口的全路径名。
10)Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?
如果配置了namespace,id可重复,么有配置的话,id不能重复,namespace只是最佳实践
11)Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?
<resultMap>,<parameterMap>,<sql>,<include>,<selectKey>
12)MyBatis实现一对一,一对多有几种方式,怎么操作的?
联合查询:多表联合查询,只查询一次,通过在resultMap里的association ,collection配置一对一,一对多的类就可以完成。
嵌套查询:先查一个表,根据这个表得结果得外键ID,去另一个表查询数据,也是通过配置association ,collection,但另外一张表得查询通过select节点配置。
13)简述Mybatis的插件运行原理,以及如何编写一个插件?
原理:Mybatis仅可以编写针ParameterrHandler,ResultSetHandler,StatementHandler.Executor,4种接口插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,只会拦截那些你指定需要拦截的方法。
2.在配置文件中写入plugins标签
<plugins> <plugin interceptor="city.albert.TestInterceptor"> <property name="name" value="name"/> </plugin> </plugins>
14)Mybatis的一级二级缓存
- 一级缓存默认开启,查询时先从缓存中查询,缓存中没有对应数据时再进行数据库查询。
- 二级缓存即查询缓存,他的作用于是mapper和namespace,二级缓存可以跨SqlSession