Mybatis核心面试技术(持续更新)
Posted 醉酒的小男人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis核心面试技术(持续更新)相关的知识,希望对你有一定的参考价值。
MyBatis中#{}和${}的区别
#{}是预编译处理,${}是字符替换。在使用#{}时,MyBatis会将SQL中的#{}替换成?配合PreparedStatement的set方法赋值,这样可以有效的防止SQL注入,保证程序的运行安全。
Mybatis的foreach支持的数据类型
foreach一共有三种类型,分别为List,[](array),Map三种
参数传递方式
匿名传递
List<Employee> selectByGenderAndAge(Short gender,String age );
匿名参数只能使用arg1,arg0,param1,param2类似的形式这种传参方式的缺点是不够灵活,必须严格按照参数顺序来引用
<select id="selectByGenderAndAge" resultMap="BaseResultMap" >
select * from employee where gender = #{param1} and age = #{param2}
</select>
@Param注解
List<Employee> selectByGenderAndAge( @Param("gender") Short gender,@Param("age") String age );
<select id="selectByGenderAndAge" resultMap="BaseResultMap" > select * from employee where gender = #{gender} and age = #{age} </select>
Map传递参数
List<Employee> selectByMapParams(Map params);
<select id="selectByMapParams" resultMap="BaseResultMap" parameterType="map">
select * from employee where gender = #{gender} and age = #{age}
</select>
java bean传递多个参数
List <Employee> selectByBeans(Employee employee);
<select id="selectByBeans" resultMap="BaseResultMap" parameterType="com.wg.demo.po.Employee">
select
*
from employee where gender = #{gender} and age = #{age}
</select>
使用JSON传递参数
List <Employee> findByJSONObject(JSONObject params);
<select id="findByJSONObject" resultMap="BaseResultMap" parameterType="com.alibaba.fastjson.JSONObject">
select
*
from employee where gender = #{gender} and age = #{age}
</select>
传递集合类型参数List、Set、Array
List <Employee> findByList(List list);
<select id="findByList" resultMap="BaseResultMap" >
SELECT * from employee where age in
<foreach collection="list" open="(" separator="," close=")" item="age">
#{age}
</foreach>
</select>
参数类型为对象+集合
@Data
public class Department {
private Long id;private String deptName;
private String descr;
private Date createTime;
List<Employee> employees;
}
List <Employee> findByDepartment(@Param("department")Department department);
<select id="findByDepartment" resultMap="BaseResultMap" parameterType="com.wg.demo.po.Department">
SELECT * from employee where dept_id =#{department.id} and age in
<foreach collection="department.employees" open="(" separator="," close=")" item="employee">
#{employee.age}
</foreach>
</select>
核心对象的生命周期
SqlSessionFactoryBuilder:方法作用域
SqlSessionFactory:应用作用域
SqlSession:请求或方法作用域
Mapper:方法
什么是Mybatis
MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。Mybatis可以使用简单的XML或注解来配置和映射原生类型、接口和Java的POJO为数据库中的记录。
动态标签
if、choose(when/otherwise)、trim(where/set)、foreach
mappers指定路径方式,优先级是什么
resource/url/class/package,package是在第一个
mybatis的执行器
SimpleExecutor:每次都会重新创建Statement对象
ReuseExecutor:重复使用Statement对象
BatchExecutor:批量处理
Mybatis分页
分页方式:逻辑分页和物理分页
逻辑分页:使用MyBatis自带的RowBounds进行分页,它是一次性查询很多数据,然后在数据中再进行检索
物理分页:自己手写SQL分页或使用分页插件PageHelper,去数据库查询指定条数的分页数据的形式
MyBatis是否支持延迟加载和延迟加载的原理
1.MyBatis支持延迟加载,设置lazyLoadingEnabled=true即可
2.延迟加载的原理的是调用的时候触发加载,而不是在初始化的时候就加载信息
以上是关于Mybatis核心面试技术(持续更新)的主要内容,如果未能解决你的问题,请参考以下文章