关于向Mybatis传递多个参数进行SQL查询的用法

当只向xxxMapper.xml文件中传递一个参数时,可以简单的用“_parameter”来接收xxxMapper.java传递进来的参数,并代入查询,比如说这样:

(1)xxxMapper.java文件中这样定义:

List<String> selectAllAirportCode(Boolean mapping);

(2)这时在对应的xxxMapper.xml文件中可以使用“_parameter”来接收这个参数:

<select id="selectAllAirportCode" resultType="java.lang.String"
	parameterType="java.lang.Boolean">
	select DEPARTURE_AIRPORT from USR_AIR_LINE union select
	ARRIVAL_AIRPORT from USR_AIR_LINE
	<if test="_parameter == true">
		union select REL_DEPARTURE_AIRPORT from USR_AIR_LINE union
		select
		REL_ARRIVAL_AIRPORT from USR_AIR_LINE
	</if>
</select>

但是,如果在xxxMapper.java文件中传递进来多个参数,就不能使用上面这种形式来接收参数,这时可以有两种方案来解决这个问题:

一 向xml文件中传递进去一个Map<String, Object>集合,然后xml文件中就可以正常使用Map集合中的各个参数了。具体实例如下:

(1)xxxMapper.java文件中这样定义:

List<Airline> findAll(Map<String, Object> parms);

(2)在用到上面定义的具体实现类中给Map传参:

public List<Airline> findAll(PageInfo page,Airline airline) {
		HashMap<String,Object> params = new HashMap<String,Object>();
		params.put("page", page);
		params.put("airline", airline);

		return airlineMapper.findAll(params);
	}

(3)此时对应的xxxMapper.xml文件使用“java.util.Map”来接收这个Map集合:

<sql id="sqlfileders">
		<bind name="fileders"
			value="#{‘id‘:‘ID‘,‘departureAirport‘:‘DEPARTURE_AIRPORT‘,‘relDepartureAirport‘:‘REL_DEPARTURE_AIRPORT‘,‘arrivalAirport‘:‘ARRIVAL_AIRPORT‘,‘relArrivalAirport‘:‘REL_ARRIVAL_AIRPORT‘,‘popStatus‘:‘POP_STATUS‘,‘status‘:‘STATUS‘,‘creator‘:‘CREATOR‘,‘createTime‘:‘CREATE_TIME‘}" />
		<bind name="javapropertys"
			value="#{‘ID‘:‘id‘,‘DEPARTURE_AIRPORT‘:‘departureAirport‘,‘REL_DEPARTURE_AIRPORT‘:‘relDepartureAirport‘,‘ARRIVAL_AIRPORT‘:‘arrivalAirport‘,‘REL_ARRIVAL_AIRPORT‘:‘relArrivalAirport‘,‘POP_STATUS‘:‘popStatus‘,‘STATUS‘:‘status‘,‘CREATOR‘:‘creator‘,‘CREATE_TIME‘:‘createTime‘}" />
	</sql>
	<select id="findAll" resultMap="BaseResultMap" parameterType="java.util.Map">
    <![CDATA[
    	 select x.* from (
    		 select z.*, rownum numbers from (
    ]]>
		select
		<include refid="Base_Column_List" />
		from
		USR_AIR_LINE
		<where>
			<if test="airline.departureAirport != null">
				DEPARTURE_AIRPORT = #{airline.departureAirport}
			</if>
			<if test="airline.arrivalAirport != null">
				and ARRIVAL_AIRPORT=#{airline.arrivalAirport}
			</if>
			<if test="airline.relDepartureAirport != null">
				and REL_DEPARTURE_AIRPORT =
				#{airline.relDepartureAirport}
			</if>
			<if test="airline.relArrivalAirport != null">
				and REL_ARRIVAL_AIRPORT = #{airline.relArrivalAirport}
			</if>
			<if test="airline.popStatus != null">
				and POP_STATUS = #{airline.popStatus}
			</if>
			<if test="airline.status != null">
				and STATUS = #{airline.status}
			</if>
		</where>
		<if test="page.sortName != null">
			<include refid="sqlfileders" />
			<bind name="orderfield" value="#this.fileders[page.sortName]" />
			order by ${orderfield} ${page.sortOrder}
		</if>
    <![CDATA[ ) z where rownum < ]]>
		#{page.to}
    <![CDATA[ ) x where x.numbers >= ]]>
		#{page.from}
	</select>

注:上面的实例实现的是分页查询数据。我们可以发现使用Map来传递参数这种形式并不好,因为这样使得在接口中只有一个Map参数,其他人进行维护的时候并不清楚到底需要向这个Map里面传递什么参数进去

二 通过给参数添加@Param注解来解决问题:

(1)给xxxMapper.java文件的方法中的参数添加@Param注解,这个注解中的值对应xml文件中使用到的参数名称:

Airline selectEffectiveAirline(
			@Param("departureAirport") String departureAirport,
			@Param("arrivalAirport") String arrivalAirport,
			@Param("status") BigDecimal status);

(2)此时xxxMapper.xml文件中对应的地方就可以正常使用在@Param注解中对应的值了:

<select id="selectEffectiveAirline" resultMap="BaseResultMap">
		select
		<include refid="Base_Column_List" />
		from
		USR_AIR_LINE
		<where>
			<if test="departureAirport != null">
				DEPARTURE_AIRPORT = #{departureAirport}
			</if>
			<if test="arrivalAirport != null">
				and ARRIVAL_AIRPORT=#{arrivalAirport}
			</if>
			<if test="status != null">
				and STATUS = #{status}
			</if>
		</where>
	</select>

注:需要注意的是if条件判断中的参数和在SQL语句中写法是不一样的,if判断中的变量是没有添加#{ }的

时间: 2024-10-14 06:36:36

关于向Mybatis传递多个参数进行SQL查询的用法的相关文章

Mybatis传递多个参数

方法一: //DAO层的函数方法Public User selectUser(String name,String area); 对应的Mapper.xml <select id="selectUser" resultMap="BaseResultMap"> select * from user_user_t where user_name = #{0} and user_area=#{1} </select> 其中,#{0}代表接收的是da

Mybatis传递多个参数的解决办法 三种

第一种方案 DAO层的函数方法 Public User selectUser(String name,String area); 对应的Mapper.xml <select id="selectUser" resultMap="BaseResultMap"> select * from user_user_t where user_name = #{0} and user_area=#{1} </select> 其中,#{0}代表接收的是da

mybatis传递多个参数值(转)

Mybatis传递多个参数 ibatis3如何传递多个参数有两个方法:一种是使用Map,另一种是使用JavaBean. <!--    使用HashMap传递多个参数    parameterType 可以是别名或完全限定名 ,map->java.util.Map,这两个都是可以的   -->   <selectid="selectBlogByMap"parameterType="map"resultType="Blog"

mybatis 传递参数的方法总结

有三种mybatis传递参数的方式: 第一种 mybatis传入参数是有序号的,可以直接用序号取得参数 User selectUser(String name,String area); 可以在xml配置文件中写 <select id="selectUser" resultMap="BaseResultMap"> select * from user_user_t where user_name = #{0} and user_area=#{1} <

MyBatis传递参数

MyBatis传递参数 一.使用 map 接口传递参数 在 MyBatis 中允许 map 接口通过键值对传递多个参数,把接口方法定义为 : public List<Role> findRolesByMap(Map<String , Object> parameterMap); 此时,传递给映射器的是一个 map对象,使用它在 SQL 中设置对应的参数,如代码清单, 参数 roleName 和 note , 要求的是 map 的键 <select id=" find

MyBatis传入多个参数的问题

一.单个参数: public List<XXBean> getXXBeanList(String xxCode); <select id="getXXXBeanList" parameterType="java.lang.String" resultType="XXBean"> select t.* from tableName t where t.id= #{id} </select> 其中方法名和ID一致,

MyBatis - 输入和输出参数

基础知识 mybatis规定mapp.xml中每一个SQL语句形式上只能有一个@parameterType和一个@resultType 1. 返回值是一个对象的集合,@resultType中只能写该对象的类型,而不是写List<T> 2. 输入参数可以用#{}和${}两种取值方法,两者区别与联系: ① 当传入类型为JDBC基本类型(8种java基本类型+String)时,#{}里面可以写成任意值,${}里面必须写value ② 当传入类型为对象时,两种方式里面都应该写成类中属性名 ③ #{}方

问题:子信息不能够传递多个参数,利用脚本可以做到

问题:子信息不能够传递多个参数,利用脚本可以做到.1.加前端脚本function GridRowOnDblClick(strFile,pkValue,rowIndex){var ksrq = document.all.val_KSRQ.value;//2个控件的值var jsrq = document.all.val_JSRQ.value;//2个控件的值strFile=strFile+"&ksrq="+ksrq+"&jsrq="+jsrq;if (

MyBatis学习(二)、SQL语句映射文件(2)增删改查、参数、缓存

二.SQL语句映射文件(2)增删改查.参数.缓存 2.2 select 一个select 元素非常简单.例如: Xml代码   <!-- 查询学生,根据id --> <select id="getStudent" parameterType="String" resultMap="studentResultMap"> SELECT ST.STUDENT_ID, ST.STUDENT_NAME, ST.STUDENT_SEX