﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-laure-文章分类-ibatis</title><link>http://www.blogjava.net/laure/category/39347.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 02 May 2009 03:04:02 GMT</lastBuildDate><pubDate>Sat, 02 May 2009 03:04:02 GMT</pubDate><ttl>60</ttl><item><title>ibatis的参数和返回值测试</title><link>http://www.blogjava.net/laure/articles/268592.html</link><dc:creator>一半是海</dc:creator><author>一半是海</author><pubDate>Sat, 02 May 2009 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/laure/articles/268592.html</guid><wfw:comment>http://www.blogjava.net/laure/comments/268592.html</wfw:comment><comments>http://www.blogjava.net/laure/articles/268592.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/laure/comments/commentRss/268592.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/laure/services/trackbacks/268592.html</trackback:ping><description><![CDATA[<pre>   是从excel里直接copy出来的，所以格式可能会有问题。可以下载excel版的阅读,在这里http://www.blogjava.net/Files/laure/ibatis.rar。
ibatis参数和返回值测试
2008/10/15
输入/输出 测试的类型
1 传入单个参数的情况
输入  2 传入参数为Map类型的情况
3 传入参数为Object类型的情况
4 传入参数中含有List的情况
5 返回类型为单个字段的情况
输出   6 返回类型为集合的情况
测试都是基于以下的表进行
表employee    表manager
字段名 字段类型   字段名 字段类型
employee_id
integer
manager_id integer
employee_name varchar(20)   manager_name varchar(20)
employee_sex varchar(6)   manager_post varchar(20)
employee_address varchar(40)   manager_officenumber varchar(8)
employee_phone varchar(12)
employee_mail varchar(20)
employee_department varchar(10)
employee_officenumber varchar(8)
employee_employeedate datetime
employee_onjob boolean
employee_birthday datetime
employee_manager_id integer
测试用数据库： MySql5.0
在ibatis使用过程中，会用到很多外部的类（自定义的类），并且多次被使用到
那么可以为这些类配上别名，那么在使用的时候只使用别名就可以了
给类命别名
&lt;typeAlias alias="employee" type="com.ibatis.test.entity.Employee" /&gt;
&lt;typeAlias alias="employeeData" type="com.ibatis.test.data.EmployeeData" /&gt;
使用时只使用别名：
&lt;resultMap id="resultEmployeeData" class="employeeData"&gt;
返回类型的字段到属性的映射，通常从数据库查询出的数据需要
通过手动映射到结果集map类（data）中
例子：其中resultEmployeeData是映射好的resultMap的id，共其他功能调用
class是上面定义的类的别名，property是类的属性，column对应查询出来的字段名
&lt;resultMap id="resultEmployeeData" class="employeeData"&gt;
&lt;result property="employeeId" column="employee_id" /&gt;
&lt;result property="employeeName" column="employee_name" /&gt;
&lt;result property="employeeSex" column="employee_sex" /&gt;
&lt;result property="employeeAddress" column="employee_address" /&gt;
&lt;result property="employeePhone" column="employee_phone" /&gt;
&lt;result property="employeeMail" column="employee_mail" /&gt;
&lt;result property="employeeDepartment" column="employee_department" /&gt;
&lt;result property="officeNumber" column="employee_officenumber" /&gt;
&lt;result property="employeeDate" column="employee_employeedate" /&gt;
&lt;result property="birthday" column="employee_birthday" /&gt;
&lt;result property="manager.manager_id" column="employee_manager_id" /&gt;
&lt;result property="manager.managerName" column="manager_name" /&gt;
&lt;result property="manager.managerPost" column="manager_post" /&gt;
&lt;result property="manager.officeNumber" column="manager_officenumber" /&gt;
&lt;result property="onJob" column="employee_onjob" /&gt;
&lt;/resultMap&gt;
作为select功能返回参数：
&lt;select id="getEmployeeByID" parameterClass="int" resultMap="resultEmployeeData"&gt;
参数为单个字段类型的测试(int/String/Date/boolean)
* 需要注意的地方：由于是单个参数而不是map或object类型的键值对，所以#key#就没有意义了。
对于单参数的情况，不管#xx#中xx是什么都对应着参数的值，及#id#和#a#,#b#都取参数的值。
但是不能为空。实际使用时为了便于阅读还是尽量使用有意义的词
参数类型     例子       注意
&lt;select id="getEmployeeByID" parameterClass="int" resultMap="resultEmployeeData"&gt;
&lt;![CDATA[         参数类型也
SELECT employee.*,manager.manager_name,manager.manager_post,manager.manager_officenumber 可以使用其
from employee,manager       包装类:
where           java.lang.Integer
int   employee.employee_manager_id = manager.manager_id
and           &lt;![CDATA[
employee.employee_id=#id#       ]]&gt;表示ibatis将忽
]]&gt;           略其中的特殊字符
&lt;/select&gt;         如&gt;,&lt;等。
dao中调用：employee=(EmployeeData)sqlMap.queryForObject("getEmployeeByID", 1);
&lt;select id="getEmployeesByEmployeeName" parameterClass="String" resultMap="resultEmployeeData"&gt; 参数类型也
&lt;![CDATA[         可以是：
SELECT employee.*,manager.manager_name,manager.manager_post,manager.manager_officenumber java.lang.String
from employee,manager
String   where           在使用String
employee.employee_manager_id = manager.manager_id   类型进行模糊
and           搜索时，使用
employee.employee_name like '%$name$%'     方式是：
]]&gt;           '%$xx$%'，而不
&lt;/select&gt;         是:'%#xx#%'
dao中调用：list=sqlMap.queryForList("getEmployeesByEmployeeName","name");
&lt;select id="getEmployeesByEmployeeDate" parameterClass="Date" resultMap="resultEmployeeData"&gt;
&lt;![CDATA[         参数类型也
SELECT employee.*,manager.manager_name,manager.manager_post,manager.manager_officenumber 可以是：
from employee,manager       java.util.Date
where
Date   employee.employee_manager_id = manager.manager_id
and
employee.employee_employeedate &gt; #date#
]]&gt;
&lt;/select&gt;
dao中调用：list=sqlMap.queryForList("getEmployeesByEmployeeDate",date);
&lt;select id="getEmployeesByOnjob" parameterClass="boolean" resultMap="resultEmployeeData"&gt;
&lt;![CDATA[         参数类型也
SELECT employee.*,manager.manager_name,manager.manager_post,manager.manager_officenumber 可以使用其
from employee,manager       包装类:
where           java.lang.Boolean
employee.employee_manager_id = manager.manager_id
boolean   and
employee.employee_onjob = #onJob#
]]&gt;
&lt;/select&gt;
dao中调用：sqlMap.queryForList("getEmployeesByOnjob",true);
参数为HashMap类型的测试
* 需要注意的地方：使用HashMap与使用Object一样，都是键值对的关系
例子
Map生成，存储参数
HashMap map=new HashMap();
map.put("employeeName", "laure");
String dateStr="1989/7/7";
Date date=new Date();
外部使用   SimpleDateFormat formator=new SimpleDateFormat("yyyy/MM/dd");
try {
date=formator.parse(dateStr);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
map.put("employeeDate",date);
map.put("onJob", true);
List list=dao.getEmployeesByMap(map);
ibatis中使用到的参数必须对应map里存的key值
&lt;select id="getEmployeesByMap" parameterClass="java.util.HashMap" resultMap="resultEmployeeData"&gt;
&lt;![CDATA[
ibatis配置   SELECT employee.*,manager.manager_name,manager.manager_post,manager.manager_officenumber &lt;isNotNull/&gt;
from employee,manager       动态添加sql语
where           句，表示判断
employee.employee_manager_id = manager.manager_id   property所知名
]]&gt;           的字段是否为
&lt;isNotNull prepend="and" property="employeeName"&gt; 空，如果不为
&lt;![CDATA[         空则添加
employee.employee_name like '%$employeeName$%'   &lt;isNotNull&gt;
]]&gt;           &lt;/isNotNull&gt;中
&lt;/isNotNull&gt;         的sql语句。
&lt;isNotNull prepend="and" property="employeeDate"&gt;   其中property属
&lt;![CDATA[         性是要判断的
employee.employee_employeedate &gt; #employeeDate# 参数传来的字
]]&gt;           段，prepend属性
&lt;/isNotNull&gt;         是连接的语句
&lt;isNotNull prepend="and" property="onJob"&gt;   and,or,或者自定
&lt;![CDATA[         义的语句
employee.employee_onjob = #onJob#
]]&gt;
&lt;/isNotNull&gt;
&lt;/select&gt;
有时候在查询条件中会用到如 xxx in (a,b,c)的情况，比如画面上的checkboxlist。这个时候需要使用
List存选择的checkbox的value。可以将这个List同其他查询条件一起存进map中。 动态迭代：
当map里存 List&lt;Integer&gt; managerList=new ArrayList();     &lt;iterate/&gt;
有List的情况   managerList.add(1);         property属性指明
managerList.add(2);         要迭代的参数传
managerList.add(3);         来的字段，
map.put("managerList",managerList);     conjunction属性
在ibatis配置中如下进行配置：       是连接符号。
&lt;isNotNull prepend="and" property="managerList"&gt;   在使用时，由于
employee.employee_manager_id in(     参数是list所以使
&lt;iterate property="managerList" conjunction=","&gt;   用#list[]#的方式。
#managerList[]# &lt;/iterate&gt;
)
&lt;/isNotNull&gt;
参数为Object类型的测试
* 需要注意的地方：使用Object与使用HashMap一样，都是键值对的关系
例子
建立键值对应关系，属性相当于hahmap的key   QueryData封装
public class QueryData {       了查询条件，作
private String employeeName;       为参数传进ibatis
private Date employeeDate;       进行查询。
private boolean onJob;
建立Object  private List&lt;Integer&gt; managerList;
&#8230;&#8230;
}
给Object传参数，相当于hashmap的Value
QueryData data=new QueryData();
setValue   data.setEmployeeName("laure");
data.setOnJob(true);
String dateStr="1989/7/7";
Date date=new Date();
SimpleDateFormat formator=new SimpleDateFormat("yyyy/MM/dd");
try {
date=formator.parse(dateStr);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
data.setEmployeeDate(date);
List&lt;Integer&gt; managerList=new ArrayList();
managerList.add(1);
managerList.add(2);
managerList.add(3);
data.setManagerList(managerList);
与&lt;isNotNull/&gt;类
ibatis中使用到的参数必须对应Object里的属性   似的动态添加sql
&lt;select id="getEmployeesByQueryData" parameterClass="com.ibatis.test.data.QueryData" 语句的还有：
resultMap="resultEmployeeData"&gt;     &lt;isEqual prepend="",
ibatis配置   &lt;![CDATA[         property="",
SELECT employee.*,manager.manager_name,manager.manager_post,manager.manager_officenumber compareProperty="",
from employee,manager       compareValue=""/&gt;
where           比较属性值和静态值
employee.employee_manager_id = manager.manager_id   或另一个属性值是否
]]&gt;           相等。
&lt;isNotNull prepend="and" property="employeeName"&gt; &lt;isNotEqual/&gt;  !=
&lt;![CDATA[         &lt;isGreaterThan/&gt; &gt;
employee.employee_name like '%$employeeName$%'   &lt;isGreaterEqual/&gt; &gt;=
]]&gt;           &lt;isLessThan/&gt; &lt;
&lt;/isNotNull&gt;         &lt;isLessEqual/&gt; &lt;=
&lt;isNotNull prepend="and" property="employeeDate"&gt;   用法与&lt;isEqual/&gt;一样。
&lt;![CDATA[
employee.employee_employeedate &gt; #employeeDate# 比如在分页排序的时
]]&gt;           候需要对牌讯标志进
&lt;/isNotNull&gt;         行判断：
&lt;isNotNull prepend="and" property="onJob"&gt;   &lt;dynamic prepend="order by"&gt;
&lt;![CDATA[            &lt;isEqual property="flag" compareValue="1"&gt; employeeName
employee.employee_onjob = #onJob#        &lt;/isEqual&gt;
]]&gt;              &lt;isEqual property="flag" compareValue="2"&gt; employeeName
&lt;/isNotNull&gt;             DESC &lt;/isEqual&gt;
&lt;isNotNull prepend="and" property="managerList"&gt;   &lt;/dynamic&gt;
employee.employee_manager_id in(
&lt;iterate property="managerList" conjunction=","&gt;
#managerList[]# &lt;/iterate&gt;
)
&lt;/isNotNull&gt;
&lt;/select&gt;
返回类型为单个字段类型的测试(int/String/Date/boolean)
参数类型     例子       注意
&lt;select id="getEmployeeCountByQueryData" parameterClass="com.ibatis.test.data.QueryData" 返回类型也
resultClass="int"&gt;         可以使用其
&lt;![CDATA[         包装类:
SELECT COUNT(*)         java.lang.Integer
from employee,manager       或者直接使用
int   where           Integer
employee.employee_manager_id = manager.manager_id
]]&gt;           但是在类型转换时
&lt;/select&gt;         只能使用Integer
而不能使用int
dao中调用：count = (Integer)sqlMap.queryForObject("getEmployeeCountByQueryData", data);
&lt;select id="getEmployeeNameById" parameterClass="int" resultClass="String"&gt; 返回类型也
&lt;![CDATA[         可以是：
SELECT employee.employee_name     java.lang.String
from employee,manager
String   where
employee.employee_manager_id = manager.manager_id
and
employee.employee_id=#id#
]]&gt;
&lt;/select&gt;
dao中调用：list=sqlMap.queryForList("getEmployeesByEmployeeName","name");
&lt;select id="getEmployeeDateById" parameterClass="int" resultClass="Date"&gt;
&lt;![CDATA[         返回类型也
SELECT employee.employee_employeedate     可以是：
from employee,manager       java.util.Date
where
Date   employee.employee_manager_id = manager.manager_id
and
employee.employee_id=#id#
]]&gt;
&lt;/select&gt;
dao中调用：date=(Date)sqlMap.queryForObject("getEmployeeDateById", id);
&lt;select id="getOnJobById" parameterClass="int" resultClass="boolean"&gt;
&lt;![CDATA[         返回类型也
SELECT employee.employee_onjob     可以使用其
from employee,manager       包装类:
where           java.lang.Boolean
employee.employee_manager_id = manager.manager_id   或者直接使用
boolean   and           Boolean
employee.employee_id=#id#
]]&gt;           dao中类型转换
&lt;/select&gt;         是使用包装类
Boolean
dao中调用：onJob=(Boolean)sqlMap.queryForObject("getOnJobById", id);
返回类型为Map的测试
* 需要注意的地方：返回类型为HashMap有两种使用方式
a.将HashMap当做Object使用（存多种数据类型的集合）
b.将HashMap当作List使用（Object的list集合）
例子
所谓使用HashMap存多种类型的返回数据。就是相当于给所有的返回类型为Object的做了一个
共通的Object。Object中属性与值对应，在HashMap中就是键值对。其实这种方式就还是返回了
一个Object，只不过是将这个Object的属性与值以键值对的方式存放到HashMap中了。
建立HashMap的keys映射，相当于返回类型为Object的属性映射
&lt;resultMap id="resultEmployeeMap" class="java.util.HashMap"&gt;
&lt;result property="employeeId" column="employee_id" /&gt;
&lt;result property="employeeName" column="employee_name" /&gt;
&lt;result property="employeeSex" column="employee_sex" /&gt;
&lt;result property="employeeAddress" column="employee_address" /&gt;
&lt;result property="employeePhone" column="employee_phone" /&gt;
&lt;result property="employeeMail" column="employee_mail" /&gt;
&lt;result property="employeeDepartment" column="employee_department" /&gt;
&lt;result property="officeNumber" column="employee_officenumber" /&gt;
&lt;result property="employeeDate" column="employee_employeedate" /&gt;
&lt;result property="birthday" column="employee_birthday" /&gt;
&lt;result property="manager_id" column="employee_manager_id" /&gt;
&lt;result property="managerName" column="manager_name" /&gt;
&lt;result property="managerPost" column="manager_post" /&gt;
&lt;result property="managerOfficeNumber" column="manager_officenumber" /&gt;
存多种类型   &lt;result property="onJob" column="employee_onjob" /&gt;
的集合  &lt;/resultMap&gt;
select功能:
&lt;select id="getEmployeeMapById" parameterClass="int" resultMap="resultEmployeeMap"&gt;
&lt;![CDATA[
SELECT employee.*,manager.manager_name,manager.manager_post,manager.manager_officenumber
from employee,manager
where
employee.employee_manager_id = manager.manager_id   注意这里使用的
and           是queryForObject
employee.employee_id=#id#       仅仅返回一个
]]&gt;           HashMap对象
Dao中使用：HashMap map=(HashMap) sqlMap.queryForObject("getEmployeeMapById",1);
通常返回多个相同类型的对象时，使用的是List，及queryForList。但是如果想将查询出来的对象
可以通过某个字段索引的话，那就可以使用Map类，及queryForMap
xml配置：
&lt;select id="getEmployeeMapById" parameterClass="int" resultMap="resultEmployeeData"&gt;
&lt;![CDATA[
SELECT employee.*,manager.manager_name,manager.manager_post,manager.manager_officenumber
from employee,manager
where
employee.employee_manager_id = manager.manager_id
]]&gt;
&lt;/select&gt;
返回的是resultEmployeeData的对象集合
存同一个对
象的集合， dao中使用：
List功能 HashMap map=(HashMap) sqlMap.queryForMap("getEmployeeMapById", null, "employeeName");
return map;
第3个参数为EmployeeData对象的属性命，比如这里使用的是employeeName属性，那么检索
出来的多个EmployeeData就可以通过employeeName字段进行索引了。
比如：
EmployeeData e=(EmployeeData)map.get("laure");
System.out.println(e.getEmployeeAddress());
如果要被设为索引字段的类型为int，则获取的时候需要使用int型，不能再使用String类型了。
比如：
HashMap map=(HashMap) sqlMap.queryForMap("getEmployeeMapById", null, "employeeId");
return map;
EmployeeData e=(EmployeeData)map.get(1);
System.out.println(e.getEmployeeAddress());
返回类型为Object的测试
* 需要注意的地方：返回类型为Object有两种使用方式
a.使用ResultMap
b.使用ResultClass
例子
使用resultMap的方式，需要另外配置Object和db的column进行映射配置。
建立Object的属性映射
&lt;resultMap id="resultEmployeeData" class="employeeData"&gt;
&lt;result property="employeeId" column="employee_id" /&gt;
&lt;result property="employeeName" column="employee_name" /&gt;
&lt;result property="employeeSex" column="employee_sex" /&gt;
&lt;result property="employeeAddress" column="employee_address" /&gt;
&lt;result property="employeePhone" column="employee_phone" /&gt;
&lt;result property="employeeMail" column="employee_mail" /&gt;
&lt;result property="employeeDepartment" column="employee_department" /&gt;
&lt;result property="officeNumber" column="employee_officenumber" /&gt;
&lt;result property="employeeDate" column="employee_employeedate" /&gt;
&lt;result property="birthday" column="employee_birthday" /&gt;
&lt;result property="manager.manager_id" column="employee_manager_id" /&gt;
&lt;result property="manager.managerName" column="manager_name" /&gt;
&lt;result property="manager.managerPost" column="manager_post" /&gt;
使用     &lt;result property="manager.officeNumber" column="manager_officenumber" /&gt;
ResultMap     &lt;result property="onJob" column="employee_onjob" /&gt;
&lt;/resultMap&gt;
select功能:
&lt;select id="getEmployeeById" parameterClass="int" resultMap="resultEmployeeData"&gt;
&lt;![CDATA[
SELECT employee.*,manager.manager_name,manager.manager_post,manager.manager_officenumber
from employee,manager
where
employee.employee_manager_id = manager.manager_id
and
employee.employee_id=#id#
]]&gt;
Dao中使用：employee=(EmployeeData)sqlMap.queryForObject("getEmployeeByID", employeeId);
也可以使用resultClass的方式返回Object对象，但是必须使用别名来与Object的属性对应。
&lt;select id="getEmployeeByID" parameterClass="int" resultClass="com.ibatis.test.data.EmployeeData"&gt;
&lt;![CDATA[
SELECT employee.employee_id as employeeId,
employee.employee_name as employeeName,
employee.employee_sex as employeeSex,
employee.employee_address as employeeAddress,
employee.employee_phone as employeePhone,
employee.employee_mail as employeeMail,
employee.employee_department as employeeDepartment,
employee.employee_employeedate as employeeDate,
employee.employee_birthday as birthday,
employee.employee_manager_id as "manager.manager_id",
employee.employee_officenumber as officeNumber,
manager.manager_name as "manager.managerName",
使用   manager.manager_post as "manager.managerPost",
ResultClass   manager.manager_officenumber as "manager.officeNumber",
employee_onjob as onJob
from employee,manager     其中EmployeeData定义如下：
where         public class EmployeeData {
employee.employee_manager_id = manager.manager_id  /**
and           * attributes
employee.employee_id=#id#       */
]]&gt;          private int employeeId;
&lt;/select&gt;        private String employeeName;
private String employeeSex;
private String employeeAddress;
private String employeePhone;
private String employeeMail;
private String employeeDepartment;
private String officeNumber;
private Date employeeDate;
private Date birthday;
private ManagerData manager;
private Boolean onJob;
}
</pre>
<img src ="http://www.blogjava.net/laure/aggbug/268592.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/laure/" target="_blank">一半是海</a> 2009-05-02 11:00 <a href="http://www.blogjava.net/laure/articles/268592.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>