MyBatis的参数处理——parameterType 如何配置参数

MyBatis的参数处理

1. parameterType 配置参数

1) 参数的使用说明

SQL语句传参,使用标签的 parameterType 属性来设定。
该属性的取值可以是基本类型,引用类型(例如:String 类型),还可以是实体类类型(POJO 类)。
同时也可以使用实体类的包装类,本章节将介绍如何使用实体类的包装类作为参数传递。

2) 参数配置的注意事项

parameterType配置参数:
	在一个参数时可以忽略(可写可不写),
	多个相同参数要写
	多个不同参数不写

基本类型和String可以直接写类型名称也可以使用包名.类名的方式,例如:java.lang.String。
实体类类型,目前我们只能使用全限定类名。
究其原因,是mybaits在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名,而我们的是实体类并没有注册别名,所以必须写全限定类名。

MyBatis的参数处理——parameterType 如何配置参数
MyBatis的参数处理——parameterType 如何配置参数

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>

MyBatis的参数处理——parameterType 如何配置参数

上一篇:一个static和面试官扯了一个小时,舌战加强版


下一篇:c# – 在数据库错误中找不到的SQL Server抛出程序集中创建自定义程序集