mybatis

本文详细介绍了Mybatis中#和$符号的区别,以及如何利用SQL片段实现代码重用。重点讲解了SelectKey用于解决自动生成主键问题,以及动态SQL的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mybatis中#和$的区别:

1)##是将传入的数据直接解析成字符串,如: insert into ( aa) values(#id#),传入的id为100,则解析成insert into ( aa) values(”111“),可以起到防止sql注入。

$是将传入的数据直接填充到sql语句中,如: insert into ( aa) values($id$),传入的id为100,则解析成insert into ( aa) values(111),


2)<seletctkey>

SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式。在使用mybatis插入数据进数据库的时候,会用到一些sequence的数据,有些情况下,在插入完成之后还需要将sequence的值返回,然后才能进行下一步的操作。 使用mybatis的selectKey就可以得到sequence的值,同时也会将值返回。

如;对于mysql 
     <insert id="insertUser" parameterClass="ibatis.User"> 
          insert into user 
          (name,password) 
          values 
          (#name#,#password#) 
          <selectKey resultClass="long" keyProperty="id">  
             SELECT LAST_INSERT_ID() AS ID  
        </selectKey>  
      </insert> 


       将selectKey放在insert之后,通过LAST_INSERT_ID() 获得刚插入的自动增长的id的值。

3)

sql的重用:定义一个sql片段,可在任何SQL语句中重用该片段。
<sql id="sql_body">
    from table_example
    <where>
        <if test="name != null"> name = #{name} </if>
    </where>
</sql>
 
<select id="getResult" parameterType="map" resultMap="map">
    select name
    <include refid="sql_body"/>
</select>
 
<select id="getTotalCount" parameterType="map" resultMap="map">
  select count(0) as totalCount
  <include refid="sql_body"/>
</select>
    <include>属性就是为了代码的重用存在的,refid属性值是重用的代码的id名;
4)<dynamic>属性划分出SQL语句的动态部分,dynamic 会自动去除第一个 prepend="and中的内容(这里为and),从而方便一些操作
select id="selectAccount" resultMap="AccountResult" parameterClass="Account">
select * from ACCOUNT
<dynamic prepend="where">
<isNotNull property="id" prepend="and" open="(" close=")">
id = #id#
</isNotNull>
<isNotEmpty property="name" prepend="and">
name like '%$name$%'
</isNotEmpty>
</dynamic>
</select>
当id和name不为空是生成的SQL语句是:
select * from ACCOUNT where (id=id的值) and name like '%name的值%'
<isNotNull>和<isNotEmpty>子句没有时不会添加前缀where


5)<![cdata]>:所有的标记、实体引用都被忽略,而被XML处理程序一视同仁地当做字符数据看待.否则假如您在 XML 文档中放置了一个类似 "<" 字符,那么这个文档会产生一个错误,这是因为解析器会把它解释为新元素的开始。因此你不能这样写:

<message>if salary < 1000 then</message>

为了避免此类错误,需要把字符 "<" 替换为实体引用,就像这样:

<message>if salary &lt; 1000 then</message>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值