`
8366
  • 浏览: 811395 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

第10讲 --iBATIS查询条件为多个参数

阅读更多

 

当查询记录的时候,过滤记录的条件为多个的时候你就不能使用 parameterClass=int 等了,这个参数只能使用一次。

 

有两种解决方案:

1.使用对象构造查询参数

 

步骤:

a.改写student.xml

 

 

<select id="selectStudentByIdAndName" resultClass="Student" parameterClass="Student">
    select * from student where  sid=#sid# and sname=#sname#
</select>

 

b.写实现

 

	public Student queryStudentsByNameAndId(Student student)
	{
		Student s=null;
		try {
			s=(Student)sqlMapClient.queryForObject("selectStudentByIdAndName",student);
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return s;
	}

 

c.测试

		StudentDAO studentDAO=new StudentDAOImpl();
		Student student=new Student();
		student.setSid(326);
		student.setSname("胡晓亮3");
		Student s=studentDAO.queryStudentsByNameAndId(student);
		log.info("score: "+s.getBirth());

 

d.结果

172  [main] INFO  cn.com.xinli.ibatis.dao.impl.StudentDAOImpl(160) - score: 2009-06-17 

 

 

 

2.使用map封装查询参数

 

a.改写student.xml,map 的定义一定要在sql的前面,第一次我做连写的时候就吧map的定义放在了后面,结果老是报错,说找不到map的定义,还就得就是 占位符一定要使用 ? 号

<parameterMap class="java.util.HashMap" id="parameterMap">
	<parameter property="sid"/>
	<parameter property="sname"/>
</parameterMap>

<select id="selectStudentByIdAndName" resultClass="Student" parameterMap="parameterMap">
    select * from student where  sid=? and sname=?
</select>

 

b.实现

public Student queryStudentsByNameAndId(HashMap<String,String> hashMap)
	{
		Student s=null;
		try {
			s=(Student)sqlMapClient.queryForObject("selectStudentByIdAndName",hashMap);
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return s;
	}

 

c.测试

 

		StudentDAO studentDAO=new StudentDAOImpl();
		HashMap m=new HashMap();
		
		m.put("sname", "胡晓亮3");
		m.put("sid", 12434);
		
		Student s=studentDAO.queryStudentsByNameAndId(m);
		log.info("score: "+s.getBirth());

 

d.结果

 

172  [main] INFO  cn.com.xinli.ibatis.dao.impl.StudentDAOImpl(160) - score: 2009-06-17

 

 

分享到:
评论
2 楼 hu401348817 2013-07-18  
点虫虫 写道
想请教个问题:
多个参数,用map,但是where的写法如下,当使用?就出错,提示
No value specified for parameter X,这个X的值跟修改成?的值不一样,例如修改第一个#type#成?,就提示No value specified for parameter 3
不太明白。

	<!--获取邮件列表-->
	<parameterMap id="getMail_map" class="java.util.HashMap">   
    	<parameter property="type" jdbcType="INTEGER" javaType="java.lang.Integer" mode="IN"/>  
    	<parameter property="userId" jdbcType="INTEGER" javaType="java.lang.Integer" mode="IN"/>  
    	<parameter property="start" jdbcType="INTEGER" javaType="java.lang.Integer" mode="IN"/>  
    	<parameter property="num" jdbcType="INTEGER" javaType="java.lang.Integer" mode="IN"/>  
	</parameterMap>

	<select id="getMails" parameterMap="getMail_map" resultClass="com.game.model.Mail">
		select * from mail
		<dynamic prepend="where">
			<isNotEmpty prepend="and" property="type">
			type=#type#
			</isNotEmpty>
			<isNotEmpty prepend="and" property="reciver">
			reciver=#reciver#
			</isNotEmpty>
			limit #start#,#num#
		</dynamic>
	</select>


必须写成#XXX#这样才行。

点虫虫 写道
想请教个问题:
多个参数,用map,但是where的写法如下,当使用?就出错,提示
No value specified for parameter X,这个X的值跟修改成?的值不一样,例如修改第一个#type#成?,就提示No value specified for parameter 3
不太明白。

	<!--获取邮件列表-->
	<parameterMap id="getMail_map" class="java.util.HashMap">   
    	<parameter property="type" jdbcType="INTEGER" javaType="java.lang.Integer" mode="IN"/>  
    	<parameter property="userId" jdbcType="INTEGER" javaType="java.lang.Integer" mode="IN"/>  
    	<parameter property="start" jdbcType="INTEGER" javaType="java.lang.Integer" mode="IN"/>  
    	<parameter property="num" jdbcType="INTEGER" javaType="java.lang.Integer" mode="IN"/>  
	</parameterMap>

	<select id="getMails" parameterMap="getMail_map" resultClass="com.game.model.Mail">
		select * from mail
		<dynamic prepend="where">
			<isNotEmpty prepend="and" property="type">
			type=#type#
			</isNotEmpty>
			<isNotEmpty prepend="and" property="reciver">
			reciver=#reciver#
			</isNotEmpty>
			limit #start#,#num#
		</dynamic>
	</select>


必须写成#XXX#这样才行。


请教高手一个问题
如果我从另一个xml配置文件中调用getMails方法,我应该如何传参数

1 楼 点虫虫 2011-07-26  
想请教个问题:
多个参数,用map,但是where的写法如下,当使用?就出错,提示
No value specified for parameter X,这个X的值跟修改成?的值不一样,例如修改第一个#type#成?,就提示No value specified for parameter 3
不太明白。

	<!--获取邮件列表-->
	<parameterMap id="getMail_map" class="java.util.HashMap">   
    	<parameter property="type" jdbcType="INTEGER" javaType="java.lang.Integer" mode="IN"/>  
    	<parameter property="userId" jdbcType="INTEGER" javaType="java.lang.Integer" mode="IN"/>  
    	<parameter property="start" jdbcType="INTEGER" javaType="java.lang.Integer" mode="IN"/>  
    	<parameter property="num" jdbcType="INTEGER" javaType="java.lang.Integer" mode="IN"/>  
	</parameterMap>

	<select id="getMails" parameterMap="getMail_map" resultClass="com.game.model.Mail">
		select * from mail
		<dynamic prepend="where">
			<isNotEmpty prepend="and" property="type">
			type=#type#
			</isNotEmpty>
			<isNotEmpty prepend="and" property="reciver">
			reciver=#reciver#
			</isNotEmpty>
			limit #start#,#num#
		</dynamic>
	</select>


必须写成#XXX#这样才行。

相关推荐

    Manning Ibatis In Action Jan 2007 Ebook-Bbl.pdf

    根据提供的文件信息,我们可以从《ibatis in action》这本电子书中提炼出多个与iBATIS框架相关的知识点。以下是对这些知识点的详细说明: ### 一、iBATIS概述 **标题**: "Manning Ibatis In Action Jan 2007 Ebook...

    iBatis-JPetStore-5.0

    在`sqlmapconfig.xml`中,你可以定义多个数据源,以适应多数据库环境。 **4. SQL映射文件** SQL映射文件(如`*.xml`)是iBatis的核心,其中包含了各种SQL语句和结果映射。映射文件中,每个`&lt;select&gt;`, `&lt;insert&gt;`, ...

    iBATIS实战

    第10章 iBATIS数据访问对象 173 10.1 隐藏实现细节 173 10.1.1 为何要分离 174 10.1.2 一个简单示例 175 10.2 配置DAO 177 10.2.1 properties元素 177 10.2.2 context元素 178 10.2.3 transactionManager元素 178 ...

    Spring+Ibatis 访问多个数据源

    下面将详细介绍如何在Spring中配置和使用多个数据源,以及结合Ibatis进行数据访问。 首先,我们需要在`jdbc.properties`文件中配置每个数据源的相关参数,如驱动类名、URL、用户名和密码。在这个例子中,有两个数据...

    ibatis文档

    8. **结果集映射**:讲解了如何映射查询结果到Java对象,包括单一结果集和多个结果集的处理。 9. **参数映射**:讨论了如何将Java方法的参数映射到SQL语句中的参数,包括基本类型、复杂对象和自定义类型处理器。 ...

    MyBatis技术文档.pdf

    - 将多个参数封装到 Map 对象中传递。 4. **实体类类型的参数**: - 使用 Java 实体类作为参数传递。 5. **使用 @Param 标识参数**: - 当方法中有多个同类型参数时,需要使用 @Param 注解来区分。 #### 六、...

    mysql优化提高百万条数据的查询速度[参考].pdf

    11. 在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引。 12. 不要写一些没有意义的查询,如需要生成一个空表结构,可以使用create table代替...

    iBatis习惯用的16条SQL语句

    在查询时,当参数类型是HashMap时,可以方便地传递多个参数,例如按条件筛选并分组: ```xml select actionId, count(*) as count from MemberAccessLog where memberId = #memberId# and accessTimestamp ...

    springmybatis

    查询出列表,也就是返回list, 在我们这个例子中也就是 List&lt;User&gt; , 这种方式返回数据,需要在User.xml 里面配置返回的类型 resultMap, 注意不是 resultType, 而这个resultMap 所对应的应该是我们自己配置的 ...

    spring chm文档

    9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 插入事务操作 9.5.8. 结合AspectJ使用 @Transactional 9.6. 编程...

    Spring-Reference_zh_CN(Spring中文参考手册)

    处理多个持久化单元 12.6.2. JpaTemplate 和 JpaDaoSupport 12.6.3. 基于原生的JPA实现DAO 12.6.4. 异常转化 12.6.5. 事务管理 12.6.6. JpaDialect III. Web 13. Web框架 13.1. 介绍 13.1.1. 与其他web框架的集成 ...

    AppFramework_V1.0

    它把所有的SQL脚本以模板的方式集中到若干个XML配置文件里,用反射的方式向把C#类实体对象属性与SQL模板的参数绑定,动态生成参数化的SQL语句发送给数据库执行,查询的结果集也用反射的方式构造为对象集合返回给程序...

    Hitis V1.1.1

    (7)在ibatis中,会依赖这样那样的jar包,虽然不多,但总有几个吧,但Hitis,不依赖任何第三方jar包 (8)在Hitis中,...,你不心动吗?不想试用一下吗?试试用吧,永久开源的,放心用吧... New Features In Hitis V...

    MyBatis 3.4.1 jar包和源代码

    MyBatis是一个流行的Java EE应用程序开发中的对象关系映射(ORM)框架,它允许程序员将SQL查询与Java代码集成,从而简化数据访问层的开发。3.4.1是MyBatis的一个稳定版本,提供了许多改进和新特性。在这个版本中,...

    Mybatis使用案例

    第一级缓存是SqlSession级别的,同一SqlSession内的多次查询不会重复执行。第二级缓存是全局的,跨SqlSession共享,可以通过配置开启和自定义实现。 8. **事务管理** Mybatis允许开发者通过SqlSession的begin...

    阿里巴巴Java编码规范考题.doc

    《阿里巴巴Java编码规范考题》文档中涵盖了多个关于Java编程的重要知识点,这些知识点对于遵循最佳实践、提高代码质量和可维护性至关重要。以下是这些知识点的详细解释: 1. **变量命名**:在Java中,变量命名应...

Global site tag (gtag.js) - Google Analytics