目录
#{}介绍
${}介绍
1.#{}的使用
1.1传入的是一个简单类型参数(int,String等)
1.2.传入的是多个简单类型参数
(1)通过param1,param2获取
(2)使用@Param()进行指定
(3)使用方法传入参数Map
2.${}
2.1使用${}进行模糊查询
2.2与#{}相同的地方
(1)当接受简单类型时
(2)当接受JavaBean类型时
总结
结语
#{}介绍
“#{}” 在MyBatis中代表一种占位符,相当于之前我们使用JDBC操作时的PreparedStatement中的“?"。
功能:可以接受输入的参数,在大括号中编写参数名称来接受对应的参数。它接受的类型可以是:基本数据类型、包装数据类型、普通的JavaBean类型或者HashMap类型。
${}介绍
“$ { }” 符号,表示拼接SQL语句串,即把接收的参数内容不加任何修饰地拼接在SQL中,注意,这个是没有占位符的,而是简单粗暴的进行直接拼接。
简单了解过后,一心同学将带领你们来玩转这两个符号。
1.#{}的使用
1.1传入的是一个简单类型参数(int,String等)
映射文件中可以不指定传入类型,并且可以对#{}中的参数名任意命名,因为Java反射只能获取方法参数的类型,但是无法得知方法参数的名字。
接口方法:
public Blog selectBlogById(int id);
映射文件:
<select id="selectBlogById" resultType="Blog">
select * from blog where id=#{yixin}
</select>
测试方法:
@Test
public void testId(){
SqlSession sqlSession= MybatisUtils.getSession();
BlogMapper mapper= sqlSession.getMapper(BlogMapper.class);
Blog blog=mapper.selectBlogById(1);
System.out.println(blog);
sqlSession.close();
}
1.2.传入的是多个简单类型参数
同样不需要指定传入类型,MyBatis识别到是多个参数,默认传入类似是map。
三种使用方式:
(1)通过param1,param2获取
(2)使用@Param()进行指定
(3)使用方法传入参数Map
(1)通过param1,param2获取
MyBatis会自动把传入的参数封装成一个map,默认通过“param1、param2···”的方式获取对象属性值,表示输入Map的第n个参数.
接口:
public Blog selectByTwo(int id,String name);
映射文件:
<select id="selectByTwo" resultType="Blog">
select * from blog where id=#{param1} and name=#{param2}
</select>
测试方法:
@Test
public void testSearchByTwo(){
SqlSession sqlSession= MybatisUtils.getSession();
BlogMapper mapper= sqlSession.getMapper(BlogMapper.class);
Blog blog=mapper.selectByTwo(1,"一心");
System.out.println(blog);
sqlSession.commit();
sqlSession.close();
}
(2)使用@Param()进行指定
可以用@Param()进行指定某个特定的key值来引用value
接口:
public Blog selectByTwo(@Param("id") int id,@Param("name") String name);
映射文件:
<select id="selectByTwo" resultType="Blog">
select * from blog where id=#{id} and name=#{name}
</select>
测试方法:
@Test
public void testSearchByTwo(){
SqlSession sqlSession= MybatisUtils.getSession();
BlogMapper mapper= sqlSession.getMapper(BlogMapper.class);
Blog blog=mapper.selectByTwo(1,"一心");
System.out.println(blog);
sqlSession.commit();
sqlSession.close();
}
(3)使用方法传入参数Map
把传入的参数包装成map,映射文件指定map的key值 接口:
public Blog selectByTwo(Map<String,Object> map);
映射文件:
<select id="selectByTwo" resultType="Blog">
select * from blog where id=#{mapId} and name=#{mapName}
</select>
测试方法:
@Test
public void testSearchByTwo(){
SqlSession sqlSession= MybatisUtils.getSession();
BlogMapper mapper= sqlSession.getMapper(BlogMapper.class);
Map<String,Object> map=new HashMap<String,Object>();
map.put("mapId",1);
map.put("mapName","一心");
Blog blog=mapper.selectByTwo(map);
System.out.println(blog);
sqlSession.commit();
sqlSession.close();
}
2.${}
注意:使用 “$ { }” 拼接符号拼接SQL语句,会引起SQL注入,所以一般不建议使用 “$ { }”。
使用场景:一般用来模糊查询。
2.1使用${}进行模糊查询
接口方法:
public Blog selectLike(@Param("column") String column,@Param("value") String value);
映射文件:
<select id="selectLike" resultType="Blog">
select * from blog where ${column} like concat('%',#{value},'%')
</select>
测试方法:
@Test
public void testSearchLike(){
SqlSession sqlSession= MybatisUtils.getSession();
BlogMapper mapper= sqlSession.getMapper(BlogMapper.class);
Blog blog=mapper.selectLike("name","心");
// Blog blog=mapper.selectLike("pwd","123");
System.out.println(blog);
sqlSession.commit();
sqlSession.close();
}
?
2.2与#{}相同的地方
当然,${}在某种情况下也是可以实现与#{}同样的功能
(1)当接受简单类型时
"${}" 中只能写"value",而不能是其他的名称!!!
接口方法:
public Blog selectById2(int id);
映射文件:
<select id="selectById2" resultType="Blog">
select * from blog where id=${value}
</select>
测试方法:
@Test
public void testSearchById2(){
SqlSession sqlSession= MybatisUtils.getSession();
BlogMapper mapper= sqlSession.getMapper(BlogMapper.class);
Blog blog=mapper.selectById2(1);
System.out.println(blog);
sqlSession.commit();
sqlSession.close();
}
(2)当接受JavaBean类型时
当接受JavaBean类型时,会跟#{}一样读取对象中的属性值
接口:
public Blog selectById3(Blog blog);
映射文件:
<select id="selectById3" parameterType="Blog" resultType="Blog">
select * from blog where name="${name}" and pwd="${pwd}"
</select>
注意:由于${}是直接拼接,所以要加上双引号"".
测试方法:
@Test
public void testSearchById3(){
SqlSession sqlSession= MybatisUtils.getSession();
BlogMapper mapper= sqlSession.getMapper(BlogMapper.class);
Blog b=new Blog();
b.setName("一心");
b.setPwd("123456");
Blog blog=mapper.selectById3(b);
System.out.println(blog);
sqlSession.commit();
sqlSession.close();
}
总结
1、关键字作为参数,使用${},两边不加"",如果想要作为参数值传递,则注意属性如果是字符串的,要加上""。
2、非关键字作为参数,使用"#{}"注入。
结语
以上就是一心同学用通俗易懂的文笔向大家详解MyBatis映射文件中#{}和${}的使用以及两者之间的区别,下一个博客将继续讲解映射文件中的其它属性。
?
|