ibatis的参数和返回值测试

   是从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使用过程中,会用到很多外部的类(自定义的类),并且多次被使用到
那么可以为这些类配上别名,那么在使用的时候只使用别名就可以了
给类命别名
<typeAlias alias="employee" type="com.ibatis.test.entity.Employee" />
<typeAlias alias="employeeData" type="com.ibatis.test.data.EmployeeData" />
使用时只使用别名:
<resultMap id="resultEmployeeData" class="employeeData">
返回类型的字段到属性的映射,通常从数据库查询出的数据需要
通过手动映射到结果集map类(data)中
例子:其中resultEmployeeData是映射好的resultMap的id,共其他功能调用
class是上面定义的类的别名,property是类的属性,column对应查询出来的字段名
<resultMap id="resultEmployeeData" class="employeeData">
<result property="employeeId" column="employee_id" />
<result property="employeeName" column="employee_name" />
<result property="employeeSex" column="employee_sex" />
<result property="employeeAddress" column="employee_address" />
<result property="employeePhone" column="employee_phone" />
<result property="employeeMail" column="employee_mail" />
<result property="employeeDepartment" column="employee_department" />
<result property="officeNumber" column="employee_officenumber" />
<result property="employeeDate" column="employee_employeedate" />
<result property="birthday" column="employee_birthday" />
<result property="manager.manager_id" column="employee_manager_id" />
<result property="manager.managerName" column="manager_name" />
<result property="manager.managerPost" column="manager_post" />
<result property="manager.officeNumber" column="manager_officenumber" />
<result property="onJob" column="employee_onjob" />
</resultMap>
作为select功能返回参数:
<select id="getEmployeeByID" parameterClass="int" resultMap="resultEmployeeData">
参数为单个字段类型的测试(int/String/Date/boolean)
* 需要注意的地方:由于是单个参数而不是map或object类型的键值对,所以#key#就没有意义了。
对于单参数的情况,不管#xx#中xx是什么都对应着参数的值,及#id#和#a#,#b#都取参数的值。
但是不能为空。实际使用时为了便于阅读还是尽量使用有意义的词
参数类型     例子       注意
<select id="getEmployeeByID" parameterClass="int" resultMap="resultEmployeeData">
<![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           <![CDATA[
employee.employee_id=#id#       ]]>表示ibatis将忽
]]>           略其中的特殊字符
</select>         如>,<等。
dao中调用:employee=(EmployeeData)sqlMap.queryForObject("getEmployeeByID", 1);
<select id="getEmployeesByEmployeeName" parameterClass="String" resultMap="resultEmployeeData"> 参数类型也
<![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$%'     方式是:
]]>           '%$xx$%',而不
</select>         是:'%#xx#%'
dao中调用:list=sqlMap.queryForList("getEmployeesByEmployeeName","name");
<select id="getEmployeesByEmployeeDate" parameterClass="Date" resultMap="resultEmployeeData">
<![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 > #date#
]]>
</select>
dao中调用:list=sqlMap.queryForList("getEmployeesByEmployeeDate",date);
<select id="getEmployeesByOnjob" parameterClass="boolean" resultMap="resultEmployeeData">
<![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#
]]>
</select>
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值
<select id="getEmployeesByMap" parameterClass="java.util.HashMap" resultMap="resultEmployeeData">
<![CDATA[
ibatis配置   SELECT employee.*,manager.manager_name,manager.manager_post,manager.manager_officenumber <isNotNull/>
from employee,manager       动态添加sql语
where           句,表示判断
employee.employee_manager_id = manager.manager_id   property所知名
]]>           的字段是否为
<isNotNull prepend="and" property="employeeName"> 空,如果不为
<![CDATA[         空则添加
employee.employee_name like '%$employeeName$%'   <isNotNull>
]]>           </isNotNull>中
</isNotNull>         的sql语句。
<isNotNull prepend="and" property="employeeDate">   其中property属
<![CDATA[         性是要判断的
employee.employee_employeedate > #employeeDate# 参数传来的字
]]>           段,prepend属性
</isNotNull>         是连接的语句
<isNotNull prepend="and" property="onJob">   and,or,或者自定
<![CDATA[         义的语句
employee.employee_onjob = #onJob#
]]>
</isNotNull>
</select>
有时候在查询条件中会用到如 xxx in (a,b,c)的情况,比如画面上的checkboxlist。这个时候需要使用
List存选择的checkbox的value。可以将这个List同其他查询条件一起存进map中。 动态迭代:
当map里存 List<Integer> managerList=new ArrayList();     <iterate/>
有List的情况   managerList.add(1);         property属性指明
managerList.add(2);         要迭代的参数传
managerList.add(3);         来的字段,
map.put("managerList",managerList);     conjunction属性
在ibatis配置中如下进行配置:       是连接符号。
<isNotNull prepend="and" property="managerList">   在使用时,由于
employee.employee_manager_id in(     参数是list所以使
<iterate property="managerList" conjunction=",">   用#list[]#的方式。
#managerList[]# </iterate>
)
</isNotNull>
参数为Object类型的测试
* 需要注意的地方:使用Object与使用HashMap一样,都是键值对的关系
例子
建立键值对应关系,属性相当于hahmap的key   QueryData封装
public class QueryData {       了查询条件,作
private String employeeName;       为参数传进ibatis
private Date employeeDate;       进行查询。
private boolean onJob;
建立Object  private List<Integer> managerList;
……
}
给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<Integer> managerList=new ArrayList();
managerList.add(1);
managerList.add(2);
managerList.add(3);
data.setManagerList(managerList);
与<isNotNull/>类
ibatis中使用到的参数必须对应Object里的属性   似的动态添加sql
<select id="getEmployeesByQueryData" parameterClass="com.ibatis.test.data.QueryData" 语句的还有:
resultMap="resultEmployeeData">     <isEqual prepend="",
ibatis配置   <![CDATA[         property="",
SELECT employee.*,manager.manager_name,manager.manager_post,manager.manager_officenumber compareProperty="",
from employee,manager       compareValue=""/>
where           比较属性值和静态值
employee.employee_manager_id = manager.manager_id   或另一个属性值是否
]]>           相等。
<isNotNull prepend="and" property="employeeName"> <isNotEqual/>  !=
<![CDATA[         <isGreaterThan/> >
employee.employee_name like '%$employeeName$%'   <isGreaterEqual/> >=
]]>           <isLessThan/> <
</isNotNull>         <isLessEqual/> <=
<isNotNull prepend="and" property="employeeDate">   用法与<isEqual/>一样。
<![CDATA[
employee.employee_employeedate > #employeeDate# 比如在分页排序的时
]]>           候需要对牌讯标志进
</isNotNull>         行判断:
<isNotNull prepend="and" property="onJob">   <dynamic prepend="order by">
<![CDATA[            <isEqual property="flag" compareValue="1"> employeeName
employee.employee_onjob = #onJob#        </isEqual>
]]>              <isEqual property="flag" compareValue="2"> employeeName
</isNotNull>             DESC </isEqual>
<isNotNull prepend="and" property="managerList">   </dynamic>
employee.employee_manager_id in(
<iterate property="managerList" conjunction=",">
#managerList[]# </iterate>
)
</isNotNull>
</select>
返回类型为单个字段类型的测试(int/String/Date/boolean)
参数类型     例子       注意
<select id="getEmployeeCountByQueryData" parameterClass="com.ibatis.test.data.QueryData" 返回类型也
resultClass="int">         可以使用其
<![CDATA[         包装类:
SELECT COUNT(*)         java.lang.Integer
from employee,manager       或者直接使用
int   where           Integer
employee.employee_manager_id = manager.manager_id
]]>           但是在类型转换时
</select>         只能使用Integer
而不能使用int
dao中调用:count = (Integer)sqlMap.queryForObject("getEmployeeCountByQueryData", data);
<select id="getEmployeeNameById" parameterClass="int" resultClass="String"> 返回类型也
<![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#
]]>
</select>
dao中调用:list=sqlMap.queryForList("getEmployeesByEmployeeName","name");
<select id="getEmployeeDateById" parameterClass="int" resultClass="Date">
<![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#
]]>
</select>
dao中调用:date=(Date)sqlMap.queryForObject("getEmployeeDateById", id);
<select id="getOnJobById" parameterClass="int" resultClass="boolean">
<![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#
]]>           dao中类型转换
</select>         是使用包装类
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的属性映射
<resultMap id="resultEmployeeMap" class="java.util.HashMap">
<result property="employeeId" column="employee_id" />
<result property="employeeName" column="employee_name" />
<result property="employeeSex" column="employee_sex" />
<result property="employeeAddress" column="employee_address" />
<result property="employeePhone" column="employee_phone" />
<result property="employeeMail" column="employee_mail" />
<result property="employeeDepartment" column="employee_department" />
<result property="officeNumber" column="employee_officenumber" />
<result property="employeeDate" column="employee_employeedate" />
<result property="birthday" column="employee_birthday" />
<result property="manager_id" column="employee_manager_id" />
<result property="managerName" column="manager_name" />
<result property="managerPost" column="manager_post" />
<result property="managerOfficeNumber" column="manager_officenumber" />
存多种类型   <result property="onJob" column="employee_onjob" />
的集合  </resultMap>
select功能:
<select id="getEmployeeMapById" parameterClass="int" resultMap="resultEmployeeMap">
<![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#       仅仅返回一个
]]>           HashMap对象
Dao中使用:HashMap map=(HashMap) sqlMap.queryForObject("getEmployeeMapById",1);
通常返回多个相同类型的对象时,使用的是List,及queryForList。但是如果想将查询出来的对象
可以通过某个字段索引的话,那就可以使用Map类,及queryForMap
xml配置:
<select id="getEmployeeMapById" parameterClass="int" resultMap="resultEmployeeData">
<![CDATA[
SELECT employee.*,manager.manager_name,manager.manager_post,manager.manager_officenumber
from employee,manager
where
employee.employee_manager_id = manager.manager_id
]]>
</select>
返回的是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的属性映射
<resultMap id="resultEmployeeData" class="employeeData">
<result property="employeeId" column="employee_id" />
<result property="employeeName" column="employee_name" />
<result property="employeeSex" column="employee_sex" />
<result property="employeeAddress" column="employee_address" />
<result property="employeePhone" column="employee_phone" />
<result property="employeeMail" column="employee_mail" />
<result property="employeeDepartment" column="employee_department" />
<result property="officeNumber" column="employee_officenumber" />
<result property="employeeDate" column="employee_employeedate" />
<result property="birthday" column="employee_birthday" />
<result property="manager.manager_id" column="employee_manager_id" />
<result property="manager.managerName" column="manager_name" />
<result property="manager.managerPost" column="manager_post" />
使用     <result property="manager.officeNumber" column="manager_officenumber" />
ResultMap     <result property="onJob" column="employee_onjob" />
</resultMap>
select功能:
<select id="getEmployeeById" parameterClass="int" resultMap="resultEmployeeData">
<![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#
]]>
Dao中使用:employee=(EmployeeData)sqlMap.queryForObject("getEmployeeByID", employeeId);
也可以使用resultClass的方式返回Object对象,但是必须使用别名来与Object的属性对应。
<select id="getEmployeeByID" parameterClass="int" resultClass="com.ibatis.test.data.EmployeeData">
<![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#       */
]]>          private int employeeId;
</select>        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;
}

posted on 2009-05-02 11:00 一半是海 阅读(7184) 评论(0)  编辑  收藏 所属分类: ibatis


只有注册用户登录后才能发表评论。


网站导航:
 
<2025年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

留言簿

文章分类

文章档案

搜索

最新评论