MyBatis获取参数值的两种方式:${}和#{}
- ${}的本质就是字符串拼接,#{}的本质就是占位符赋值。
- ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号。
JDBC原生的获取参数方式:
- String name;
- select * from where name = "'+ name+'";
复制代码- String sql = "select * from where name = ?";
复制代码 单个字面量类型的形参
- public interface UserMapper {
- /**
- * 根据用户名查询用户信息
- * @param username
- * @return
- */
- User getUserByUsername(String username);
- }
复制代码- <select id="getUserByUsername" resultType="User">
-
- select * from t_user where username = '${username}'
- </select>
复制代码- public class MyBatisTest {
- private static final Log logger = LogFactory.getLog(MyBatisTest.class);
- @Test
- public void test1() {
- try (InputStream is = Resources.getResourceAsStream("mybatis-config.xml");)
- {
- SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
- SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
- SqlSession sqlSession = sqlSessionFactory.openSession(true);
- UserMapper mapper = sqlSession.getMapper(UserMapper.class);
- User result = mapper.getUserByUsername("lisi");
- System.out.println(result);
- sqlSession.close();
- } catch (IOException e) {
- logger.error(e);
- }
- }
- }
复制代码注意:
若mapper接口中的方法形参为单个的字面量类型
此时可以使用${}和#{}以形参标识符获取参数的值,注意${}需要手动加单引号
多个字面量类型的形参
MyBatis自动添加形参到Map集合
mapper接口中的方法是多个形参时,在获取参数时,MyBatis会自动将参数添加到Map集合中,通过指定key的arg0,arg1...或param1,param2...的方式获取value。- /**
- * 检查用户登录
- * @param username
- * @param password
- * @return
- */
- User checkLogin(String username,String password);
复制代码- <select id="checkLogin" resultType="User">
-
- select * from t_user where username = #{param1} and password = #{param2}
- </select>
复制代码- @Test
- public void test2() {
- SqlSession sqlSession = SqlSessionUtil.getSqlSession();
- UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
- User user = userMapper.checkLogin("张三","123456");
- System.out.println(user);
- sqlSession.close();
- }
复制代码说明:
若mapper接口中的方法形参为多个的字面量类型
此时MyBatis会自动将这些参数放在map集合中,以两种方式存储数据:
1、以arg0,arg1...为键,以参数为值;
2、以param1,param2...为键,以参数为值;
因此只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号
Map集合类型的形参
创建Map集合,自定义key,通过key获取value。- /**
- * 验证登录(以Map集合为形参)
- * @param map
- * @return
- */
- User checkLoginByMap(Map<String,Object> map);
复制代码- <select id="checkLoginByMap" resultType="User">
-
- select * from t_user where username = #{username} and password = #{password}
- </select>
复制代码- @Test
- public void test3() {
- SqlSession sqlSession = SqlSessionUtil.getSqlSession();
- UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
- //创建Map集合
- Map<String, Object> map = new HashMap<>();
- //添加键值对
- map.put("username","李四");
- map.put("password","123456");
- User user = userMapper.checkLoginByMap(map);
- System.out.println(user);
- sqlSession.close();
- }
复制代码说明:
若mapper接口中的方法形参为Map集合类型的参数
此时可以手动创建map集合,将这些数据放在map中,只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号。
实体类型的形参
- /**
- * 添加用户
- * @return
- */
- int insertUser(User user);
复制代码- <insert id="insertUser">
- insert into t_user values(#{id},#{username},#{password},#{age},#{gender},#{email})
- </insert>
复制代码- @Test
- public void test4() {
- SqlSession sqlSession = SqlSessionUtil.getSqlSession();
- UserMapper mapper = sqlSession.getMapper(UserMapper.class);
- User user = new User(1001, "root", "123456", 15, "男", "root@qq.com");
- int result = mapper.insertUser(user);
- System.out.println("result-->:" + result);
- sqlSession.close();
- }
复制代码说明:
若mapper接口中的方法形参为实体类性参数:
此时可以使用${}和#{},通过访问实体类中的属性(这里的属性指实体类中的get/set方法去掉get/set同时首字母小写即为属性,而不是成员变量名获取相对应的属性值,注意${}需要手动加单引号。
@Param注解
- /**
- * 验证登录(使用@Param注解)
- * @param username
- * @param password
- * @return
- */
- User checkLoginByParam(@Param("username") String username,
- @Param("password") String password);
复制代码- <select id="checkLoginByMap" resultType="User">
-
- select * from t_user where username = #{username} and password = #{password}
- </select>
复制代码- @Test
- public void test5() {
- SqlSession sqlSession = SqlSessionUtil.getSqlSession();
- UserMapper mapper = sqlSession.getMapper(UserMapper.class);
- User user = mapper.checkLoginByParam("李四", "123456");
- System.out.println(user);
- sqlSession.close();
- }
复制代码说明:
在mapper接口中的方法形参上设置@Param注解:
此时,会将这些参数放在map集合中,两种获取方式:
1、以@Param注解的value属性值为键,以参数为值;
2、以param1,param2...为键,以参数为值;
只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |