MyBatis中parameterType属性及参数传递

本文介绍了MyBatis中mapper文件中parameterType属性的使用,它用于指定SQL语句的参数类型,可以是基本类型、集合或POJO对象。通过示例展示了如何在测试代码中传入参数,并探讨了`#{}`与`${}`的区别:`#{}`是预编译参数,用于PreparedStatement,而`${}`是简单的字符串替换,适用于Properties文件的变量占位。另外,还提到了XML中CDATA区段的作用,用于包含特殊字符。

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

Mybatis中mapper文件中的sql语句映射是可以传递参数的,在<select>等标签中的parameter属性可以声明参数的类型,可以是基本数据类型,也可以是集合类型,还可以是pojo对象。例如:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="a.b">
	<select id="selById" resultType="com.test.pojo.People" parameterType="map">
		select * from people where id=${id} and name='${name}'
	</select>
	
	<select id="test" resultType="com.test.pojo.People" parameterType="int">
		<![CDATA[ select * from people where id<#{0} ]]>
	</select>
	
	<select id="page" resultType="People" parameterType="map">
		select * from people limit #{pageStart},#{pageSize}
	</select>
	
	<insert id="ins" parameterType="People">
		insert into people values(default,#{name},#{age})
	</insert>
	
	<update id="upd" parameterType="people">
		update people set name = #{name} where id = #{id}
	</update>
	
	<delete id="del" parameterType="int">
		delete from people where id = #{0} 
	</delete>
</mapper>

上面的mapper配置文件配置的sql语句映射都分别指定了需要传入的参数类型,在进行相应调用的时候需要传入参数。如下测试代码:

package com.test.main;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.test.pojo.People;

public class Test {
	public static void main(String[] args) throws IOException {
		InputStream is = Resources.getResourceAsStream("mybatis.xml");
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
		SqlSession session = factory.openSession();
		/*
		People peo = new People();
		Map<String,String> map = new HashMap<String,String>();
		map.put("id", "3");
		map.put("name", "aaaaaa");
		peo = session.selectOne("a.b.selById", map);
		System.out.println(peo);*/
		
		/*
		People peo =new People();
		peo.setId(1);
		//显示几个
		int pageSize = 2;
		//第几页
		int pageNumber = 2;
		//如果希望传递多个参数,可以使用对象或map
		Map<String,Object> map = new HashMap<>();
		map.put("pageSize", pageSize);
		map.put("pageStart", pageSize*(pageNumber-1));
		List<People> p = session.selectList("a.b.page",map);
		System.out.println();
		System.out.println(p.get(0));
		System.out.println(p.get(1));
		*/
		
		/*
		People p = new People();
		p.setName("新增name1");
		p.setAge(88);
		try {
			int index = session.insert("a.b.ins", p);
			if (index > 0) {
				System.out.println("成功");
			} else {
				System.out.println("失败");
			}
		} catch (Exception e1) {
			// e1.printStackTrace();
			session.rollback();
		}
		p.setName("aaaaaa");
		try {
			int index1 = session.insert("a.b.ins", p);
			if (index1 > 0) {
				System.out.println("成功");
			} else {
				System.out.println("失败");
			}
		} catch (Exception e) {
			// e.printStackTrace();
			session.rollback();
		}
		session.commit();
		*/
		
		 //实现修改id=3的name=王五,并输出执行结果
		 People peo = new People(); 
		 peo.setId(4); 
		 peo.setName("王五"); 
		 int index = session.update("a.b.upd", peo); 
		 if(index>0){
			 System.out.println("成功"); 
		 }else{ 
			 System.out.println("失败"); 
		 }
		 session.commit();
		 
		/**
		 * 删除id=3的数据
		 */
		// int del = session.delete("a.b.del",3);
		//
		// if(del>0){
		// System.out.println("成功");
		// }else{
		// System.out.println("失败");
		// }
		// session.commit();

		session.close();
		System.out.println("程序执行结束");
	}
}

注意观察会发现上面的mapper文件中的第一条sql语句映射是用的${},而其他的sql语句映射使用的是#{},它们的区别如下:
${}是Properties文件中的变量占位符,它可以用于标签属性值和 sql 内部,属于静态文本替换,比如上面的例子中${id}将会替换为传入的map中key为“id”的元素相应的value;
#{}是sql的参数占位符,Mybatis会将sql中的#{}替换为?号,在sql执行前会使用 PreparedStatement的参数设置方法,按序给 sql 的?号占位符设置参数值。

XML文档中所有的字符均会被解析器解析,只有CDATA区段中的文本会被解析器忽略。假如您在 XML 文档中放置了一个类似 “<” 字符,那么这个文档会产生一个错误,这是因为解析器会把它解释为新元素的开始,所以不能在XML文档中使用“<”等符号,可以将它们放在CDATA区段中。

<select id="test" resultType="com.test.pojo.People" parameterType="int">
		<![CDATA[ select * from people where id<#{0} ]]>
</select>

跟使用jdbc执行sql语句一样,执行select语句返回的是查询到的记录条数,执行insert、delete和update返回的是受影响的记录条数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值