ibatis OR映射(第一弹)
在《入门第一弹》中有一个or映射的配置文件,现在就来具体的讲讲配置文件,一下为一典型的配置文件。
可以看到,映射文件主要分为两个部分:模块配置和Statement配置。
模块配置包括:
Ø typeAlias节点:
定义了本映射文件中的别名,以避免过长变量值的反复书写,此例中通过typeAlias节点为类"com.ibatis.sample.User"定义了一个别名"user",这样在本配置文件的其他部分,需要引用"com.ibatis.sample.User"类时,只需以其别名替代即可。
Ø cacheModel节点
定义了本映射文件中使用的Cache机制:
这里申明了一个名为"userCache"的cacheModel,之后可以在Statement申明中对其进行引用:
这表明对通过id为"getUser"的Select statement获取的数据,使用cacheModel "userCache"进行缓存。之后如果程序再次用此Statement进行数据查询,即直接从缓存中读取查询结果,而无需再去数据库查询。
cacheModel主要有下面几个配置点:
flushInterval :
设定缓存有效期,如果超过此设定值,则将此CacheModel的缓存清空。
size:
本CacheModel中最大容纳的数据对象数量。
flushOnExecute:
指定执行特定Statement时,将缓存清空。如updateUser操作将更新数据库中的用户信息,这将导致缓存中的数据对象与数据库中的实际数据发生偏差,因此必须将缓存清空以避免脏数据的出现。
Statement配置:
Statement配置包含了数个与SQL Statement相关的节点,分别为:
statement
insert
delete
update
select
procedure
其中,statement最为通用,它可以替代其余的所有节点。除statement之外的节点各自对应了SQL中的同名操作(procedure对应存储过程)。
使用statement 定义所有操作固然可以达成目标,但缺乏直观性,建议在实际开发中根据操作目的,各自选用对应的节点名加以申明。一方面,使得配置文件更加直观,另一方面,也可借助DTD对节点申明进行更有针对性的检查,以避免
配置上的失误。
各种类型的Statement 配置节点的参数类型基本一致,区别在于数量不同。如insert、update、delete节点无需返回数据类型定义(总是int)。
主要的配置项如下:
statement:
select:
Insert:
其中以“[]”包围的部分为可能出现的配置栏目。
对于参数定义而言,尽量使用parameterClass,即直接将POJO 作为statement 的调用参数,这样在SQL 中可以直接将POJO 的属性作为参数加以设定,如:
这里将com.ibatis.sample.User类设定为update statement的参数,之后,我们即可在SQL 中通过#propertyName#对POJO 的属性进行引用。如上例中的:
SET name=#name#, sex=#sex# WHERE id=#id#
运行期,ibatis 将通过调用User 对象的getName、getSex 和getId 方法获得相应的参数值,并将其作为SQL 的参数。
如果parameterClass 中设定的是jdk 的中的简单对象类型,如String、Integer,ibatis会直接将其作为SQL中的参数值。
我们也可以将包含了参数数据的Map对象传递给Statement,如:
这里传入的参数就是一个Map对象,ibatis将以key ”name”、”sex”、”id”从中提取对应的参数值。
同样的原理,我们也可以在resultMap中设定返回类型为map。
返回的结果将以各字段名为key保存在Map对象中返回。
在SQL中设定参数名时,可以同时指定参数类型,如:
SET name=#name:VARCHAR#, sex=#sex:NUMERIC# WHERE id=#id:NUMERIC#
对于返回结果而言,如果是select语句,建议也采用resultClass进行定义,如:
ibatis会自动根据select语句中的字段名,调用对应POJO 的set方法设定属性值,如上例中,ibatis会调用setName,setSex 方法将Select语句返回的数据赋予相应的POJO 实例。
有些时候,数据库表中的字段名过于晦涩,而为了使得代码更易于理解,我们希望字段映射到POJO时,采用比较易读的属性名, 此时,我们可以通过Select的as 字句对字段名进行转义,如(假设我们的书库中对应用户名的字段为xingming,对应性别的字段为xingbie):
ibatis 会根据转义后的字段名进行属性映射(即调用POJO 的setName 方法而不是setXingming方法)。
parameterMap和resultMap实现了POJO到数据库字段的映射配置,下面是
一个例子:
Parameter的nullValue指定了如果参数为空(null)时的默认值。之后我们即可在statement 申明中对其进行引用,如:
一般而言,对于insert、update、delete、select语句,优先采用parameterClass和resultClass。
parameterMap 使用较少,而resultMap 则大多用于嵌套查询以及存储过程的处理,之所以这样,原因是由于存储过程相对而言比较封闭(很多情况下需要调用现有的存储过程,其参数命名和返回的数据字段命名往往不符合Java编程中的命名习惯,并且由于我们难以通过Select SQL的as子句进行字段名转义,无法使其自动与POJO中的属性名相匹配)。此时,使用resultMap建立字段名和POJO属性名之间的映射关系就显得非常有效。另一方面,由于通过resultMap 指定了字段名和字段类型,ibatis无需再通过JDBC ResultSetMetaData 来动态获取字段信息,在一定程度上也提升了性能表现。
可以看到,映射文件主要分为两个部分:模块配置和Statement配置。
模块配置包括:
Ø typeAlias节点:
定义了本映射文件中的别名,以避免过长变量值的反复书写,此例中通过typeAlias节点为类"com.ibatis.sample.User"定义了一个别名"user",这样在本配置文件的其他部分,需要引用"com.ibatis.sample.User"类时,只需以其别名替代即可。
Ø cacheModel节点
定义了本映射文件中使用的Cache机制:
这里申明了一个名为"userCache"的cacheModel,之后可以在Statement申明中对其进行引用:
这表明对通过id为"getUser"的Select statement获取的数据,使用cacheModel "userCache"进行缓存。之后如果程序再次用此Statement进行数据查询,即直接从缓存中读取查询结果,而无需再去数据库查询。
cacheModel主要有下面几个配置点:
flushInterval :
设定缓存有效期,如果超过此设定值,则将此CacheModel的缓存清空。
size:
本CacheModel中最大容纳的数据对象数量。
flushOnExecute:
指定执行特定Statement时,将缓存清空。如updateUser操作将更新数据库中的用户信息,这将导致缓存中的数据对象与数据库中的实际数据发生偏差,因此必须将缓存清空以避免脏数据的出现。
Statement配置:
Statement配置包含了数个与SQL Statement相关的节点,分别为:
statement
insert
delete
update
select
procedure
其中,statement最为通用,它可以替代其余的所有节点。除statement之外的节点各自对应了SQL中的同名操作(procedure对应存储过程)。
使用statement 定义所有操作固然可以达成目标,但缺乏直观性,建议在实际开发中根据操作目的,各自选用对应的节点名加以申明。一方面,使得配置文件更加直观,另一方面,也可借助DTD对节点申明进行更有针对性的检查,以避免
配置上的失误。
各种类型的Statement 配置节点的参数类型基本一致,区别在于数量不同。如insert、update、delete节点无需返回数据类型定义(总是int)。
主要的配置项如下:
statement:
select:
Insert:
其中以“[]”包围的部分为可能出现的配置栏目。
参数 |
描述 |
parameterClass |
参数类。指定了参数的完整类名(包括包路径)。 可通过别名避免每次重复书写冗长的类名。 |
resultClass |
结果类。指定结果类型的完整类名(包括包路径)可通过别名避免每次重复书写冗长的类名。 |
parameterMap |
参数映射,需结合parameterMap节点对映射 关系加以定义。 对于存储过程之外的statement而言,建议使用parameterClass作为参数配置方式,一方面避免了参数映射配置工作,另一方面其性能表现也更加出色。 |
resultMap |
结果映射,需结合resultMap节点对映射关系 加以定义。 |
cacheModel |
statement对应的Cache模块。 |
对于参数定义而言,尽量使用parameterClass,即直接将POJO 作为statement 的调用参数,这样在SQL 中可以直接将POJO 的属性作为参数加以设定,如:
这里将com.ibatis.sample.User类设定为update statement的参数,之后,我们即可在SQL 中通过#propertyName#对POJO 的属性进行引用。如上例中的:
SET name=#name#, sex=#sex# WHERE id=#id#
运行期,ibatis 将通过调用User 对象的getName、getSex 和getId 方法获得相应的参数值,并将其作为SQL 的参数。
如果parameterClass 中设定的是jdk 的中的简单对象类型,如String、Integer,ibatis会直接将其作为SQL中的参数值。
我们也可以将包含了参数数据的Map对象传递给Statement,如:
这里传入的参数就是一个Map对象,ibatis将以key ”name”、”sex”、”id”从中提取对应的参数值。
同样的原理,我们也可以在resultMap中设定返回类型为map。
返回的结果将以各字段名为key保存在Map对象中返回。
在SQL中设定参数名时,可以同时指定参数类型,如:
SET name=#name:VARCHAR#, sex=#sex:NUMERIC# WHERE id=#id:NUMERIC#
对于返回结果而言,如果是select语句,建议也采用resultClass进行定义,如:
ibatis会自动根据select语句中的字段名,调用对应POJO 的set方法设定属性值,如上例中,ibatis会调用setName,setSex 方法将Select语句返回的数据赋予相应的POJO 实例。
有些时候,数据库表中的字段名过于晦涩,而为了使得代码更易于理解,我们希望字段映射到POJO时,采用比较易读的属性名, 此时,我们可以通过Select的as 字句对字段名进行转义,如(假设我们的书库中对应用户名的字段为xingming,对应性别的字段为xingbie):
ibatis 会根据转义后的字段名进行属性映射(即调用POJO 的setName 方法而不是setXingming方法)。
parameterMap和resultMap实现了POJO到数据库字段的映射配置,下面是
一个例子:
Parameter的nullValue指定了如果参数为空(null)时的默认值。之后我们即可在statement 申明中对其进行引用,如:
一般而言,对于insert、update、delete、select语句,优先采用parameterClass和resultClass。
parameterMap 使用较少,而resultMap 则大多用于嵌套查询以及存储过程的处理,之所以这样,原因是由于存储过程相对而言比较封闭(很多情况下需要调用现有的存储过程,其参数命名和返回的数据字段命名往往不符合Java编程中的命名习惯,并且由于我们难以通过Select SQL的as子句进行字段名转义,无法使其自动与POJO中的属性名相匹配)。此时,使用resultMap建立字段名和POJO属性名之间的映射关系就显得非常有效。另一方面,由于通过resultMap 指定了字段名和字段类型,ibatis无需再通过JDBC ResultSetMetaData 来动态获取字段信息,在一定程度上也提升了性能表现。