Mybatis 总结及常见面试题

本文详细介绍了Mybatis的主要特性,包括获取主键值、参数传递方式、动态SQL和常见面试题。重点讲解了传参数的多种方式,如#{参数}、命名参数、POJO、Map和TO的使用场景。同时,解释了#{}与${}的区别,并探讨了resultType和resultMap、association和collection的配置。此外,还讨论了Mybatis的动态SQL标签及其执行原理,以及如何处理主键和多个参数。最后,文章列举并解答了一些Mybatis的面试题目,涵盖了标签使用、动态SQL、接口绑定和分页等核心概念。
摘要由CSDN通过智能技术生成

Mybatis 总结及常见面试题

mybatis获取主键值

  1. id自增的数据库 :

useGeneratedKeys="true"

keyProperty=“id”

<insert id="addEmp" useGenerateKeys="true" keyProperty="id" databaseId="mysql">
	insert into tb_employee()
</insert>
  1. 不支持id自增的数据库:

selectKey 标签

<insert id="addEmp" databaseId="oracle">
    <!--
 		order: 两个值,before(之前)和after(之后),表示在什么之前或之后执行
		resultType:返回值的数据类型
	
	before运行顺序:
		先运行selectKey查询id的sql,查出id值封装给JavaBean的id属性
		在运行插入的sql,就可以取出id属性对应的值
	after运行顺序:(了解),存在问题
		先运行插入的sql(从序列中取出新值作为id)
		再运行selectKey查询id的sql
	-->
	<selectKey keyProperty="id" order="BEFORE" resultType="Integer">
    	
		select emp_seq.nextval from dual
		
        <!-- AFTER
        select emp_seq.currval from dual
		-->
    </selectKey>
    
    
    insert into employees(emp_id, last_name, email)
    values (#{id}, #{lastName}, #{email})
	
    <!-- AFTER
    insert into employees(emp_id, last_name, email)
    values (emp_seq.nextval, #{lastName}, #{email})
-->
</insert>

传参数

单个参数:不会做任何处理

​ #{参数} ,取出参数值

多个参数:会做特殊处理

​ 多个参数会被封装成一个map

​ key:param1 … paramN,或者参数的索引

​ value: 传入的参数值

​ #{}是从map中获取指定的key的值

命名参数:明确指定封装参数时map的key @Param(“id”)

​ 多个参数会被封装成一个map

​ key:使用@Param注解指定的值

​ value:参数值

​ #{指定的key} 取出对应的参数

POJO

​ 如果多个参数正好是业务逻辑的数据模型,可以直接使用pojo

​ #{属性名} 取出传入的pojo的属性值

Map

​ 如果多个参数不是业务模型中的数据,没有对应的pojo,不经常使用,为了方便,也可以传入map

​ #{key} 取出map中对应的值

TO

​ 如果多个参数不是业务模型中的数据,但经常要使用,可以编写一个TO(Transfer, Object) 数据传输对象

注意

​ 如果是Collection(List、Set)类型或者是数组,也会特殊处理;也会把传入的list或者数组封装在map中。

​ key:Collection(collection),如果是list还可以使用这个key(list)

​ 取值:#{list[0]}

#{} 与 ${} 的区别

​ #{}:是以预编译的形式,将参数设置到sql语句中,PreparedStatement,防止sql注入

​ ${}:取出的值直接拼接在sql语句中,会有安全问题

​ 大多数情况是使用#{}

​ 原生jdbc不支持占位符的地方就可以使用${}进行取值,比如分表、排序等,按照年份分表拆分

select * from ${
  year}_salary where ....
select * from tb_employee order by ${name} ${
  order}

resultType resultMap

association 一对一

<resultMap type="com.zhush.blog.entities.Employee" id="MyDifEmp">
	<id column
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值