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

来源:互联网 发布:tk 域名 编辑:程序博客网 时间:2024/04/29 18:47

今天主要了解一下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) throwsDataAccessException

放在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,modlockfrom 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 tgewhere 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.

还是要看这些框架的源码


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


0 0
原创粉丝点击