来自  资质荣誉 2019-09-26 07:10 的文章
当前位置: 澳门太阳娱乐手机登录 > 资质荣誉 > 正文

web编程开发将model键值对化,映射文件

关键字:model属性,反射

 

正文

        model是数据库的映照,在.net web开辟中,作为程序的最尾部。web开辟的一切都以基于数据库的,分了层之后,就依附model了。

为啥要将model键值对化呢?

        天下闻名,程序里巡回赋值当然比挨个赋值快的多,轻便的多。web开辟中,管理参数的接收时,往往是挨个字段都要写二个request央浼,就如那样:

string name = context.Request["name"];string pwd = context.Request["pwd"];string sex= context.Request["sex"];string tel = context.Request["tel"];string orderTimes = context.Request["orderTimes"];Model model = new Model();model.name = name;model.pwd = pwd;model.sex = sex;model.tel = tel;model.orderTimes = orderTimes;....

从上边能够看到,每一行独有字段的称号分化等,为啥不能够写个循环呢?由此想当然的会如此写:

for(int i=0;i<model.property.length;i++){    property[i].name = context.Request[property[i].name];}

这么写当然好啊
1.比如扩大叁个字段,不用改代码。 2.不用复制粘贴数次。3.一旦钦赐model,对持有的model都以通用的。

诸有此类写当然省事非常多,可如何是好到将model键值对化呢,怎么去遍历二个类呢?

键值对化只必要知道model类中逐一属性的称号就行了,至于数据类型二种二种,c#中也会有主意化解。


在前面包车型地铁例子中,只行使了 SQL Map 最轻便易行的样式。SQL Map 的结构中还或者有别的越来越多 的选项。这里是贰个 mapped statement 较复杂的例证,使用了越来越多的表征。

行使反射和Dictionary将model类键值对化:

首先步、创设model的键值对映射:

 public Dictionary<string, dynamic> map { get; set; }

泛型的第一参数是性质的名称,第二个参数是呼应的值。 这几个值能够是int,string,bool等品种,只要使用c#中的dynamic关键字,就足以设置该项目在运营时在测算,和var关键字在编译时估量相反。简单的讲,正是用dynamic关键字替代全数的种类,object也能成功,可是会有装箱和拆箱的效能难题,所以就没用。详细通晓dynamic,请到msdn查看

实际上循环遍历model也行啊,为何要用map映射呢,原因在于:使用dynamic关键字,就制止了各个类型的手动变换了。
第二步、通过反射获得二个model的顺序属性的称谓,注意是性质并不是字段,並且这里的性格名称一定要和数据库中的名称一致。

代码如下:public Dictionary<string, dynamic> map { get; set; }Model model = new Model();Type modelType = model.GetType();foreach (var property in modelType.GetProperties  //把所有属性名称加在map的key中{     map.Add(property.Name, null);} 

那会儿也不用再思量给model的次第属性赋值,只须求让model的映射map管理参数接收,好处就在于,model遍历是反射,map遍历不是,并且model中
无法为null的性质,这里map也能统一管理为null,好处就在于,页面传来的参数,赋值给map中对应的key的value,假若map中某一项为null,则代表前台未有那
个参数字传送过来。

public  void HttpRecieve(HttpContext context){     foreach(string key in map.Keys)     {         map[key] = context.Request[key] == "" ? null : context.Request[key];     }}

可是那样写是自然会错的:

原因是c#中Dictionary 泛型不允许在遍历的时候修改遍历集结内的值。

缓慢解决方法也很简短:扩充二个List数组,遍历的时候遍历List,赋值的时候给Dictionary赋值。

新添List集合定义:

public List<string> modelNames;

改写上边包车型客车早先化:

public Dictionary<string, dynamic> map { get; set; }Model model = new Model();Type modelType = model.GetType();foreach (var property in modelType.GetProperties  //把所有属性名称加在map的key中{     map.Add(property.Name, null);     modelNames.Add(property.Name);   //新增解决Dictionary不能遍历赋值}

那般model的照射就完毕了,那时,你就足以应用map做过多事了。
给SqlParameter类型就很简短了,

public List<SqlParameter> AddPms(){     List<SqlParameter> pms = new List<SqlParameter>();     foreach (string name in modelNames)     {         if (map.ContainsKey && map[name] != null)              pms.Add(new SqlParameter("@" + name, map[name]));     }     return pms;}

接纳那么些函数,就足以使用带参数的SQL语句,很便利的获取页面传来全体的参数。它是通用的,你不用牵挂model里属性都叫什么名字,不用贰个叁个的
复制粘贴。

此处有个难题莫过于,上述办法管理的只是plain型的参数,如若是图形等文件类型的,可以在呼吁参数之后手动覆盖map,比方图片上传使用context.Request
是收取不到的,那时独有在那么些plain型数据后手动管理。叁个表单plain类型多依然图片类型多呢^_^,是吧。

瞩目这里未有说违规参数的过滤难题,如数字类型接收到的是字符串类型,断定会报错啊。不合法参数照旧要拍卖的,那是大约没办法幸免的,未有牢固的范
式,是轻易的写个循环消除不了的。

这一节,大家将model映射为map键值对了,下一节介绍将map映射回model的反光机制。

ps: 反射真是个美妙的事物,能让程序变得简单许多。

 1 <sqlMap id=”Product”>
 2 
 3 <cacheModel id=”productCache” type=”LRU”>
 4 
 5 <flushInterval hours=”24”/>
 6 
 7 <property name=”size” value=”1000” />
 8 
 9 </cacheModel>
10 
11 <typeAlias alias=”product” type=”com.ibatis.example.Product” />
12 
13 <parameterMap id=”productParam” class=”product”>
14 
15 <parameter property=”id”/>
16 
17 </parameterMap>
18 
19 <resultMap id=”productResult” class=”product”>
20 
21 <result property=”id” column=”PRD_ID”/>
22 
23 <result property=”description” column=”PRD_DESCRIPTION”/>
24 
25 </resultMap>
26 
27 <select id=”getProduct” parameterMap=”productParam” resultMap=”productResult”
28 
29 cacheModel=”product-cache”>
30 
31 select * from PRODUCT where PRD_ID = ?
32 
33 </select>
34 
35 </sqlMap>

固然框架为你做了广大行事,为了成功一个大致的询问操作,依然需求做过多。 别担忧,上面是叁个精简版本。

1 <sqlMap id=”Product”>
2 <select id=”getProduct” parameterClass=” com.ibatis.example.Product”
3 resultClass=”com.ibatis.example.Product”>
4 select
5 PRD_ID as id,
6 PRD_DESCRIPTION as description from PRODUCT
7 where PRD_ID = #id#
8 </select>
9 </sqlMap>

简单版本的行事和前二个声称的表现不太雷同。首先,简洁版本未有定义缓存,因 此每叁个伸手都要读取数据库。其次,简洁版本选择了框架的全自动映射性子,这将拉动一些 副功效。可是,那多头在 Java 代码中的执增势势完全一致。

小心:一个 SQL Map XML 映射文件能够分包自由七个 Mapped Statement,Parameter Map 和 Result  Map。根据它们中间的逻辑关系,为您的采用合理地组织 Mapped  Statement, Parameter Map 和 Result Map。SQL Map 的称呼是全局性的,在颇具的 SQL Map 文件中名称必需是独一的。

  • Mapped Statements

SQL Map 的主干概念是 Mapped Statement。Mapped Statement 能够使用放肆的 SQL 语 句,并有着 parameter map(输入)和 result map(输出)。假设是回顾处境,Mapped Statement 能够运用 Java 类来作为 parameter 和 result。Mapped Statement 也能够动用缓存模型,在内部存款和储蓄器 中缓存常用的多少。Mapped Statement 的构造如下所示:

1 <statement   id=”statementName” [parameterClass=”some.class.Name”] [resultClass=”some.class.Name”] [parameterMap=”nameOfParameterMap”] [resultMap=”nameOfResultMap”]
2 [cacheModel=”nameOfCache”]
3 >
4 select * from PRODUCT where PRD_ID = [?|#propertyName#]
5 order by [$simpleDynamic$]
6 </statement>
  • Statement的类型

<statement>成分是个通用注解,能够用于其余项指标 SQL  语句。经常,使用具体的

statement  类型是个好主意。具体 statement  类型提供了越来越直观的 XML DTD,并保有某个

<statement>元素未有的特征。下表计算了 statement 类型及其性格和脾气:

Statement 类型

属性

子元素

方法

<statement>

id parameterClass resultClass parameterMap resultMap cacheModel

xmlResultName

所有的动态元素

insert update delete

所有的查询方法

<insert>

id parameterClass

parameterMap

所有的动态元素

<selectKey>

insert update

delete

<update>

id parameterClass

parameterMap

所有的动态元素

insert update

delete

<delete>

id parameterClass

parameterMap

所有的动态元素

insert update

delete

<select>

id parameterClass resultClass parameterMap resultMap

cacheModel

所有的动态元素

所有的查询方法

<procedure>

id parameterClass resultClass parameterMap resultMap

xmlResultName

所有的动态元素

insert update delete

所有的查询方法

  • SQL  语句

SQL 明显是 mapped statement 中最根本的一部分,能够动用对于数据库和 JDBC Driver 合 法的随机 SQL 语句。只要 JDBC  Driver 扶助,能够应用大肆的函数,乃至是多条语句。因 为 SQL 语句是嵌在 XML 文书档案中的,由此有个别特别的字符不能够平昔使用,举个例子大于号和小 于号(<>)。幸运的是,化解的不二秘诀很轻巧,只需将满含特殊字符的 SQL 语句放在 XML 的 CDATA 区里面就足以了。举个例子:

1 <statement id="getPersonsByAge" parameterClass=”int”
2 resultClass="examples.domain.Person">
3 <![CDATA[
4 SELECT *
5 FROM PERSON WHERE AGE > #value#
6 ]]>
7 </statement>

自动生成的主键

多大多据库扶助自动生成主键的数据类型。可是这一般(并不接二连三)是个民用的特点。 SQL Map 通过<insert>的子成分<selectKey>来帮助自动生成的键值。它同不常候帮忙预生成(如 Oracle)清劲风流倜傥成两系列型(如 MS-SQL Server)。

 1 <!—Oracle SEQUENCE Example -->
 2 <insert id="insertProduct-ORACLE" parameterClass="com.domain.Product">
 3 <selectKey resultClass="int" keyProperty="id" >
 4 SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL
 5 </selectKey>
 6 insert into PRODUCT (PRD_ID,PRD_DESCRIPTION)
 7 values (#id#,#description#)
 8 </insert>
 9 <!— Microsoft SQL Server IDENTITY Column Example -->
10 <insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">
11 insert into PRODUCT (PRD_DESCRIPTION)
12 values (#description#)
13 <selectKey resultClass="int" keyProperty="id" > SELECT @@IDENTITY AS ID
14 </selectKey>
15 </insert>
16 <!-- Mysql Auto Increased ID-->
17 <insert id="insertProduct-Mysql" parameterClass="com.domain.Product">  
18   insert into PRODUCT(PRD_DESCRIPTION)  
19   values (#description#)  
20   <selectKey resultClass="int" keyProperty="id">  
21     SELECT LAST_INSERT_ID()  
22   </selectKey>  
23 </insert>

仓储进度

SQL Map 通过<procedure>成分援助存款和储蓄进度。上面包车型客车事例表明如何行使全部输出参数 的积攒进程。

1 <parameterMap id="swapParameters" class="map" >
2 <parameter property="email1" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
3 <parameter property="email2" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
4 </parameterMap>
5 <procedure id="swapEmailAddresses" parameterMap="swapParameters" >
6 {call swap_email_address (?, ?)}
7 </procedure>

调用上边包车型客车积攒进度将同一时间调换八个字段(数据库表)和参数对象(Map)中的八个 email地址。假如参数的 mode 属性设为 INOUT 或 OUT,则参数对象的值被修改。不然保持不改变。

在意!要力保始终只利用 JDBC 标准的积累进度语法。

  • parameterClass

    parameterClass 属性的值是 Java 类的全限定名(即包涵类的包名)。parameterClass 属性 是可选的,但生硬建议使用。它的目标是限量输入参数的花色为钦赐的 Java 类,并优化框 架的性质。假令你使用 parameterMap,则从未供给运用 parameterClass 属性。举个例子,即使要 只同意 Java 类“examples.domain.Product”作为输入参数,能够如此作:

    1 <statement id=”statementName” parameterClass=” examples.domain.Product”>
    2 insert into PRODUCT values (#id#, #description#, #price#)
    3 </statement>
    

    第一提醒:尽管 2.0 向后卓殊,但刚烈建议使用 parameterClass(除非没供给)。通过 提供 parameterClass,您能够拿走越来越好的习性,因为借使框架事先知情这几个类,就能够优化 自己的品质。要是不点名 parameterClass 参数,任何带有合适属性(get/set 方法)的 Java  Bean 都可 以作为输入参数。

parameterMap

属性 parameterMap 的值等于叁个优先定义的<parameterMap>元素的称呼。parameterMap属性相当少使用,越来越多的是利用上的 parameterClass 和 inline parameter。

注意!动态 mapped statement 只支持 inline parameter,不支持 parameter map。

parameterMap  的核情感维是概念一多重有程序的参数连串,用于匹配 JDBC PreparedStatement 的值符号。

1 <parameterMap id=”insert-product-param” class=”com.domain.Product”>
2 <parameter property=”id”/>
3 <parameter property=”description”/>
4 </parameterMap>
5 <statement id=”insertProduct” parameterMap=”insert-product-param”>
6 insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (?,?);
7 </statement>

Inline Parameter简介

近年来简短介绍一下 inline  parameter,。Inline  parameter 能够嵌在mapped statement 内部使用。比如:

1 <statement id=”insertProduct” >
2 insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)
3 values (#id#, #description#);
4 </statement>

上述例子中,内嵌的参数是#id#和#description#。各类参数代表贰个 Java Bean 属性,用 于给 SQL 语句中相应的地方赋值。上边例子中,Product 对象的 id 和 description 属性的值将 会替换 SQL 语句中相应的标志。因而,对于 id=5,description=‘dog’的 Product 对象,SQL 语句变为:

1 insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)
2 values (5, ‘dog’);

resultClass

resultClass 属性的值是 Java 类的全限定名(即包蕴类的包名)。resultClass 属性能够让 您钦赐贰个 Java 类,根据 ResultSetMetaData 将其活动映射到 JDBC 的 ResultSet。只即使 Java Bean  的属性名称和 ResultSet  的列名相称,属性自动赋值给列值。那使得查询 mapped statement 变得比极短。比方:

1 <statement id="getPerson" parameterClass=”int” resultClass="examples.domain.Person"> SELECT PER_ID as id,
2 PER_FIRST_NAME as firstName, PER_LAST_NAME as lastName, PER_BIRTH_DATE as birthDate, PER_WEIGHT_KG as weightInKilograms, PER_HEIGHT_M as heightInMeters
3 FROM PERSON
4 WHERE PER_ID = #value#
5 </statement>

在上头的例子中,Person  类具备属性包含 id ,firstName ,lastName ,birthDate , weightInKilograms 和 heightInMeters。每叁本性质对应 SQL 查询语句贰个列的小名(使用“as” 关键字-标准的 SQL 语法)。一般情况下,列名和属性名称不相配,就须要采取“as”关键 字。当施行 mapped statement 时,Person 类将被初步化,从结果聚集获得的列值将基于属性 名和列名映射成 Person 对象的属性值。

正如在此之前所说,使用 resultClass 的电动映射存在部分限量,无法钦命输出字段的数据类型(假诺供给的话),不能自行李装运入相关的数目(复杂属性),而且因为急需 ResultSetMetaData的音讯,会对品质有微小的不利影响。但运用 resultMap,那几个限制都能够很轻便化解。

  • resultMap

    resultMap 是最常用和最注重的习性。ResultMap 属性的值等于预先定义的 resultMap 元 素的 name 属性值。使用 resultMap 能够调控数据怎么着从结果聚集收取, 以及哪一个属性相配哪一个字段。不象使用 resultClass 的机关映射方法,resultMap 属性可 以允许钦点字段的数据类型,NULL 的代表值复杂类型映射(满含其余 Java  Bean,集合类 型和基本类型包装类)。

    1 <resultMap id=”get-product-result” class=”com.ibatis.example.Product”>
    2 <result property=”id” column=”PRD_ID”/>
    3 <result property=”description” column=”PRD_DESCRIPTION”/>
    4 </resultMap>
    5 <statement id=”getProduct” resultMap=”get-product-result”>
    6 select * from PRODUCT
    7 </statement>
    

    地点的例子中,通过 resultMap 的概念,查询语句拿到的 ResultSet 被映射成 Product 对 象。resultMap 定义的“id”属性值将授予“PRO_ID”字段值,而“description”属性值将赋 予“PGL450D_DESCRIPTION”字段值。注意 resultMap 支持“select *”,并不须求定义 ResultSet 全数再次来到字段的照耀。

  • cacheModel

    cacheModel 的属性值等于钦点的 cacheModel 成分的 name 属性值。属性 cacheModel 定 义查询 mapped  statement  的缓存。每三个询问 mapped  statement  能够运用分化或同一的 cacheModel。

     1 <cacheModel id="product-cache" imlementation="LRU">
     2 <flushInterval hours="24"/>
     3 <flushOnExecute statement="insertProduct"/>
     4 <flushOnExecute statement="updateProduct"/>
     5 <flushOnExecute statement="deleteProduct"/>
     6 <property name=”size” value=”1000” />
     7 </cacheModel>
     8 <statement id=”getProductList” parameterClass=”int” cacheModel=”product-cache”>
     9 select * from PRODUCT where PRD_CAT_ID = #value#
    10 </statement>
    

    地点例子中,“getProductList”的缓存使用 WEAK 援用类型,每 24 小时刷新三次,或 当更新的操作产生时刷新。

xmlResultName

当直接把询问结果映射成 XML  document  时,属性 xmlResultName  的值等于 XML document 根成分的名称。举例:

1 <select id="getPerson" parameterClass=”int” resultClass="xml" xmlResultName=”person”> SELECT PER_ID as id,
2 PER_FIRST_NAME as firstName, PER_LAST_NAME as lastName, PER_BIRTH_DATE as birthDate, PER_WEIGHT_KG as weightInKilograms, PER_HEIGHT_M as heightInMeters
3 FROM PERSON
4 WHERE PER_ID = #value#
5 </select>

地方的询问结果将产生三个 XML document,结构如下:

1 <person>
2 <id>1</id>
3 <firstName>Clinton</firstName>
4 <lastName>Begin</lastName>
5 <birthDate>1900-01-01</birthDate>
6 <weightInKilograms>89</weightInKilograms>
7 <heightInMeters>1.77</heightInMeters>
8 </person>
  • Parameter Map 和  Inline Parameter

    看来,parameterMap  负担将 Java  Bean 的性质映射成 statement  的参数。纵然 parameterMap 的表面格局比非常少使用,精通它什么做事对于驾驭 inline  parameter 还是很有帮衬。

    1 <parameterMap id=”parameterMapName” [class=”com.domain.Product”]>
    2 <parameter property =”propertyName” [jdbcType=”VARCHAR”] [javaType=”string”] [nullValue=”NUMERIC”] [null=”-9999999”]/>
    3 <parameter …… />
    4 <parameter …… />
    5 </parameterMap>
    

    括号[]是可选的天性。parameterMap 成分只供给品质 id 作为唯一标志。属性 class 是可选的但猛烈推荐使用。和 parameterClass 类似,class 属性能够框架检查输入参数的类型并优化性能。

    <parameter>元素

    五个 parameterMap 可含蓄自由多的 parameter 成分。以下商讨 parameter 的逐个属性。

    * property

    本性 property 是传给 statement 的参数对象的 Java Bean 属性名称。该名称依据须求,可 以在 statement 中一再面世(即在 SQL 语句 SET 子句中被更新的属性,也得以视作条件出现 在 WHERE 子句中)。

    * jdbcType

    特性 jdbcType 用于显式地钦定给本属性(property)赋值的数据库字段的数据类型。对 于某个特定的操作,假设不钦点字段的数据类型,有个别 JDBC Driver 不能分辨字段的数据类 型。二个很好的例证是 PreparedStatement.setNull(int parameterIndex, int sqlType)方法,供给 钦定数据类型。假设不点名数据类型,某个 Driver 只怕内定为 Types.Other 或 Types.Null。 可是,不可能担保全体的 Driver  都展现同样。对于这种意况,SQL  Map  API  允许利用 parameterMap 子成分 parameter 的 jdbcType 属性内定数据类型。

    正规景况下,只有当字段可以为 NULL 时才供给 jdbcType 属性。另一亟待内定 jdbcType 属性的状态是字段类型为日期时间档案的次序的情况。因为 Java 仅有三个 Date 类型(java.util.Date), 而大大多 SQL 数据库有四个-日常最少有 3 种。因而,须求内定字段类型是 DATE 照旧 DATETIME。

    天性 jdbcType 能够是 JDBC Types 类中定义的随机参数的字符串值。固然如此,如故有 有些体系不协理(即 BLOB)。本节的稍后部分会表达框架结构帮助的数据类型。

    留意!大繁多 JDBC Driver 独有在字段可以为 NULL 时要求钦命 jdbcType 属性。由此, 对于这么些 Driver,只是在字段可认为 NULL 时才须要内定 type 属性。

    注意!当使用 Oracle Driver 时,若无给可认为 NULL 的字段钦定 jdbcType 属性, 当试图给这一个字段赋值 NULL 时,会冒出“Invalid column type”错误。

    * nullValue

    属性 nullValue 的值能够是对此 property 类型来讲肆意的官方值,用于钦命 NULL 的替 换值。正是说,当 Java Bean 的属性值等于内定值时,相应的字段将赋值 NULL。这些特点 允许在运用中给不帮忙 null 的数据类型(即 int,double,float 等)赋值 null。当那么些多少类 型的个性值相称 null 值(即相配-9999)时,NULL 将代替 null 值写入数据库。

    1 <parameterMap id=”insert-product-param” class=”com.domain.Product”>
    2 <parameter property=”id” jdbcType=”NUMERIC” javaType=”int” nullValue=”-9999999”/>
    3 <parameter property=”description” jdbcType=”VARCHAR” nullValue=”NO_ENTRY”/>
    4 </parameterMap>
    5 <statement id=”insertProduct” parameterMap=”insert-product-param”>
    6 insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (?,?);
    7 </statement>
    

    瞩目!parameterMap 并不自动地绑定到特定的 Java 类。由此在上头的例子中,任何拥 有“id”和“description”属性的 Java  Bean 对象,都足以当作 parameterMap 的输入。若是 需求将输入绑定到特定的 Java 类,能够利用 mapped-statement 的 resultClass 属性。

    注意!Parameter Map 的称谓(name)局地的,只在概念它的 SQL Map XML 文件中有 效。不过,加上 SQL Map 的名目(即在<sqlMap>根成分中的名称)作为前缀,您能够在另 三个 SQL Map XML 文件中援用它。比如,要在另三个文书中引用以上的 parameterMap,可 以使用名称“Product.insert-product-param”。

    Inline Parameter Map

    parameterMap  的语法纵然简易,但很麻烦。还大概有一种更受接待越来越灵活的措施,能够大大简化定义和削减代码量。这种艺术把 Java Bean 的性能名称嵌在 Mapped Statement 的定义中(即间接写在 SQL 语句中)。缺省事态下,任何未有一些名 parameterMap 的 Mapped Statement都会被分析成 inline parameter(内嵌参数)。用地点的例子(即 Product)来讲,正是:

    1 <statement id=”insertProduct” parameterClass=”com.domain.Product”>
    2 insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)
    3 values (#id#, #description#);
    4 </statement>
    

    在内嵌参数中钦赐数据类型能够用上边包车型大巴语法:

    1 <statement id=”insertProduct” parameterClass=”com.domain.Product”>
    2 insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)
    3 values (#id:NUMERIC#, #description:VARCHAR#);
    4 </statement>
    

    在内嵌参数中钦命数据类型和 NULL 的取代值可以用这么的语法:

    1 <statement id=”insertProduct” parameterClass=”com.domain.Product”>
    2 insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)
    3 values (#id:NUMERIC:-999999#, #description:VARCHAR:NO_ENTRY#);
    4 </statement>
    

    专一!在内嵌参数中,要钦定 NULL 的代替值,须要求先钦命数据类型。 注意!如必要在查询时也利用 NULL 替代值,必须同有的时候间在 resultMap 中定义(如下说明)。 注意!即便你供给钦定比比较多的数据类型和 NULL 代替值,能够运用外界的 parameterMap元素,那样会使代码更清楚。

    核心类型输入参数

    倘使没供给写一个 Java  Bean 作为参数,可以直接接纳基本类型的包装类(即 String,Integer,Date 等)作为参数。

    1 <statement id=”insertProduct” parameter=”java.lang.Integer”>
    2 select * from PRODUCT where PRD_ID = #value#
    3 </statement>
    

    假设 PRD_ID 的数据类型是 NUMEGL450IC,要调用上边的 mapped statement,能够流传一 个 java.lang.Integer 对象作为参数。Integer 对象的值将顶替#value#参数。当使用基本类型包 装类替代 Java Bean 时,切记要利用#value#用作参数。Result Map(参见以下章节)也帮忙 使用基本项目作为结果参数。

    Map类型输入参数

    一旦没要求写三个 Java Bean 作为参数,而要传入的参数又不但二个时,能够利用 Map类(如 HashMap,TreeMap 等)作为参数对象。举个例子:

    1 <statement id=”insertProduct” parameterClass=”java.util.Map”>
    2 select * from PRODUCT
    3 where PRD_CAT_ID = #catId#
    4 and PRD_CODE = #code#
    5 </statement>
    

    Result Map

    在 SQL Map 框架中,Result Map 是极度主要的机件。在奉行查询 Mapped Statement 时,resultMap 负担将结果集的列值映射成 Java Bean 的属性值。resultMap 的协会如下:

    1 <resultMap id=”resultMapName” class=”some.domain.Class” [extends=”parent-resultMap”]>
    2 <result property=”propertyName” column=”COLUMN_NAME” [columnIndex=”1”] [javaType=”int”] [jdbcType=”NUMERIC”] [nullValue=”-999999”] [select=”someOtherStatement”]
    3 
    4 />
    5 <result ……/>
    6 <result ……/>
    7 <result ……/>
    8 </resultMap>
    

    括号[]中是可选的品质。resultMap 的 id 属性是 statement 的独步天下标志。ResultMap 的 class 属性用于钦点 Java 类的全限定名(即包罗包的名称)。该 Java 类初阶化并依附定义填充 数据。extends 是可选的属性,可设定成别的一个 resultMap 的名字,并以它为底蕴。和在 Java 中继续一个类一般,父 resultMap 的习性将用作子 resutlMap 的一某些。父 resultMap 的特性总是加到子 resultMap 属性的后面,並且父 resultMap 必要求在子 resultMap 在此之前定义。父 resultMap 和子 resultMap 的 class 属性不肯定要一律,它们得以未有其余涉及。 

    resultMap 能够满含自由多的特性映射,将查询结果集的列值映射成 Java Bean 的属性。 属性的照射按它们在 resultMap 中定义的逐个举办。相关的 Java Bean 类必需符合 Java Bean 标准,每一属性都必得具备 get/set 方法。

    瞩目!ResultSet 的列值按它们在 resultMap 中定义的各样读取(那特色会在好几实现得 不是很好的 JDBC Driver 中派上用场)。

    esultMap 的 result 成分各类属性:

    property

    性子 property 的值是 mapped statement 重返结果对象的 Java Bean 属性的称呼(get 方法)。

    * column

    质量 column 的值是 ResultSet 中字段的名号,该字段赋值给 names 属性钦赐的 Java Bean 属性。同一字段可以频繁施用。注意,只怕有些 JDBC  Driver(比如,JDBC/ODBC 桥)不 允许数十次读取同一字段。

    * columnIndex

    属性 columnIndex 是可选的,用于更始品质。属性 columnIndex 的值是 ResultSet 中用来 赋值 Java Bean 属性的字段次序号。在 99%的施用中,不太或者供给就义可读性来换取质量。 使用 columnIndex,有些 JDBC Driver 能够大幅度进步品质,某个则尚未别的效果.

    * jdbcType

    属性 type 用于钦命 ResultSet 中用来赋值 Java  Bean 属性的字段的数据库数据类型(而 不是 Java 类名)。即使 resultMap 未有 NULL 值的主题材料,指定 type 属性对于映射某个类型(例 如 Date 属性)依旧有效的。因为 Java 独有一个 Date 类型,而 SQL 数据库也会有多少个(通 常至少有 3 个),为保障 Date(和另外)类型能科学的赋值,有些景况下内定 type 依旧有必 要的。同样地,String 类型的赋值恐怕源于 VARCHA君越,CHA翼虎 和 CLOB,由此等同也许有必 要钦定 type 属性(取决于 JDBC Driver)。

    * javaType

    性格 javaType 用于显式地钦定被赋值的 Java Bean 属性的门类。不荒谬情形下,那足以通 过反射从 Java Bean 的属性得到,但对于一些映射(举例 Map 和 XML document),框架不能够 通过这种方法来获知。若无安装 javaType,同期框架也不能够获知类型音讯,类型将被假 定为 Object。 

    * nullValue

    品质 nullValue 钦定数据库中 NULL 的替代值。由此,借使从 ResultSet 中读出 NULL值,Java Bean 属性将被赋值属性 null 钦定的代替值。属性 null 的值能够内定任性值,但必 须对于 Java Bean 属性的连串是合法的。

    * select

    性格 select 用于描述对象时期的涉及,并机关地装入复杂类型(即客户定义的档期的顺序)属 性的多寡。属性 select 的值必须是别的三个 mapped  statement 成分的称呼。在同一个 result 成分中定义的数据库字段(column  属性)以及 property  属性,将被传给相关的 mapped statement 作为参数。因而,字段的数据类型必得是 SQL Map 帮忙的简练数据类型。

    隐式的Result Map

    倘令你有简要的映射,不须要援引定义好的 resultMap,有一个便捷的法门,正是经过 设定 mapped statement 的 resultClass 属性来隐式地钦命 result map。秘诀在于,有限支持重返的 ResultSet 的字段名称(或标签或外号)和 Java Bean 中可写入属性的名目相配。举例,思索 以上的 Product 类,能够创制三个包蕴隐式 result map 的 mapped statement 如下:

    1 <statement id=”getProduct” resultClass=”com.ibatis.example.Product”>
    2 select
    3 PRD_ID as id,
    4 PRD_DESCRIPTION as description from PRODUCT
    5 where PRD_ID = #value#
    6 </statement>
    

    下边包车型客车 mapped statement 定义了 resultClass 属性,并为各个字段钦命了别称,用于相称 Product 类的品质名称。那样就能够了,没有须求 result map。弱点在于,您不能内定字段的数据类型(平常不是 NULLABLE 字段不需求),或 NULL 取代值(或<result>其余属性)。别的还要记住,数据库比相当少是高低写敏感的,因而隐式 result map 对大小写也不敏感。假使您 的 Java Bean 有七个属性,二个是 firstName,另二个是 firstname,数据库会把两岸看作同一 个天性,因此不能够利用隐式的 result map(那也足以用作是 Java Bean 设计的四个神秘难点)。 另外,使用 resultClass 的自发性映射也对质量有细微的不利影响。因为读取 ResultSetMetaData 新闻会使少数 JDBC Driver 变慢。

    基本项目标Result(即String,Integer,Boolean)

    除却扶助符合 Java Bean 标准的 Java 类,Result Map 还可以够给宗旨项目包装类如 String, Integer,Boolean 等赋值。Result Map 仍是可以够获得基本类型包装类的联谊。基本项目能够象 Java Bean 一样映射,只是要铭记在心八个 限制,基本类型只可以有壹特性能,名字能够放肆取(常用“value”或“val”)。比方,借使 您要拿走全部产品描述的二个列表并非成套 Product 类,Result Map 如下:

    1 <resultMap id=”get-product-result” class=”java.lang.String”>
    2 <result property=”value” column=”PRD_DESCRIPTION”/>
    3 </resultMap>
    

     

    更简明方法是,在 mapped statement 中接纳 resultClass 属性(使用“as”关键字给字段 取外号“value”):

    1 <statement id=”getProductCount” resultClass=”java.lang.Integer”> 
    2 select count(1) as value from PRODUCT
    3 </statement>
    

    Map类型的Result

    Result  Map 也能够方便为四个 Map(如 HashMap 或 TreeMap)对象赋值。还足以博得 Map 对象的汇集(即 Map 的 List)。 Map 对象与 Java Bean 同样的诀要映射,只是利用 name 属性值作为 Map 的键值,用它来索 引相应的数据库字段值,并非象 Java  Bean 同样给属性赋值。举例,如果你要将 Product 对象的多少装入 Map,可以这么做:

    1 <resultMap id=”get-product-result” class=”java.util.HashMap”>
    2 <result property=”id” column=”PRD_ID”/>
    3 <result property=”code” column=”PRD_CODE”/>
    4 <result property=”description” column=”PRD_DESCRIPTION”/>
    5 <result property=”suggestedPrice” column=”PRD_SUGGESTED_PRICE”/>
    6 </resultMap>
    

    地方的例子会创制二个 HashMap 的实例并用 Product 的多少赋值。Property 的 name 属性值(即“id”)作为 HashMap 的键值,而列值则作为 HashMap 中相应的值。 当然,能够把 Map 类型 Result 和隐式的 Result Map 一同使用。举例:

    1 <statement id=”getProductCount” resultClass=”java.util.HashMap”>
    2 select * from PRODUCT
    3 </statement>
    

    复杂类型属性(即自定义类型的本性)

    因为 mapped statement 知道怎样装入合适的多少和 Java 类,通过将 resultMap 的 property 和对应的 mapped statement 联系起来,能够自动地给复杂类型(即客商创造的类)的天性赋 值。复杂类型用以代表在数据库中互相关系为一对一,一对多的数码。对于有个别多的数额关 系,具有卷帙浩繁类型属性的类作为“多”的一方,而复杂属性本人则作为“一”的一方。思量 下边包车型地铁例子:

     1 <resultMap id=”get-product-result” class=”com.ibatis.example.Product”>
     2 <result property=”id” column=”PRD_ID”/>
     3 <result property=”description” column=”PRD_DESCRIPTION”/>
     4 <result property=”category” column=”PRD_CAT_ID” select=”getCategory”/>
     5 </resultMap>
     6 <resultMap id=”get-category-result” class=”com.ibatis.example.Category”>
     7 <result property=”id” column=”CAT_ID”/>
     8 <result property=”description” column=”CAT_DESCRIPTION”/>
     9 </resultMap>
    10 <statement id=”getProduct” parameterClass=”int” resultMap=”get-product-result”>
    11 select * from PRODUCT where PRD_ID = #value#
    12 </statement>
    13 <statement id=”getCategory” parameterClass=”int” resultMap=”get-category-result”>
    14 select * from CATEGORY where CAT_ID = #value#
    15 </statement>
    

    地点的例证中,Product 对象具有一个品种为 Category 的 category 属性。因为 category 是复杂类型(客商定义的门类),JDBC 不知情怎么给它赋值。通过将 category 属性值和另 二个 mapped statement 联系起来,为 SQL Map 引擎如何给它赋值提供了十足的消息。通过 实施“getProduct”,“get-product-result”Result  Map  使用 PTiggoD_CAT_ID  字段的值去调用 “getCategory”。“get-category-result”Result Map 将起先化贰个 Category 对象并赋值给它。 然后全部 Category 对象将赋值给 Product 的 category 属性。

    上述即SQL MAP XML的照射文件的详实介绍。

本文由澳门太阳娱乐手机登录发布于 资质荣誉,转载请注明出处:web编程开发将model键值对化,映射文件

关键词: