MyBatis获取参数值的两种方式

打印 上一主题 下一主题

主题 858|帖子 858|积分 2574

MyBatis获取参数值的两种方式:${}和#{}


  • ${}的本质就是字符串拼接,#{}的本质就是占位符赋值。
  • ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号。
JDBC原生的获取参数方式:


  • 字符串拼接的方式
  1. String name;
  2. select * from where name = "'+ name+'";
复制代码

  • 占位符赋值的方式
  1. String sql = "select * from where name = ?";
复制代码
单个字面量类型的形参
  1. public interface UserMapper {
  2.     /**
  3.      * 根据用户名查询用户信息
  4.      * @param username
  5.      * @return
  6.      */
  7.     User getUserByUsername(String username);
  8. }
复制代码
  1. <select id="getUserByUsername" resultType="User">
  2.    
  3.     select * from t_user where username = '${username}'
  4. </select>
复制代码
  1. public class MyBatisTest {
  2.    private static final Log logger = LogFactory.getLog(MyBatisTest.class);
  3.     @Test
  4.     public void test1() {
  5.         try (InputStream is = Resources.getResourceAsStream("mybatis-config.xml");)
  6.         {
  7.             SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  8.             SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
  9.             SqlSession sqlSession = sqlSessionFactory.openSession(true);
  10.             UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  11.             User result = mapper.getUserByUsername("lisi");
  12.             System.out.println(result);
  13.             sqlSession.close();
  14.         } catch (IOException e) {
  15.             logger.error(e);
  16.         }
  17.     }
  18. }
复制代码
注意:
若mapper接口中的方法形参为单个的字面量类型
此时可以使用${}和#{}以形参标识符获取参数的值,注意${}需要手动加单引号
多个字面量类型的形参

MyBatis自动添加形参到Map集合

mapper接口中的方法是多个形参时,在获取参数时,MyBatis会自动将参数添加到Map集合中,通过指定key的arg0,arg1...或param1,param2...的方式获取value。
  1. /**
  2.   * 检查用户登录
  3.   * @param username
  4.   * @param password
  5.   * @return
  6.   */
  7. User checkLogin(String username,String password);
复制代码
  1. <select id="checkLogin" resultType="User">
  2.    
  3.     select * from t_user where username = #{param1} and password = #{param2}
  4. </select>
复制代码
  1. @Test
  2. public void test2() {
  3.     SqlSession sqlSession = SqlSessionUtil.getSqlSession();
  4.     UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  5.     User user = userMapper.checkLogin("张三","123456");
  6.     System.out.println(user);
  7.     sqlSession.close();
  8. }
复制代码
说明:
若mapper接口中的方法形参为多个的字面量类型
此时MyBatis会自动将这些参数放在map集合中,以两种方式存储数据:
1、以arg0,arg1...为键,以参数为值;
2、以param1,param2...为键,以参数为值;
因此只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号
Map集合类型的形参

创建Map集合,自定义key,通过key获取value。
  1. /**
  2.   * 验证登录(以Map集合为形参)
  3.   * @param map
  4.   * @return
  5.   */
  6. User checkLoginByMap(Map<String,Object> map);
复制代码
  1. <select id="checkLoginByMap" resultType="User">
  2.    
  3.     select * from t_user where username = #{username} and password = #{password}
  4. </select>
复制代码
  1. @Test
  2. public void test3() {
  3.     SqlSession sqlSession = SqlSessionUtil.getSqlSession();
  4.     UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  5.     //创建Map集合
  6.     Map<String, Object> map = new HashMap<>();
  7.     //添加键值对
  8.     map.put("username","李四");
  9.     map.put("password","123456");
  10.     User user = userMapper.checkLoginByMap(map);
  11.     System.out.println(user);
  12.     sqlSession.close();
  13. }
复制代码
说明:
若mapper接口中的方法形参为Map集合类型的参数
此时可以手动创建map集合,将这些数据放在map中,只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号。
实体类型的形参
  1. /**
  2. * 添加用户
  3. * @return
  4. */
  5. int insertUser(User user);
复制代码
  1. <insert id="insertUser">
  2.     insert into t_user values(#{id},#{username},#{password},#{age},#{gender},#{email})
  3. </insert>
复制代码
  1. @Test
  2. public void test4() {
  3.     SqlSession sqlSession = SqlSessionUtil.getSqlSession();
  4.     UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  5.     User user = new User(1001, "root", "123456", 15, "男", "root@qq.com");
  6.     int result = mapper.insertUser(user);
  7.     System.out.println("result-->:" + result);
  8.     sqlSession.close();
  9. }
复制代码
说明:
若mapper接口中的方法形参为实体类性参数:
此时可以使用${}和#{},通过访问实体类中的属性(这里的属性指实体类中的get/set方法去掉get/set同时首字母小写即为属性,而不是成员变量名获取相对应的属性值,注意${}需要手动加单引号。
@Param注解
  1. /**
  2. * 验证登录(使用@Param注解)
  3. * @param username
  4. * @param password
  5. * @return
  6. */
  7. User checkLoginByParam(@Param("username") String username,
  8.                                    @Param("password") String password);
复制代码
  1.     <select id="checkLoginByMap" resultType="User">
  2.    
  3.     select * from t_user where username = #{username} and password = #{password}
  4. </select>
复制代码
  1. @Test
  2. public void test5() {
  3.     SqlSession sqlSession = SqlSessionUtil.getSqlSession();
  4.     UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  5.     User user = mapper.checkLoginByParam("李四", "123456");
  6.     System.out.println(user);
  7.     sqlSession.close();
  8. }
复制代码
说明:
在mapper接口中的方法形参上设置@Param注解:
此时,会将这些参数放在map集合中,两种获取方式:
1、以@Param注解的value属性值为键,以参数为值;
2、以param1,param2...为键,以参数为值;
只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

小小小幸运

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表