小标题:#{}和${}的区别
底层 类型转换 单个简单类型参数 sql注入
#{} PreparedStatement 转换 #{随便} 防止
在使用#{}时,在预编译阶段不会直接拼接参数值,而是使用问号?
作为占位符,之后通过PreparedStatement
的set
方法来赋值
底层 类型转换 单个简单类型参数 sql注入
${} Statement 不转换 ${value} 不防止
而在使用${}时,会进行字符串替换,直接将变量的值拼接到SQL语句中,这可能导致SQL注入的安全风险,因为它不经过预编译处理.
一、Mybatis主键回填
为什么要主键回填?
主键回填是ORM框架(如MyBatis)中的一项功能,它在数据库插入操作后,自动获取数据库生成的主键值(尤其适用于自增主键),并填充到实体对象中相应的属性,帮助开发者在插入新记录后立即获取并使用主键值,简化了代码并增强了数据操作的效率和安全性。
方式一:
使用selectkey标签, order选项中选择"AFTER",意为:插入后再回填,然后在keyProperty中填入"id" 即对象的属性名 ,而resultType中填入返回值类型 如:"java.lang.Integer"
方式二:
在使用insert标签时,在useGeneratedKeys中选择:"true",意为是否主键回填,true回填;然后在keyProperty中填入"id" 即对象的属性名。
二、Mybatis的映射
MyBatis只能自动维护库表”列名“与”属性名“相同时的对应关系,二者不同时无法自动ORM
就好像你在user类中起的名叫username,但数据库表中的是user_name,这就无法自动映射了。
字段起别名
在查询时,在各项后面加上与表列名一样的别名:
但这也有个弊端,如果列名过多,怎么办?
所以,我们还有另一种方法:
结果映射(resultMap):
这种方法是单独在resultmap标签下,将别名统一处理。
使用`ResultMap`标签手动映射,解决实体字段和数据表字段不一致的问题
三、Mybatis的类别名
mybatis批量引入mapper.xml
我们一般会把数据库配置信息定义在一个独立的配置文件里面,比如db.properties:
然后在SqlMapConfig.xml引入数据库配置信息:
mybatis定义的别名:
查看mybatis源码可以看到 Mybatis 默认支持的别名
四类八种写基本类型 String小写 集合统统写接口
自定义别名:
<typeAliases>
<!--批量定义别名-->
<package name="com.jy.pojo"/>
</typeAliases>
使用别名