一、简介
MyBatis 获取参数值的两种方式:${} 和 #{}。
${} 的本质就是字符串拼接,#{} 的本质就是占位符赋值。
${} 使用字符串拼接的方式拼接 sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是 #{} 使用占位符赋值的方式拼接 sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号。
二、单个字面量类型的参数
若 mapper 接口中的方法参数为单个的字面量类型,此时可以使用 ${} 和 #{} 以任意的名称获取参数的值,注意 ${} 需要手动加单引号。
package com.mybatis.mapper;
import com.mybatis.pojo.User;
public interface UserMapper {
User getUserByName(String name);
}
<?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="com.mybatis.mapper.UserMapper">
<!-- 第一种写法 -->
<select id="getUserByName" resultType="com.mybatis.pojo.User">
select * from user where name = #{name}
</select>
<!-- 第二种写法 -->
<select id="getUserByName" resultType="com.mybatis.pojo.User">
select * from user where name = #{aaa}
</select>
<!-- 第三种写法 -->
<select id="getUserByName" resultType="com.mybatis.pojo.User">
select * from user where name = '${name}'
</select>
<!-- 第四种写法 -->
<select id="getUserByName" resultType="com.mybatis.pojo.User">
select * from user where name = '${aaa}'
</select>
</mapper>
三、多个字面量类型的参数
若 mapper 接口中的方法参数为多个时,此时 MyBatis 会自动将这些参数放在一个 map 集合中,以 arg0,arg1...... 为键,以参数为值;以 param1,param2...... 为键,以参数为值。
因此只需要通过 ${} 和 #{} 访问 map 集合的键就可以获取相对应的值,注意 ${} 需要手动加单引号。
package com.mybatis.mapper;
import com.mybatis.pojo.User;
public interface UserMapper {
User checkUser(String name,int age);
}
<?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="com.mybatis.mapper.UserMapper">
<!-- 第一种写法 -->
<select id="checkUser" resultType="com.mybatis.pojo.User">
select * from user where name = #{arg0} and age = #{arg1}
</select>
<!-- 第二种写法 -->
<select id="checkUser" resultType="com.mybatis.pojo.User">
select * from user where name = #{param1} and age = #{param2}
</select>
<!-- 第三种写法 -->
<select id="checkUser" resultType="com.mybatis.pojo.User">
select * from user where name = #{arg0} and age = #{param2}
</select>
<!-- 第四种写法 -->
<select id="checkUser" resultType="com.mybatis.pojo.User">
select * from user where name = '${arg0}' and age = '${param2}'
</select>
</mapper>
四、map 集合类型的参数
若 mapper 接口中的方法需要的参数为多个时,此时可以手动创建 map 集合,将这些数据放在 map 中只需要通过 ${} 和 #{} 访问 map 集合的键就可以获取相对应的值,注意 ${} 需要手动加单引号,如下:
package com.mybatis.mapper;
import com.mybatis.pojo.User;
public interface UserMapper {
User checkUserByMap(Map<String,Object> map);
}
@Test
public void testGetUserByNameByMap() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new
SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String,Object> map = new HashMap<>();
map.put("name","张三1");
map.put("age",23);
User user = userMapper.checkUserByMap(map);
System.out.println(user);
}
<?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="com.mybatis.mapper.UserMapper">
<!-- 第一种写法 -->
<select id="checkUserByMap" resultType="com.mybatis.pojo.User">
select * from user where name = #{name} and age = #{age}
</select>
<!-- 第二种写法 -->
<select id="checkUserByMap" resultType="com.mybatis.pojo.User">
select * from user where name = '${name}' and age = '${age}'
</select>
</mapper>
五、实体类类型的参数
若 mapper 接口中的方法参数为实体类对象时,此时可以使用 ${} 和 #{},通过访问实体类对象中的属性名获取属性值,注意 ${} 需要手动加单引号,如下:
package com.mybatis.mapper;
import com.mybatis.pojo.User;
public interface UserMapper {
int insertUserByUser(User user);
}
<?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="com.mybatis.mapper.UserMapper">
<!-- 第一种写法 -->
<insert id="insertUserByUser">
insert into user values(null,#{name},#{email},#{age},#{sex})
</insert>
<!-- 第二种写法 -->
<insert id="insertUserByUser">
insert into user values(null,'${name}','${email}','${age}','${sex}')
</insert>
</mapper>
@Test
public void testInsertUser() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new
SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int result = userMapper.insertUserByUser(new User(null,"李四","123@qq.com",18,"男"));
System.out.println(result);
}
六、使用 @Param 标识参数
可以通过 @Param 注解标识 mapper 接口中的方法参数。
此时,会将这些参数放在 map 集合中,以 @Param 注解的 value 属性值为键,以参数为值;以 param1,param2... 为键,以参数为值;只需要通过 ${} 和 #{} 访问 map 集合的键就可以获取相对应的值,注意 ${} 需要手动加单引号。
package com.mybatis.mapper;
import com.mybatis.pojo.User;
public interface UserMapper {
User checkUserByParam(@Param("name") String name, @Param("age") int age);
}
<?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="com.mybatis.mapper.UserMapper">
<!-- 第一种写法 -->
<select id="checkUserByParam" resultType="com.mybatis.pojo.User">
select * from user where name = #{name} and age = #{age}
</select>
<!-- 第二种写法 -->
<select id="checkUserByParam" resultType="com.mybatis.pojo.User">
select * from user where name = #{param1} and age = #{param2}
</select>
<!-- 第三种写法 -->
<select id="checkUserByParam" resultType="com.mybatis.pojo.User">
select * from user where name = '${name}' and age = '${age}'
</select>
<!-- 第四种写法 -->
<select id="checkUserByParam" resultType="com.mybatis.pojo.User">
select * from user where name = '${param1}' and age = '${param2}'
</select>
</mapper>
@Test
public void testGetUserByName() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new
SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.checkUserByParam("张三1",23);
System.out.println(user);
}