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
- Specified by:
queryForList
in interfaceSqlMapClientOperations
- 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.
还是要看这些框架的源码
这样一步一步,从小到大,从深到广再到深,很多东西,就慢慢都渗透了。
- Spring apache ibatis query的深入浅出的探索过程
- SSI对struts、spring、ibatis三者的整合过程
- 极为简单的Spring+Ibatis调用存储过程
- 新的开始之Ibatis 整合Spring 调用存储过程
- ibatis + spring 的错误
- ibatis学习---ibatis与spring的整合
- ibatis(学习2)-- spring + ibatis的事务管理
- ibatis的探索和应用,实现ibatis的CRUD功能,ibatis的优缺点
- Spring与iBATIS的集成
- Spring与iBATIS的集成
- Spring与iBATIS的集成
- Spring与iBATIS的集成
- Spring与iBATIS的集成
- Spring与iBATIS的集成
- Spring与iBATIS的集成
- iBatis和Spring的整合
- IBatis与Spring的整合
- ibatis与spring的集成
- 尹孝孫 楸溪 門前刺紙欲生毛
- MPI编程简介
- C++ 精确计时类
- android4.4按键分析--触屏事件1
- 【Servlet】最简单的Servlet JavaWeb程序
- Spring apache ibatis query的深入浅出的探索过程
- JNDI环境简易搭建
- ios 调试
- arm bluez 移植(测试)
- Linux网络编程(2)简单的TCP回射服务器(Echo Server)
- 将文件保存到内存、SD以及获取手机内部存储与外部存储空间的大小
- 我们的空间是圆的么——基于Poicare的宇宙模型浅谈
- 【java】集合框架和map基础
- 小型机更换HBA卡步骤