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核心面试技术(持续更新)的主要内容,如果未能解决你的问题,请参考以下文章

Dubbo核心面试技术(持续更新)

spring核心面试技术(持续更新)

分布式核心面试技术(持续更新)

java 核心面试题附pdf答案(最全版本持续更新)

java 核心面试题附pdf答案(最全版本持续更新)

Nginx面试题(史上最全 + 持续更新)