Mybatis获得参数值的两种方式:#{}和${}的区别

#{}: 底层创建一个PreparedStatement对象.

${}:底层创建一个Statement对象.

preparedStatement和statement的区别:

preparedStatement:
支持通配符赋值,可以预编译sql语句

statement:
必须使用字符串拼接的方式操作sql语句,不能使用通配符,因为statement对象调用executeQuery(String sql)直接执行sql语句.
因此,在使用#{}传输实体类对象时,有字符串的地方不用加单引号’’,而使用${}拼接字符串时需要手动加上单引号’’.

而在传输数据的类型不同时也有区别:

在传输实体类对象使用#{}时:

< insert>
insert into user values (null,#{name},#{age},#{gender})
< /insert>

sql执行时转化为以下:

sql:insert into user values (null,?,?,?);

在传输实体类对象使用${}时:有字符串的地方使用单引号哦

< insert>
insert into user values (null,'${name}',${age},'${gender}')
< /insert>

执行时转化为以下:

sql:insert into user values (null,'张三',12,'男');

在传输单个String类型或基本数据类型时,因为#{}是通配符进行赋值,所以#{}里面的内容无论写什么,mybatis都可以进行赋值,但是建议与属性名保持一致

<select id="getUserByUid">
		select * from user where uid=#{uid}
	</select>

而${}在传输单个String类型或者基本数据类型时, $ {}里面只能填写value或者_parameter

<select id="getUserByUid">
		select * from user where uid=${value}
	</select>

总结:

传递不同参数类型,#{}和${} 的不同取值方式:

1,当传输类型为实体类对象时:

#{}和 $ {}都可以通过属性名直接获取参数值,但是要注意${}的单引号问题

2,当传输类型为单个字符串或者基本数据类型时:

#{} 可以通过属性名直接获取参数值
${}里面的值只能是value或者_parameter

3,当传输多个参数时:Mybatis会默认将这些参数放在map集合中,键为0,1,2…或者param1,param2,param3…

#{}:可以通过#{0},#{1};#{param1},#{param2}来获取参数值
${}:只能通过 ${param1}, ${param2}来获取参数值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值