MyBatis的参数处理
1. parameterType 配置参数
1) 参数的使用说明
SQL语句传参,使用标签的 parameterType 属性来设定。
该属性的取值可以是基本类型,引用类型(例如:String 类型),还可以是实体类类型(POJO 类)。
同时也可以使用实体类的包装类,本章节将介绍如何使用实体类的包装类作为参数传递。
2) 参数配置的注意事项
parameterType配置参数:
在一个参数时可以忽略(可写可不写),
多个相同参数要写
多个不同参数不写
基本类型和String可以直接写类型名称也可以使用包名.类名的方式,例如:java.lang.String。
实体类类型,目前我们只能使用全限定类名。
究其原因,是mybaits在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名,而我们的是实体类并没有注册别名,所以必须写全限定类名。
2、parameterType 配置多参数方式
1. 传递 pojo 包装对象(自定义实体类封装参数,我们使用bean、pojo或entity来指代实体类)
开发中通过 pojo 传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数,Pojo 类中包含 pojo。
需求:根据用户名查询用户信息,查询条件放到 QueryVo 的 user 属性中。
1) 编写QueryVo
package cn.study.entity;
public class QueryVo {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
2) 编写持久层接口UserMapper
public interface UserMapper {
public List<User> getUserByLikeName(QueryVo queryVo);
}
3) 配置接口方法对应的sql文件
<select id="getUserByLikeName" parameterType="cn.offcn.entity.QueryVo" resultType="cn.offcn.entity.User">
select * from user where name like #{user.name}
</select>
4) 测试QueryVo对象作为参数
@Test
public void testGetUserByLikeName() throws Exception{
//获取SqlSession对象
SqlSession session = MyBatisUtils.getSession();
//调用SqlSession 创建 UserDao接口的代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
//创建User对象
User user=new User();
user.setName("%李%");
QueryVo queryVo=new QueryVo();
queryVo.setUser(user);
//调用deleteUser方法进行模糊查询
List<User> userList = userMapper.getUserByLikeName(queryVo);
userList.forEach(System.out::print);
//关闭连接
MyBatisUtils.close(session);
}
2. map集合数据作为参数的处理方式
1) 添加接口方法参数使用map集合
public List<User> getUserByGenderAndAge(Map<String,Object> map);
2) 配置接口对应的sql配置
<!--#{}中参数必须和Map集合中的key保存一致,表示取Map集合中指定key的值。-->
<select id="getUserByGenderAndAge" parameterType="java.util.Map" resultType="cn.offcn.entity.User">
select * from user where gender=#{sex} and age=#{age}
</select>
3) 测试map集合作为参数
@Test
public void testGetUserByGenderAndAge() throws Exception{
//获取SqlSession对象
SqlSession session = MyBatisUtils.getSession();
//调用SqlSession 创建 UserDao接口的代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
Map<String,Object> map=new HashMap<String,Object>();
map.put("sex","男");
map.put("age",22);
List<User> userList = userMapper.getUserByGenderAndAge(map);
userList.forEach(System.out::print);
//关闭连接
MyBatisUtils.close(session);
}
3. @Param方式解决多参数映射处理
1)@Param注解的介绍
@Param注解用于给方法内的参数取别名,当方法中拥有多个参数时,我们无法一次性将这些参数进行传递,
尤其多个参数具有不同的数据类型时无法传递,所以我们利用@Param给每个方法中的参数取一个别名,在映射文件中使用别名进行取值。
2) 添加接口方法参数使用@Param注解
public List<User> getUserByGenderAndBirthday(@Param("gen") String gender,Param("birth") Date birthday);
3) 配置接口对应的sql配置
<select id="getUserByGenderAndBirthday" resultType="cn.offcn.entity.User">
select * from user where gender=#{gen} and age=#{birth}
</select>
4) 测试注解方法
@Test
public void testGetUserByGenderAndBithday() throws Exception{
//获取SqlSession对象
SqlSession session = MyBatisUtils.getSession();
//调用SqlSession 创建 UserDao接口的代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR,1997);
calendar.set(Calendar.DAY_OF_MONTH,10);
calendar.set(Calendar.DAY_OF_MONTH,12);
Date birthday=calendar.getTime();
List<User> userList = userMapper.getUserByGenderAndBirthday("女",birthday);
userList.forEach(System.out::print);
//关闭连接
MyBatisUtils.close(session);
}
4.多参数映射处理其他方式(不推荐)
实体类对象User.java
package cn.study.entity;
import java.util.Date;
public class User {
private Integer id;
private String userName;
private String gender;
private Integer age;
private Date birthday;
public User(){}
public User(String userName, String gender, Integer age, Date birthday) {
this.userName = userName;
this.gender = gender;
this.age = age;
this.birthday = birthday;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getGender() {
return gender;
}
...
}
1、使用下标(argxx)
1) 添加接口方法参数
public List<User> getUserByGenderAndBirthday(String gender, Date birthday);
2) 添加接口方法参数
<select id="getUserByGenderAndBirthday" resultType="cn.offcn.entity.User">
select * from user where gender=#{arg0} and age=#{arg1}
</select>
2、参数全部属于一个实体类时,使用实体类对象属性
1) 添加接口方法参数
public List<User> getUserByGenderAndBirthday(User user);
2) 添加接口方法参数
<select id="getUserByGenderAndBirthday" parameterType="cn.offcn.entity.User" resultType="cn.offcn.entity.User">
select * from user where gender=#{gender} and age=#{birthday}
</select>