您的位置:首页 > 数据库

Ibatis映射文件SqlMap(未完)

2015-05-10 16:44 162 查看
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>              比较属性值是否小于等于静态值或另一个属性值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: