Mybatis整理系列(01)————传入参数方式以及#{}与${}的区别

本文详细解析了MyBatis中各种参数传递方式,包括基本数据类型、复杂数据类型、Map及实体类的使用方法。同时,对比了#{}

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

原文地址 https://blog.youkuaiyun.com/javaloveiphone/article/details/52239006

一、在 MyBatis 的 select、insert、update、delete 这些元素中都提到了 parameterType 这个属性。MyBatis 现在可以使用的 parameterType 有基本数据类型和 JAVA 复杂数据类型

  • 基本数据类型:包含 int,String,Date 等。通过 #{参数名},只能传入一个参数;通过 #{0}、#{1}…… 索引方式,可以传入多个参数;如果通过 #{参数名} 传多个值,又不想使用索引方式,可以使用 @param() 注解。
  • 复杂数据类型:包含 JAVA 实体类、Map。通过 #{属性名} 或 #{map 的 KeyName} 即可获取传入的值

1、#{参数名},传入一个参数

DAO 方法:

public List<User> selectUserByOrgId(String orgId);

Mapper.xml:

<select id="selectUserByOrgId" parameterType="java.lang.String" resultType="user">
    select * from user where org_id = #{orgId}
</select>

service:

List<User> users = userDao.selectUserByOrgId("1");

2、#{0}、#{1}…… 索引方式,传入多个参数

DAO 方法:

public User selectUserByNameAndAge(String name,int age);

Mapper.xml:

<select id="selectUserByNameAndAge" resultType="user">
    select * from user where name = #{0} and age = #{1}
</select>

service:

User user = userDao.selectUserByNameAndAge("lucy",18);

3、#{参数名},传入多个参数,并且参数用 @param 注解

DAO 方法:

public User selectUserByNameAndAge(@param("name")String name,@param("age")int age);

Mapper.xml:

<select id="selectUserByNameAndAge" resultType="user">
    select * from user where name = #{name} and age = #{age}
</select>

service:

User user = userDao.selectUserByNameAndAge("lucy",18);

4、传入多个基本类型参数,参数用 map 封装,通过 #{mapKey} 取值

DAO 方法:

public User selectUserByNameAndAge(Map map);

Mapper.xml:

<select id="selectUserByNameAndAge" parameterType="Map" resultType="user">
    select * from user where name = #{name} and age = #{age}
</select>

service:

Map<String,Object> map=new HasMap<String,Object>();  
map.put("name","lucy");  
map.put("age",18);  
User user = userDao.selectUserByNameAndAge(map);

5、使用 map 封装实体类, 通过通过 #{mapKey.attributeName} 取值

DAO 方法:

public User selectUserByNameAndAge(Map map);

Mapper.xml:

<select id="selectUserByNameAndAge" parameterType="Map" resultType="user">
    select * from user where name = #{userParam.name} and age = #{userParam.age}
</select>

service:

User userParam = new User("lucy",18);

Map<String,Object> map=new HasMap<String,Object>();  
map.put("user",userParam);  
User user = userDao.selectUserByNameAndAge(map);

6、直接传入实体参数,通过 #{属性名} 取值

DAO 方法:

public User selectUserByNameAndAge(User userParam);

Mapper.xml:

<select id="selectUserByNameAndAge" parameterType="User" resultType="user">
    select * from user where name = #{userParam.name} and age = #{userParam.age}
</select>

service:

User userParam = new User("lucy",18);
User user = userDao.selectUserByNameAndAge(userParam);

二、#{} 与 ${} 的区别

#{}拿到值之后,拼装 sql,会自动对值添加引号”
${}则把拿到的值直接拼装进 sql,如果需要加单引号”,必须手动添加,一般用于动态传入表名或字段名使用,同时需要添加属性 statementType=”STATEMENT”,使用非预编译模式。

注:statementType:STATEMENT(非预编译),PREPARED(预编译)或 CALLABLE 中的任意一个,这就告诉 MyBatis 分别使用 Statement,PreparedStatement 或者 CallableStatement。默认:PREPARED。

使用 ${} 传参取值实例:
DAO 方法:

public List<User> selectUserByOrgId(String orgId);

Mapper.xml:

<select id="selectUserByOrgId" parameterType="java.lang.String" resultType="user" statementType="STATEMENT">
    select * from user where org_id = ${orgId}
</select>

service:

String orgId = "100";
orgId = "'" + orgId + "'";
List<User> users = userDao.selectUserByOrgId(orgId);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值