Mybatis系列第5篇:Mapper接口多种方式传参详解、原理、源码解析

对应的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中新增下面代码:

<![CDATA[ SELECT * FROM t_user WHERE id=#{id} OR name = #{name} ]]>

大家注意一下上面的取值我们是使用#{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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值