#{}与${}的区别
#{}:预编译处理,将SQL语句中的#{}替换为?占位符,类似preparedStatement,可以防止SQL注入。
${}:为字符串拼接,类似statement,存在SQL注入风险
多个参数传参:
方法1: 不建议
语句中不写parameterType,通过#{arg0}、#{arg1}...或#{param1}、#{param2}...顺序传参,自动识别参数类型
//例1
//接口中
int updateById(int id, String nickname);
update t_user set nickname = #{param1} where id = #{param2}
方法2: 建议
使用注解方式
//例2
//接口中
int updateById(@Param("id") int id, @Param("nickname") String nickname);
update t_user set nickname = #{nickname} where id = #{id}
parameterType:
指定传参参数类型
范围:基本类型、引用类型、实体类类型
实体类需要配置别名使用
resultType:
指定结果集的类型
范围:基本类型和实体类类型
实体类需要配置别名使用,实体类中的属性名名称必须和查询语句中的列名保持一致
resultMap:
通过resultMap,可以指定查询结果字段和实体属性字段的映射关系
子标签:
id:用于设置主键字段
result:用于设置普通字段的映射关系
标签内属性:
property:映射的属性名称
column:数据表的列名或者标签别名
动态SQL:
if:判断
where:
去掉第一个and 1=1
后面为空时,去掉where
set:
去掉了最后一个,号
问题:后面为空时,去掉了set,sql语句会报错
foreach:
collection:需要遍历的数组或集合
item:每一项的形参名
index:每一项的索引名
open:开始符号
close:关闭符号
separtor:分隔符
联查: 1对1:
使用select
property配置了实体类对应的属性
column配置了关联字段
select对应了相关的的查询语句
直接进行联查,在association中配置映射字段
select * from t_address left join t_user tu on tu.id = t_address.user_id where t_address.id = #{id}
automapping自动匹配
嵌套的resultType
select t_address.id,
addr,
phone,
postcode,
user_id,
username,
password,
nickname,
age,
sex,
school_name
from t_address
left join t_user tu on tu.id = t_address.user_id
where t_address.id = #{id}



