Mybatis小结
实体类属性名和数据库的列表名不一致,不能自动封装数据
起别名: 在SQL语句中,对不一样的列名器别名,别名和实体类属性名一样
- 可以定义片段,提升复用性,但是不便于开发,当新增列名时,要改动代码较多
普通版的起别名:
<select id="selectAll" resultType="brand">
select
id, brand_name as brandName, company_name as companyName, ordered, description, status
from tb_brand;
</select>
进阶版的起别名(提取共同的sql片段):
<sql id="brand_column">
id, brand_name as brandName, company_name as companyName, ordered, description, status
</sql>
在原sql语句中进行引用,如下:
使用include标签引用上述的sql片段,而refid指定上述sql片段的id值,如下:
<select id="selectAll" resultType="brand">
select
<include refid="brand_column" />
from tb_brand;
</select>
其次还可以通过resultMap来解决上述问题
resultMap:定义完成不一致的属性名和列名的映射
我们在查询映射配置文件mapper.xml中书写如下:
resultMap id="brandResultMap" type="brand">
<!--
id:完成主键字段的映射
column:表的列名
property:实体类的属性名
result:完成一般字段的映射
column:表的列名
property:实体类的属性名
-->
<result column="brand_name" property="brandName"/>
<result column="company_name" property="companyName"/>
</resultMap>
我们只需要配置不同类名和属性名的映射关系,相同名的则不需要配置
参数占位符的解释(#{},${}):
mybatis提供了两种参数占位符:
-
#{} :执行SQL时,会将 #{} 占位符替换为?,将来自动设置参数值。从上述例子可以看出使用#{} 底层使用的是
PreparedStatement
-
${} :拼接SQL。底层使用的是
Statement
,会存在SQL注入问题。如下图将 映射配置文件中的 #{} 替换成 ${} 来看效果 -
参数占位符:
1. #{}:会将其替换为 ?,为了防止SQL注入
2. KaTeX parse error: Expected 'EOF', got '#' at position 63: … * 参数传递的时候:#̲{} …{} 会存在SQL注入问题* 参数类型:parameterType:可以省略 * 特殊字符处理: 1. 转义字符:当表示id<3时书写为id < #{id};(不然直接使用<号会报错) 2. CDATA区:<![CDATA[内容]]> 这里就可以直接在内容区添加<号。