对应的mapper xml中可以通过#{map中的key}
可以获取key在map中对应的value的值作为参数,如:
SELECT * FROM t_user WHERE id=#{id} OR name = #{name}
案例
下面我们通过map传递多个参数来按照id或者用户名进行查询。
com.javacode2018.chat03.demo4.mapper.UserMapper
中新增一个方法,和上面UserMapper.xml中的对应,如下:
/**
* 通过map查询
* @param map
* @return
*/
List getByMap(Map<String,Object> map);
注意上面的方法由2个参数,参数名称分别为id、name
,下面我们在对应的mapper xml中写对应的操作
chat03\src\main\resources\com\javacode2018\chat03\demo4\mapper\UserMapper.xml
中新增下面代码:
大家注意一下上面的取值我们是使用#{id}取id参数的值,#{name}取name参数的值,下面我们创建测试用例,看看是否可以正常运行?
Demo4Test
中新增下面方法:
/**
* 通过map给Mapper接口的方法传递参数
*/
@Test
public void getByName() {
try (SqlSession sqlSession = this.sqlSessionFactory.openSession(true)😉 {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
UserModel userModel = userMapper.getByName(“路人甲Java”);
log.info(“{}”, userModel);
}
}
运行一下上面的这个测试用例,输出:
01:28.242 [main] DEBUG c.j.c.d.mapper.UserMapper.getByMap - ==> Preparing: SELECT * FROM t_user WHERE id=? OR name = ?
01:28.277 [main] DEBUG c.j.c.d.mapper.UserMapper.getByMap - ==> Parameters: 1(Long), 张学友(String)
01:28.296 [main] DEBUG c.j.c.d.mapper.UserMapper.getByMap - <== Total: 2
01:28.297 [main] INFO c.j.chat03.demo4.Demo4Test - UserModel(id=1, name=路人甲Java, age=30, salary=50000.0, sex=1)
01:28.298 [main] INFO c.j.chat03.demo4.Demo4Test - UserModel(id=3, name=张学友, age=56, salary=500000.0, sex=1)
传递一个java对象参数
当参数比较多,但是具体有多少个参数我们是确定的时候,我们可以将这些参数放在一个javabean对象中。
如我们想通过userId和userName
查询,可以定义一个dto
对象,属性添加对应的get、set方法,如:
@Getter
@Setter
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserFindDto {
private Long userId;
private String userName;
}
注意上面的get、set方法我们通过lombok自动生成的。
UserMapper中新增一个方法,将UserFindDto
作为参数:
/**
* 通过UserFindDto进行查询
* @param userFindDto
* @return
*/
List getListByUserFindDto(UserFindDto userFindDto);
对应的UserMapper.xml中这么写,如下:
<![CDATA[ SELECT * FROM t_user WHERE id=#{userId} OR name = #{userName} ]]>Demo4Test
中创建一个测试用例来调用一下新增的这个mapper接口中的方法,如下:
@Test
public void getListByUserFindDto() {
try (SqlSession sqlSession = this.sqlSessionFactory.openSession(true)😉 {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
UserFindDto userFindDto = UserFindDto.builder().userId(1L).userName(“张学友”).build();
List userModelList = userMapper.getListByUserFindDto(userFindDto);
userModelList.forEach(item -> {
log.info(“{}”, item);
});
}
}
上面我们通过传递一个userFindDto
对象进行查询,运行输出:
20:59.454 [main] DEBUG c.j.c.d.m.U.getListByUserFindDto - ==> Preparing: SELECT * FROM t_user WHERE id=? OR name = ?
20:59.487 [main] DEBUG c.j.c.d.m.U.getListByUserFindDto - ==> Parameters: 1(Long), 张学友(String)
20:59.508 [main] DEBUG c.j.c.d.m.U.getListByUserFindDto - <== Total: 2
20:59.509 [main] INFO c.j.chat03.demo4.Demo4Test - UserModel(id=1, name=路人甲Java, age=30, salary=50000.0, sex=1)
20:59.511 [main] INFO c.j.chat03.demo4.Demo4Test - UserModel(id=3, name=张学友, age=56, salary=500000.0, sex=1)
传递java对象的方式相对于map的方式更清晰一些,可以明确知道具体有哪些参数,而传递map,我们是不知道这个map中具体需要哪些参数的,map对参数也没有约束,参数可以随意传,建议多个参数的情况下选择通过java对象进行传参。
传递多个参数
上面我们介绍的都是传递一个参数,那么是否可以传递多个参数呢?我们来试试吧。
案例
我们来新增一个通过用户id或用户名查询的操作。
com.javacode2018.chat03.demo4.mapper.UserMapper
中新增一个方法,和上面UserMapper.xml中的对应,如下:
/**
* 通过id或者na