Spring apache ibatis query的深入浅出的探索过程

本文详细介绍Ibatis中的查询功能,包括不带参数和带参数的查询方法,并解释如何使用这些方法进行数据库操作。此外,还提供了具体的代码示例帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


今天主要了解一下ibatis的一些查询 功能:

一 功能

1 queryForList(java.lang.String id)


该函数用来执行查询(不带参数的查询)结果为多条记录的 返回结果为List 此处参数id 指在类映射文件中select语句的id属性譬如:映射文件select 语句为:<select id="getAllPerson" resultClass="person">
select * from person
</select> 执行查询代码为:SqlMapSession sms=Utils.getSqlMapSession();

List list=sms.queryForList("getAllPerson");


2 queryForList(java.lang.String id java.lang.Object parameterObject)

该函数用来执行带参数的查询 结果为多条记录 返回结果为List 此处参数id 指在类映射文件中select语句的id属性 第二个参数parameterObject 为映射文件中select语句 where子句要输入的参数 譬如:映射文件select语句为:<select id="getPersonByName" parameterClass="string" resultClass="person">
select * from person where name=#name#
</select> 执行查询代码为:SqlMapSession sms=Utils.getSqlMapSession();

List list=sms.queryForList("getPersonByName","张三");


3 queryForList(java.lang.String id, int skip, int max)

该函数用来查询(不带参数的查询)一定范围的 记录集 此处参数id 指在类映射文件中select语句的id属性 第二个参数表示从第几条记录(0代表第一条) 开始查询 第三个参数表示最多查询几条 譬如:映射文件select语句为:<select id="getPersonByName" parameterClass="string" resultClass="person">
select * from person where name=#name#

</select> 执行查询代码为:SqlMapSession sms=Utils.getSqlMapSession(); List list=sms.queryForList("getPersonByName","张三",0,2);//这里表示从第一条开始查 查两条记录


4 queryForList(java.lang.String id ,java.lang.Object parameterObject ,int skip ,int max)

该函数 结合以上几个函数 我想大家就会明白了 此处就不加详细介绍了..


5 queryForMap(java.lang.String id, java.lang.Object parameterObject, java.lang.String keyProp)

该函数用来将查询所得对象封装成map对象 所以只能用来查询单一记录。此处参数id 指在类映射文件中select语句的id属性, 第二个参数parameterObject 为映射文件中select语句 where子句要输入的参数, 第三个参数keyProp 则表示为指定 map的key值为 所得查询对象某个的属性( 譬如:这里假设查询所得为person对象 将person的属性age设为 map的key 将该对象设置为map的value。)示例如下:映射文件select语句为:
<select id="getPersonByName" parameterClass="string" resultClass="person">
select * from person where name=#name#
</select>
执行查询代码为:

SqlMapSession sms=Utils.getSqlMapSession();


6 Map map=sms.queryForMap("getPersonByName","lisi", "age");

Person p=(Person)map.get(12);//此时map的形式为{person.age=person}即person的age属性作为key值 person对象作为value值

System.out.println(p.getId());


7.queryForMap(java.lang.String id, java.lang.Object parameterObject, java.lang.String keyProp,java.lang.String valueProp)

该函数作用同5大同小异 只不过多了一个参数 valueProp 通过上一个函数 我们可以猜到 该参数就是设定返回map对象的value值 该值也是有查询所得对象中得某个属性设定(譬如这里查询所得为person对象 将person的属性age设为 map的key 将person的属性id设置为map的value)
示例如下:映射文件select语句为:
<select id="getPersonByName" parameterClass="string" resultClass="person">
select * from person where name=#name#
</select>
执行查询代码为:
SqlMapSession sms=Utils.getSqlMapSession();
Map map=sms.queryForMap("getPersonByName","lisi", "age","id");
Integer id=(Integer) map.get(22);//此时map的形式为{person.age=person.id}即person的age属性作为key值 person的属性id作为value值

System.out.println(id);

————————————————————————————————————————————————

二 追溯

发现问题

今天在看到单位代码,用到了ibatis,这个东东,之前完全木有用过。

从Action追到DAO,又追到了如下代码

(注意:传的参数是String 和 Map)

public List<GoodsBank> getBankInfosByGoodsId(Map mapwhere) {
List<GoodsBank> list = null;
try {
list = this.find("GoodsBank.GetUPbank", mapwhere);
} catch (Exception e) {
e.printStackTrace();
}
return list;
}


见名知意,这个就是查询upbank的,返回类型也从泛型可以看出来

那个这个GoodsBank.GetUPbank在哪里呢?

那个map里面有两个Key-value,它应该是where的子句参数,它是如何起作用的呢?


带着疑问,

点进去find方法,

原来原型是:

org. springframework. orm. ibatis. SqlMapClientTemplate.queryForList( String statementName, Object parameterObject) throws DataAccessException

放在googleout里面一搜索:

点出来第一个就是api,

http://docs.spring.io/spring/docs/3.2.11.RELEASE/javadoc-api/org/springframework/orm/ibatis/SqlMapClientTemplate.html#queryForList(java.lang.String)

看spring关于这几个query的方法 :

如下:

public List queryForList(String statementName,

Object parameterObject) throws DataAccessException
Deprecated. 
Specified by:
queryForList in interface  SqlMapClientOperations
Throws:
DataAccessException - in case of errors
See Also:
SqlMapExecutor.queryForList(String, Object)

写 得那叫一个模糊啊!

see also

向下看,还有see Also,果断点进去看,(PS,在最新的spring 版本4.1中,SqlMapExecutor.queryForList(String, Object)并没有给我们加上链接,需要自己去google,一查是apache的东东。

如下 :

queryForList

public java.util.List queryForList(java.lang.String id,
                                   java.lang.Object parameterObject)
                            throws java.sql.SQLException
Executes a mapped SQL SELECT statement that returns data to populate a number of result objects.

The parameter object is generally used to supply the input data for the WHERE clause parameter(s) of the SELECT statement.

Parameters:
id - The name of the statement to execute.
parameterObject - The parameter object (e.g. JavaBean, Map, XML etc.).
Returns:
A List of result objects.
Throws:
java.sql.SQLException - If an error occurs.

id 中指出,是execute的名字,这个名字,是怎么来的呢?apache并没有告诉我们。


于是只好去查中文的解释和例子,

经过查询和探索,原来ibatis是通过xml配置,来读取这个name,

结合代码,如下:


这里的xml都是有规则的,

所以根据上面字符串GoodsBank.GetUPbank,找到文件,里面肯定有getUPBank方法,如下:已经标红。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">

<span style="color:#ff0000;"><sqlMap namespace="GoodsBank"></span>
	<typeAlias alias="GoodsBank" type="com.umpay.hfmng.model.GoodsBank" />
	<sql id="select_what">
		select merid,goodsid,bankid,amttype,kstate,buyprice,
		saleprice,amount,timeltd,verifytag,checkday,isrealtime,bankmerid,bankposid,modlock
		from umpay.t_goods_bank 
	</sql>

	<sql id="where_find">
		<dynamic prepend=" where ">
			<isNotEmpty property="merId" prepend=" and ">
				merId = #merId#
			</isNotEmpty>
			<isNotEmpty property="bankId" prepend=" and ">
				bankId = #bankId#
			</isNotEmpty>
			<isNotEmpty property="goodsId" prepend=" and ">
				goodsId = #goodsId#
			</isNotEmpty>
		</dynamic>
	</sql>

	<sql id="key_find">
		<dynamic prepend=" and  ">
			<isNotEmpty property="merId" prepend=" and ">
				merId = #merId#
			</isNotEmpty>
			<isNotEmpty property="goodsId" prepend=" and ">
				goodsId = #goodsId#
			</isNotEmpty>
		</dynamic>
	</sql>

	<statement id="Get" resultClass="GoodsBank">
		<include refid="select_what" />
		<include refid="where_find" />
	</statement>

	<statement id="FindHN" resultClass="GoodsBank">
		select merid,goodsid,bankid,kstate,amttype from umpay.t_goods_bank where bankid = 'XE371000' order by merid,goodsid 
	</statement>

	<statement id="GetXeOrMw" resultClass="GoodsBank">
		select * from umpay.t_goods_bank where 1=1
		<isNotEmpty property="merId" prepend=" and ">
			merId=#merId#
			</isNotEmpty>
		<isNotEmpty property="goodsId" prepend=" and ">
			goodsId=#goodsId#
			</isNotEmpty>
		<isNotEmpty property="bankId" prepend=" and ">
			bankId like #bankId#||'%'
			</isNotEmpty>
		<isNotEmpty property="modLock" prepend=" and ">
			modLock = #modLock#
			</isNotEmpty>
	</statement>
	<span style="color:#ff0000;"><statement id="GetUPbank" resultClass="GoodsBank"></span>
		select * from umpay.t_goods_bank where 1=1
		<isNotEmpty property="merId" prepend=" and ">
			merId=#merId#
			</isNotEmpty>
		<isNotEmpty property="goodsId" prepend=" and ">
			goodsId=#goodsId#
			</isNotEmpty>
		<isNotEmpty property="bankId" prepend=" and ">
			bankId like #bankId#||'%'
			</isNotEmpty>
		<isNotEmpty property="modLock" prepend=" and ">
			modLock = #modLock#
			</isNotEmpty>
	</statement>


	<statement id="updateGoodsBankLock" resultClass="integer">
		update umpay.t_goods_bank set modLock=#modLock#
		where merId=#merId# and goodsId=#goodsId# and bankId=#bankId#
	</statement>

	<statement id="checkFromTgoods" resultClass="GoodsInfo">
		select goodsId from umpay.t_goods_inf where 1=1
		<isNotEmpty property="goodsId" prepend=" and ">
			goodsId=#goodsId#
			</isNotEmpty>
		<isNotEmpty property="merId" prepend=" and ">
			merId=#merId#
			</isNotEmpty>
	</statement>
	<!--  根据商户号查商品号-->
	<statement id="GetGoodsByMerId" resultClass="GoodsInfo">
		select tgi.goodsId from umpay.t_goods_inf tgi ,umpay.t_hfgoods_exp tge
		where tgi.merId=tge.merId and tgi.goodsId=tge.goodsId

		<isNotEmpty property="merId" prepend=" and ">
			tgi.merId=#merId#
			</isNotEmpty>
	</statement>

	<statement id="insertGoodsBank" resultClass="GoodsBank">
		insert into umpay.t_goods_bank (merId,goodsId, bankId, modLock
		<isNotEmpty property="kState" prepend=" , "> kState </isNotEmpty>
		<isNotEmpty property="amount" prepend=" , "> amount </isNotEmpty>
		<isNotEmpty property="verifyTag" prepend=" , "> verifyTag
		</isNotEmpty>
		<isNotEmpty property="checkDay" prepend=" , "> checkDay
		</isNotEmpty>
		<isNotEmpty property="isRealTime" prepend=" , "> isRealTime
		</isNotEmpty>
		<isNotEmpty property="amtType" prepend=" , "> amtType
		</isNotEmpty>
		<isNotEmpty property="buyPrice" prepend=" , "> buyPrice
		</isNotEmpty>
		<isNotEmpty property="salePrice" prepend=" , "> salePrice
		</isNotEmpty>
		<isNotEmpty property="timeLtd" prepend=" , "> timeLtd
		</isNotEmpty>
		<isNotEmpty property="bankMerId" prepend=" , "> bankMerId
		</isNotEmpty>
		<isNotEmpty property="bankPosId" prepend=" , "> bankPosId
		</isNotEmpty>
		) values(#merId#,#goodsId#, #bankId#, 0
		<isNotEmpty property="kState" prepend=" , "> #kState#
		</isNotEmpty>
		<isNotEmpty property="amount" prepend=" , "> #amount#
		</isNotEmpty>
		<isNotEmpty property="verifyTag" prepend=" , "> #verifyTag#
		</isNotEmpty>
		<isNotEmpty property="checkDay" prepend=" , "> #checkDay#
		</isNotEmpty>
		<isNotEmpty property="isRealTime" prepend=" , "> #isRealTime#
		</isNotEmpty>
		<isNotEmpty property="amtType" prepend=" , "> #amtType#
		</isNotEmpty>
		<isNotEmpty property="buyPrice" prepend=" , "> #buyPrice#
		</isNotEmpty>
		<isNotEmpty property="salePrice" prepend=" , "> #salePrice#
		</isNotEmpty>
		<isNotEmpty property="timeLtd" prepend=" , "> #timeLtd#
		</isNotEmpty>
		<isNotEmpty property="bankMerId" prepend=" , "> #bankMerId#
		</isNotEmpty>
		<isNotEmpty property="bankPosId" prepend=" , "> #bankPosId#
		</isNotEmpty>
		)
	</statement>
	<statement id="updateGoodsBank" resultClass="GoodsBank">
		update umpay.t_goods_bank set modLock=0,modTime=CURRENT TIMESTAMP
		<isNotEmpty property="kState" prepend=" , "> kState=#kState#
		</isNotEmpty>
		<isNotEmpty property="amount" prepend=" , "> amount=#amount#
		</isNotEmpty>
		<isNotEmpty property="verifyTag" prepend=" , ">
			verifyTag=#verifyTag# </isNotEmpty>
		<isNotEmpty property="checkDay" prepend=" , ">
			checkDay=#checkDay# </isNotEmpty>
		<isNotEmpty property="isRealTime" prepend=" , ">
			isRealTime=#isRealTime# </isNotEmpty>
		<isNotEmpty property="amtType" prepend=" , "> amtType=#amtType#
		</isNotEmpty>
		<isNotEmpty property="buyPrice" prepend=" , ">
			buyPrice=#buyPrice# </isNotEmpty>
		<isNotEmpty property="salePrice" prepend=" , ">
			salePrice=#salePrice# </isNotEmpty>
		<isNotEmpty property="timeLtd" prepend=" , "> timeLtd=#timeLtd#
		</isNotEmpty>
		<isNotEmpty property="bankMerId" prepend=" , ">
			bankMerId=#bankMerId# </isNotEmpty>
		<isNotEmpty property="bankPosId" prepend=" , ">
			bankPosId=#bankPosId# </isNotEmpty>
		where merId=#merId# and goodsId=#goodsId# and bankId=#bankId#
	</statement>
	
	<!-- 根据商户、商品ID查询已开通的商品银行记录数 -->
	<statement id="queryOpenCount" resultClass="HashMap">
		select count(1) as num
		  from umpay.T_GOODS_BANK
		 where merId = #merId#
		   and goodsId = #goodsId#
		   and SUBSTR(char(kstate), 1, 1) = '1'
	</statement>

</sqlMap>

这样就找到了此方法,把第一个参数解决了。

那么,第二个参数Map是如何解决的呢?

API中提示:parameterObject - The parameter object (e.g. JavaBean, Map, XML etc.).

也就是任何类型了,结合 一、功能 中的中文介绍,是不是可以这样理解呢?

只要所传的参数,不管是String也好,JavaBean, Map, XML ,只要有此参数,它会自动匹配。

但是问题来了,匹配是一个什么样的过程呢?大小写会不会有影响?

这个留作以后研究。要看源码了。


这个方法就暂告一段落,我又忍不住向下看,

又看到一个方法:

queryForList

public java.util.List queryForList(java.lang.String id,
                                   int skip,
                                   int max)
                            throws java.sql.SQLException
Executes a mapped SQL SELECT statement that returns data to populate a number of result objects within a certain range.

This overload assumes no parameter is needed.

Parameters:
id - The name of the statement to execute.
skip - The number of results to ignore.
max - The maximum number of results to return.
Returns:
A List of result objects.
Throws:
java.sql.SQLException - If an error occurs

这个方法中,有两个int,这两个int参数,第一个是要ignore的,第二个是返回最大结果数目的。

第二个可以看懂,第一个什么意思呢?为什么要忽略呢!

apache仍然没有告诉我们,根据一 功能的中文介绍,才知道是查询记录中,忽略前几项,然后把需要返回的结果的条数拿回来。

看来还是要中英结合,才更明白。也需要经验的支撑。


最后还是要说,要懂技术,还是要看电影源代码

哈哈,It's a joke.

还是要看这些框架的源码


这样一步一步,从小到大,从深到广再到深,很多东西,就慢慢都渗透了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不止鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值