mybatis的映射xml

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值