1、使用注解定义增删改查,分别用什么注解实现?
@Insert | 增 |
@Delete | 删 |
@update | 改 |
@Select | 查 |
2、被@Select,@Update,@Delete,@Insert 注解的方法,要放在哪里?
放在mapper接口定义的方法上 用来编写sql语句
3、在新增数据时,如果想要让id回存到对象中怎么办?
@Options(keyProperty = "id", useGeneratedKeys = true)
4、如果表中的字段名称和POJO中属性名称不一样,怎么去实现数据的映射?
5、#{} 和 ${} 的区别是什么?
#{}和${}的区别在于它们在动态SQL中的处理方式不同。
#{}是预编译处理,它会将参数替换成问号,并使用PreparedStatement的set方法来赋值。这样可以有效防止SQL注入,因为#{}会将参数视为整体,并给参数加上单引号。
${}是字符串替换,它会直接将参数替换成对应的值,不会进行预编译处理。这样可能会存在SQL注入的风险,因为${}不会对参数进行任何处理。
所以在使用动态SQL时,如果需要保证安全性,推荐使用#{}来处理参数。例如,在MyBatis中可以使用#{}来实现模糊查询,如在select语句中使用concat函数和like关键字来进行模糊查询。
6、接口中的方法怎么设定参数名,好让SQL语句中能够识别
如果SQL语句中有一个参数名为"ID",那么在接口中设定的参数名也应该是"ID"。这样,MySQL在词法分析阶段就能正确地将该参数识别为对应的列名。
参数名的设定应该遵循SQL语法的规范,避免使用特殊字符或关键字作为参数名,以免引起语法错误。
为了让SQL语句中能够正确识别参数,接口中的方法应该设定与SQL语句中对应部分相同的参数名。
7、动态SQL中有哪些标签,各有什么作用
标签 | 描述 |
<if> | 用于判断条件是否成立,使用test属性进行条件判断,如果为true,则拼接sql |
<where> | 在子元素有内容的情况下插入where子句,并且自动去除子句开头的and或or |
<set> | 删除额外的逗号(用在update语句中) |
<foreach> | 遍历(用在批量删除等业务) |
<sql> | 定义可以重复使用的SQL片段,减少代码的冗余 |
<include> | 通过属性refid,指定包含的sql片段 |
<foreach>属性
属性 | 描述 |
collection | 集合名称 |
item | 集合遍历出来的元素/项 |
separator | 每一次遍历使用的分隔符 |
open | 遍历开始前拼接的片段 |
close | 遍历结束后拼接的片段 |