是从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;
}