文章目录
select – 映射查询语句。
<select id="selectPerson" parameterType="int" resultType="hashmap">
SELECT * FROM PERSON WHERE ID = #{id}
</select>
cache – 该命名空间的缓存配置。
cache-ref – 引用其它命名空间的缓存配置。
resultMap – 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
parameterMap – 老式风格的参数映射。此元素已被废弃,并可能在将来被移除!请使用行内参数映射。文档中不会介绍此元素。
sql – 可被其它语句引用的可重用语句块
就是sql代码段,可以被include标签的refid属性引用。include标签里面是可以定义参数的。
直接写死,不定义参数(属性):
<!-- sql代码段,不适用参数 -->
<sql id="userColumns"> t.id, t.username,t.password </sql>
<!-- include标签中 refid引用sql代码段 -->
<select id="selectUsers" resultType="map">
select
<include refid="userColumns"></include>
from t_user t
</select>
定义参数(属性),include标签里面用property标签的 name,value 来定义:
<!-- sql片段,可以使用参数 -->
<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>
<!-- include标签中 refid引用sql代码段 -->
<select id="selectUsers" resultType="map">
select
<include refid="userColumns"><property name="alias" value="t"/></include>
from t_user t
</select>
include是可以嵌套的。
也可以在 include 元素的 refid 属性或内部语句中使用属性值,例如:
<sql id="sometable">
${prefix}Table
</sql>
<sql id="someinclude">
from
<include refid="${include_target}"/>
</sql>
<select id="select" resultType="map">
select
field1, field2, field3
<include refid="someinclude">
<property name="prefix" value="Some"/>
<property name="include_target" value="sometable"/>
</include>
</select>
参数
主要就2种 #{} 和 ${}
#{} 会预编译,传入的结果仅当做字符串。这样安全,快速,一般首推这种写法。
但是有个不足,我想根据传入的列名动态排序, 如username字段:
如果用 order by #{columnName} 解析出来是 order by ‘username’ ,这样是不对的。
所以要用 order by ${columnName} ,这样可以实现动态生成,但是有被sql注入攻击的可能,建议代码中对入参作校验。
insert – 映射插入语句。
update – 映射更新语句。
delete – 映射删除语句。
其他
resultType和resultMap有什么区别
都会进行结果映射。resultType也会自动映射,但是如果属性名和列名不一致,需要手动as。 resultMap定义了映射列表,使开发者可以只关注sql字段。
resultType例子:
<select id="selectUsers" resultType="User">
select
id as "id",
username as "username",
create_date as "createDate"
from t_user
where id = #{id}
</select>
resultMap例子:
<!-- 定义resultMap -->
<resultMap id="userResultMap" type="User">
<id property="id" column="id" />
<result property="username" column="username"/>
<result property="createDate" column="create_date"/>
</resultMap>
<!-- 语句中使用resultMap -->
<select id="selectUsers" resultMap="userResultMap">
select id, username, create_date
from t_user
where id = #{id}
</select>
语句末尾不要加分号
写sql写惯了,在语句末尾加上 ; 分号 结果报错了,因为xml中的语句很有可能会和分页等语句搭配。多个分号肯定报错。
报错信息为: Cause: java.sql.SQLSyntaxErrorException: ORA-00911: invalid character
报错代码例子如下:
SELECT
TMP_PAGE.*, ROWNUM ROW_ID
FROM
(
SELECT INV_KIND AS invKind, INV_NUM AS invNum
FROM T_S_OCCUPATION_INVOICE o
WHERE o.inv_num = ? AND o.inv_kind = ? ; -- 就是这个分号引起的异常
) TMP_PAGE
官网xml映射文档:
https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#Result_Maps