面试题首页 > Mybaits面试题

Mapper面试题

001使用 MyBatis 的 mapper 接口调用时有哪些要求?

1.Mapper接口方法名和mapper.xml中定义的每个sql的id相同;
2.Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同;
3.Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同;
4.Mapper.xml文件中的namespace即是mapper接口的类路径;

002当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

第一种:通过定义select语句中字段名的别名,让字段明的别名和实体类的属性名一致
第二种:通过ResutlMap来映射字段名和实体类属性名的一一对应的关系。

003模糊查询 like 语句该怎么写?

第 1 种:在 Java 代码中添加 sql 通配符。
<select id="selectlike">
  select * from foo where bar like #{value}
</select>
第 2 种:在 sql 语句中拼接通配符,会引起 sql 注入
<select id="selectlike">
  select * from foo where bar like "%"#{value}"%"
</select>

004MyBatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?

1)MyBatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能,MyBatis提供了9种动态sql标签 trim | where | set | foreach | if | choose | when | otherwise | bind。
2)其执行原理为,使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。

005这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦 截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回。
Dao接口里的方法,是不能重载的,因为是全限名+方法名的保存和寻找策略。

006一对一、一对多的关联查询 ?

MyBatis实现一对一、一对多关联查询一般有两种方式:
方式一:sqlMapper配置文件
一对一:在resultMap标签中使用 association 标签
一对多:在resultMap 标签中使用collection 标签
方式二:注解
一对一:在@Results 注解中的@Result注解中使用@One注解
一对多:在@Results 注解中的@Result 注解中使用@Many注解

007Mybatis 单条插入,如何返回主键?

useGeneratedKeys为true,持自动生成主键,keyProperty和keyColumn分别代表数据库记录主键字段和java对象成员属性名
dao层 修饰符 为 void,不需要返回任何

<insert id="insertEntity" parameterType="**" useGeneratedKeys="true" keyProperty="id" keyColumn="id">

008Mybatis 批量插入,如何返回主键?

//dao层 修饰符 为 void,不需要返回任何
void batchInsert(List<TAlarmChannelEntity> list);
<insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id" >
    INSERT INTO  t_alarm_channel
    (channel, silent_cycle, aggregation_mode,threshold,effective_start_time,effective_end_time,inform_obj,selected,create_time)
    VALUES
    <foreach collection="list" index="index" item="bo" separator=",">
       (
          #{bo.channel}, #{bo.silentCycle}, #{bo.aggregationMode},#{bo.threshold},#{bo.effectiveStartTime},#{bo.effectiveEndTime},#{bo.informObj},#{bo.selected},now()
       )
    </foreach>
</insert>

009ResultMap和ResultType的区别?

ResultMap是⾃⼰指定返回值与对象及与对象内部属性名和数据库列名的绑定
ResultType是直接返回值与别名库当中的java对象的映射

010在mapper中如何传递多个参数?

1,第一种:
public UserselectUser(String name,String area); 对应的 xml,#{0}代表接收的是 dao 层中的第一个参数,#{1}代表 dao 层中第二 参数,更多参数一致往后加即可。

<select id="selectUser"resultMap="BaseResultMap">
  select * from user_user_t where user_name = #{0} and user_area=#{1}
</select>

2,第二种:使用@param注解:

public interface UserMapper {
    User selectUser(@param("username") String username,
                    @param("hashedpassword") sString hashedpassword);
}

然后,就可以在 xml 像下面这样使用(推荐封装为一个 map,作为单个参数传递给mapper):

<select id="selectuser" resulttype="user">
  select id, username, hashedpassword
  from some_table
  where username = #{username} and hashedpassword = #{hashedpassword}
</select>

3、第三种:多个参数封装成 map

try {
    //映射文件的命名空间.SQL 片段的 ID,就可以调用对应的映射文件中的SQL
    //由于我们的参数超过了两个,而方法中只有一个 Object 参数收集,因此我们使用     Map 集合来装载我们的参数
    Map < String, Object > map = new HashMap();
    map.put("start", start);
    map.put("end", end);
    return sqlSession.selectList("StudentID.pagination", map);
} catch (Exception e) {
    e.printStackTrace();
    sqlSession.rollback();
    throw e;
} finally {
    MybatisUtil.closeSqlSession();
}

目录

返回顶部