Ibatis映射文件SqlMap(未完)

1.最基本配置

<?xml version="1.0" encoding="utf-8" ?>

<sqlMap namespace="Person" xmlns="http://ibatis.apache.org/mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
  <alias>
    <typeAlias alias="Person" type="piggyWinFormTemplet.Model.Person, piggyWinForm" />
  </alias>

  <resultMaps>
    <resultMap id="SelectResult" class="Person">
      <result property="Id" column="PER_ID" />
      <result property="FirstName" column="PER_FIRST_NAME" />
      <result property="LastName" column="PER_LAST_NAME" />
      <result property="BirthDate" column="PER_BIRTH_DATE" />
      <result property="WeightInKilograms" column="PER_WEIGHT_KG" />
      <result property="HeightInMeters" column="PER_HEIGHT_M" />
    </resultMap>
  </resultMaps>

  <statements>

    <select id="SelectByPrimaryKey" parameterClass="int" resultMap="SelectResult">
      select
      PER_ID,
      PER_FIRST_NAME,
      PER_LAST_NAME,
      PER_BIRTH_DATE,
      PER_WEIGHT_KG,
      PER_HEIGHT_M
      from PERSON
      WHERE
          PER_ID = #value#
    </select>

    <insert id="Insert" parameterClass="Person" resultClass="int">
      insert into Person (
      PER_ID,
      PER_FIRST_NAME,
      PER_LAST_NAME,
      PER_BIRTH_DATE,
      PER_WEIGHT_KG,
      PER_HEIGHT_M
      ) values (
      #Id:int#,
      #FirstName:varchar#,
      #LastName:varchar#,
      #BirthDate:smalldatetime#,
      #WeightInKilograms:decimal#,
      #HeightInMeters:decimal#
      )
    </insert>

    <update id="Update" parameterClass="Person" resultClass="int">
      update Person set
      PER_FIRST_NAME=#FirstName:varchar#
      ,PER_LAST_NAME=#LastName:varchar#
      ,PER_BIRTH_DATE=#BirthDate:smalldatetime#
      ,PER_WEIGHT_KG=#WeightInKilograms:decimal#
      ,PER_HEIGHT_M=#HeightInMeters:decimal#
      where PER_ID=#Id:int#
    </update>
   

    <delete id="Delete" parameterClass="int" resultClass="int">
      delete from PERSON
      where PER_ID = #value#
    </delete>

  </statements>

</sqlMap>
            (1)<sqlMap  namespace="">

                      需要和配置文件中的useStatementNameSpaces="true"配合使用(详见配置说明)

            (2)<typeAlias alias="" type="类的全名">
                      实体类的别名,作用就是为了方便,不然每次都要写类的全名

            (3)<resultMap  id=""   class="类的全名">
                      实际上就是定义一个到java pojo的映射,需要在这里定义之后,才能在sql的返回值类型处使用。   

            (4)<insert  id=""  parameterClass="">
                      1)不使用自增主键

                            直接写insert语句即可,参数通过#属性名#获得

                      2)使用自增主键(mysql)

<selectKey resultClass="java.lang.Integer" keyProperty="id">  
        select last_insert_id() as id from person limit 1  
</selectKey> 
                             需要添加这句,从而返回这次自增主键的值,然后再使用insert即可

                             注意:使用的数据库不同,获得自增主键的写法也不同
            (5)<update  id=""  parameterClass="">

                       用法类似insert

            (6)<delete id="" paramterClass="">

                       用法同insert

             (7)<select id="" parameterClass=""  resultMap="">

                      使用queryForList查询多个数据,queryForObject查询单个数据


               注意:

                       1)使用resultMap和resultClass都可以起到定义映射java pojo的作用,只是resultMap可以自定义映射关系,并且能够指定类型;resultClass就是按照属性名称和表中的列名严格对应的

                             所以懒得写的时候用resultClass,只要保证名称确定对应即可

                       2)parameterMap和parameterClass和resultMap和resultClass的关系一样

                       3)parameterClass可以为原生数据类型,map、pojo

                             1>如果为原生数据类型,则可以在sql中直接使用value代表参数值

                             2>如果为map,使用key

Map<String,String> map = new HashMap<String,String>();
map.put("id", String.valueOf(4));
map.put("name", "wq");
List list = sqlClient.queryForList("selByIdAndName", map);
                             sqlMap中

<select id="selByIdAndName" parameterClass="java.util.HashMap" resultMap="PersonResult">
     select * from person where id=#id# and name=#name#
</select>

                             3>如果为pojo,则用法和其他情况一样


2.常用功能

       (1)模糊查询

                 注意:取参数值的时候必须使用$,不能用#

<select id="selByName" parameterClass="java.lang.String" resultMap="PersonResult">
        select * 
        from person 
        where name like '%$value$%'
</select>
                测试代码

List list = sqlClient.queryForList("selByName", "o");

       (2)分页查询

                 注意



3.动态sql

         (1)<dynamic>

                    说明: dynamic会根据实际情况添加或删除prepend,如:where、and等,所以不需要考虑太多,直接写上即可

         (2)<isNotNull>

                   只判断参数是否是null,如果不是null,则添加相应sql

         (3)<isNotEmpty>

                   不但判断参数是否是null,还判断String.valueOf(参数)是否是""

                  eg:

                  执行的测试代码为:

Person p = new Person();
p.setName("");
    		
List<Person> list = (List<Person>)sqlClient.queryForList("person.selectByIN", p);
                使用isNotNull

	<select id="selectByIN" parameterClass="Person" resultMap="PersonResult">
        select *
        from person
        <dynamic prepend="where">
        	<isNotNull prepend="and" property="name">
        		name like '%$name$%'
        	</isNotNull>
        </dynamic>
	</select>
                产生的sql为:

select *   from person   where  name like '%%'    
               因为name为"",不是null

              使用isNotEmpty

	<select id="selectByIN" parameterClass="Person" resultMap="PersonResult">
        select *
        from person
        <dynamic prepend="where">
        	<isNotEmpty prepend="and" property="name">
        		name like '%$name$%'
        	</isNotEmpty>
        </dynamic>
	</select>

产生的sql为:

select *  from person  

                   由于上述原因,pojo中属性最好使用包装类(Long、Integer等),这样就能区分null和""了,如果直接使用原生数据类型,则可能出错

                   实际上2、3属于这种情况

                  一元条件元素的属性:
 

    prepend  :    可被覆盖的 SQL 语句组成部分,添加在语句的前面(可选)
    property  :   被比较的属性(必选)
<isPropertyAvailable>                    检查是否存在该属性(存在 parameter bean 的属性) 。
<isNotPropertyAvailable>                 检查是否不存在该属性(不存在 parameter bean 的属性) 。
<isNull>                                 检查属性是否为 null。
<isNotNull>                              检查属性是否不为 null。
<isEmpty>                                检查 Collection.size()的值,属性的 String 或 String.valueOf()值,
                                              是否为 null或空( “”或size() < 1) 。
<isNotEmpty>                             检查 Collection.size()的值,属性的 String 或 String.valueOf()值,
                                              是否不为 null 或不为空( “”或 size() > 0) 。


         (4)<isEqual prepend=""  property=""  compareValue="">

                   判断property的值是否和compareValue的值相同

<select id="selectByIN" parameterClass="Person" resultMap="PersonResult">
      select *
      from person
      <dynamic prepend="where">
           <isEqual prepend="and" property="id" compareValue="2">
                   name like '%$name$%'
           </isEqual>
      </dynamic>
</select>
                表示如果传递进来的Person对象的id如果==2,那么就查询name为指定值得记录

         (5)<isLessThan prepend=""  property=""  compareProperty="">

                   判断property的值是否小于compareProperty的值,如果小于,则添加相应sql

<select id="selectByIN" parameterClass="Person" resultMap="PersonResult">
        select *
        from person
        <dynamic prepend="where">
           <isLessThan prepend="and" property="id" compareProperty="age">
                name like '%$name$%'
           </isLessThan>
       </dynamic>
</select>
                  如果传递过来的Person中的id<age,那么就添加相应sql

             实际上4、5属于以下这种情况

             二元条件元素的属性:
                  

  prepend          :  可被覆盖的 SQL 语句组成部分,添加在语句的前面(可选)
  property  -     :  被比较的属性(必选)
  compareProperty  :  另一个用于和前者比较的属性(必选或选择 compareValue)
  compareValue     :  用于比较的值(必选或选择 compareProperty)
<isEqual>                  比较属性值和静态值或另一个属性值是否相等。
<isNotEqual>               比较属性值和静态值或另一个属性值是否不相等。
<isGreaterThan>            比较属性值是否大于静态值或另一个属性值。
<isGreaterEqual>           比较属性值是否大于等于静态值或另一个属性值。
<isLessThan>               比较属性值是否小于静态值或另一个属性值。
<isLessEqual>              比较属性值是否小于等于静态值或另一个属性值。



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值