刚刚学习Mybatis,认识到增删改查这些操作都只能传入一个参数,传出一个参数。如果需要传入或传出好几个参数,则有两种方法:
方法1::这就需要定义PO(Persistent Object)类。我理解的PO类就是主要用来和数据库打交道的,该类的变量基本上都要在数据库表中存在(有可能分布在多张表中,比如将多表查询时获得的结果放到PO类中)。随便说一下VO类(Value Object),我理解的VO类主要用来实现实际的业务需求的,是对应我们现实生活中的某些事物的。PO和VO可以相互转换(通过属性与属性的对应,有可能需要若干个VO类才能构造成一个PO类)
插入某个类时:类中的属性和表中的字段对应
<insert id="addUser" parameterType="com.henrykin.po.User" >
</selectKey>
insert INTO `user` (username,sex,birthday,address) values(#{username},#{sex},#{birthday},#{address})
</insert>
当对某个字段进行模糊查询时:可以这样
<!-- 自定义条件查询用户列表 -->
<select id="findUserByName" parameterType="java.lang.String"
resultType="com.henrykin.po.User">
select * from user where username like '%${name}%'
</select>
可是如果要对多个字段进行模糊查询时,我就不确定该怎么做了,因为只能传入一个参数。我尝试将多个字段组成一个PO类,然后传入这个PO类。下面的NameAndAddress是自定义的PO类,类中有name和address成员变量,生成getter,setter方法。
如:下面展示两个字段:
<!-- 自定义条件查询用户列表 -->
<select id="findUserByNameAndAddress" parameterType="com.henrykin.po.NameAndAddress"
resultType="com.henrykin.po.User">
select * from user where username like '%${name}%' and address like '%${adress}%'
</select>
结果是可以的。
方法2:使用HashMap作为传入参数:
UserMapper.xml局部:其中传入参数类型HashMap,可以写成HashMap/Hashmap/hashmap/hashMap中的任一种。
<!-- 自定义条件查询用户列表 -->
<select id="getUserByColumn_Hashmap" parameterType="hashmap"
resultType="com.henrykin.po.User">
select * from user where ${columnName} like '%${columnValue}%'
</select>
测试代码局部:
传递的map中的key和sql中解析的key要一致,
如果不一致,测试结果没有报错,只是通过key获取值为空。
HashMap<String, Object> map = new HashMap<>();
map.put("columnName", "username");
map.put("columnValue", "li");
List<User> users = mapper.getUserByColumn_Hashmap(map);
总结: 总之记住一点,传入传出都只有一个参数,当不能满足需求时,就可以自己根据需求定义PO类或者使用hashMap。