iBatis 查询

iBatis 执行查询,sqlMap.xml中的元素为<select>

SqlMapClient的查询API:

1.从数据库中取出一条记录并且放到JAVA对象中

queryForObject(String id, Object parameter) throws SQLException;
参数:
id:调用的sql语句 id
parameter:查询传入的参数
只要需要返回的对象有默认构造函数, queryForObject 方法就能创建并根据查询结果初始化它
queryForObject(String id, Object parameter, Object result) throws SQLException;
参数:
id:调用的sql语句 id
parameter:查询传入的参数
result:查询结果返回的对象
如果需要返回的对象没有默认构造函数,使用这种方式,第三个参数是已经实例化的,
需要返回的对象,queryForObject方法根据查询结果初始化它。

2.从数据库中取出一行或者多行记录,放到Java对象的List中
queryForList(String id, Object parameter) throws SQLException;
参数:
id:调用的sql语句 id
parameter:查询传入的参数
result:查询结果返回的对象

queryForList(String id, Object parameter,int skip, int max) throws SQLException;
参数:
id:调用的sql语句 id
parameter:查询传入的参数
result:查询结果返回的对象
skip:起始位置
max:返回结果数
用于分页查询

3.从数据库中取出一行或者多行记录,放到Java对象的Map中
queryForMap(String id, Object parameter,String key) throws SQLException;
参数:
id:调用的sql语句 id
parameter:查询传入的参数
key:返回map的key值,map的value是完整的bean

queryForMap(String id, Object parameter,String key,String value) throws SQLException;
id:调用的sql语句 id
parameter:查询传入的参数
key:返回map的key值
value:返回map的value值,不是完整的bean,只是其中一个属性

以上API定义了程序的输入和输出,输入和输出的配置需要在sqlmap文件中的sql元素中通过xml属性的方式指定。

输入用parameterClass或者parameterMap指定,输出用resultMap或者resultClass指定。

一.使用resultClass进行结果映射:

1.使用resultClass,查询结果映射为Map

举例:查询年龄为19的学生信息,输入参数为int,输出参数为HashMap,这里使用queryForObject方法。

JAVA代码:

	public static void main(String[] args) throws IOException, SQLException {
		String resource = "sqlMapConfig.xml";
		Reader reader = Resources.getResourceAsReader(resource);
		SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
		Map map = (Map) sqlMap.queryForObject("getStudents", 19);
		System.out.println(map);
	}

sqlMap.xml:

     <select id="getStudents" parameterClass="int" resultClass="hashmap">
        select * from student where sage=#age#
     </select>

注意:如果查询语句中存在特殊符号,比如小于号<,这样会与xml元素冲突而导致程序运行出错,需要使用转义符&lt代替,当然还有一种更好的方式是使用CDATA段。

不正确的写法:

     <select id="getStudentsBean2" parameterClass="int" resultMap="StudentResult">
     
        select Sname,Ssex,sage from student where sage < #age#
      
     </select>
采用CDATA段避免冲突:

     <select id="getStudentsBean2" parameterClass="int" resultMap="StudentResult">
     <![CDATA[
        select Sname,Ssex,sage from student where sage < #age#
      ]]>
     </select>

输出:

{Sage=19, Ssex=女, Sdept=IS, Sname=李四, Sno=95002}

这里查询参数在xml中被包围在##中:select * from student where sage=#age#,

执行sql时相当于这条prepareStatement:

 select * from student where sage= ?

然后将age传入。

如果要改为模糊查询,可以修改xml如下:

     <select id="getStudents" parameterClass="int" resultClass="hashmap">
        select * from student where sage like '%$age$%'
     </select>
这时执行的语句相当于Statement:

 select * from student where sname like '%$age$%'

但是要小心SQL注入的情况,如果用户输入:

JIM';drop table A--

那么这条语句会变成

 select * from student where sname like '%JIM';drop table A--%'

--符号表示忽略后面的%'。这样执行完模糊查询后会删除表A

2.使用resultClass,查询结果映射为基本类型

举例2:查询所有学生,仅返回年龄信息,无输入参数,输出参数为int的List,这里使用queryForList方法。

java:

		List<Integer> list = sqlMap.queryForList("getAges", null);
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
xml:

     <select id="getAges" resultClass="int">
        select sage as value from student
     </select>
结果:

17
19
22
20

3.使用resultClass,查询结果映射为JavaBean

xml:

<sqlMap>
<typeAlias alias="StudentBean" type="com.bean.StudentBean"/>
     
     <select id="getStudentsBean" parameterClass="int" resultClass="StudentBean">
        select * from student where sage = #age#
     </select>
     
</sqlMap>

StudentBean:

public class StudentBean {

	private String sno;
	private String sname;
	private String ssex;
	private String sage;
	private String sdept;

	public String getSno() {
		return sno;
	}

	public void setSno(String sno) {
		this.sno = sno;
	}

	public String getSname() {
		return sname;
	}

	public void setSname(String sname) {
		this.sname = sname;
	}

	public String getSsex() {
		return ssex;
	}

	public void setSsex(String ssex) {
		this.ssex = ssex;
	}

	public String getSage() {
		return sage;
	}

	public void setSage(String sage) {
		this.sage = sage;
	}

	public String getSdept() {
		return sdept;
	}

	public void setSdept(String sdept) {
		this.sdept = sdept;
	}


	public String toString() {
		return "Sno="+sno+" Sname="+sname+" Ssex=" + ssex + " Sage="+sage
				+ " Sdept=" + sdept;
	}
}

Java:

		StudentBean stuBean = (StudentBean) sqlMap.queryForObject("getStudentsBean", 19);
		System.out.println(stuBean);

输出:

Sno=95002 Sname=李四 Ssex=女 Sage=19 Sdept=IS

以上3个例子分别展示了resultClass的基本类型,Map和JavaBean的查询结果映射。

Map和JavaBean都可以返回查询的对象,他们的不同在于:
Bean:
优点:性能,编译时名字检查,只需要一次类型转换
缺点:更多的代码(get/set)
Map:
优点:更少的代码(get/set)
缺点:没有编译时检查,类型转换多

二.使用resultMap进行结果映射:

xml:

<sqlMap>
	<typeAlias alias="StudentBean" type="com.bean.StudentBean"/>

	<resultMap id="StudentResult" class="StudentBean">
	    <result property="sname" column="Sname" />
	    <result property="ssex" column="Ssex" />
	</resultMap>

     <select id="getStudentsBean2" parameterClass="int" resultMap="StudentResult">
        select Sname,Ssex from student where sage = #age#
     </select>
     
</sqlMap>
Java:

		StudentBean stuBean = (StudentBean) sqlMap.queryForObject("getStudentsBean2", 19);
		System.out.println(stuBean);
输出:

Sno=null Sname=李四 Ssex=女 Sage=null Sdept=null

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值