【MyBatis】多种参数处理

简介: 【MyBatis】多种参数处理

1. 单个简单类型参数:

  • mybatis会自动的进行类型推断, 因此parameterType属性可以不用写
  • 简单类型包括:
1. byte short int long float double char
2. Byte Short Integer Long Float Double Character
3. String
4. java.util.Date
5. java.sql.Date
parameterType属性的作用:
    告诉mybatis框架, 我的这个方法的参数类型是什么类型
    mybatis框架自带有类型自动推断机制, 所以大部分情况下parameterType都是可以省略不写的
sql语句最终是这样的:
    select * from student where id = ?
JDBC的代码一定要给?传值的 ,  怎么传值
    ps.setXxx(第几个问号, 传什么值)
    ps.setLong(1, 1L)
    ps.setString(1, "张三")
    mybatis底层就调用setXxx的哪个方法, 取决于parameterType的属性
// StudentMapper.xml
<select id="selectById" resultType="Student" parameterType="java.lang.Long">
    select * from student where id = #{id}
</select>
// 接口
public interface StudentMapper{
    List<Student> selectById(Long long);
}
// @test
public static void main(String[] args){
    SqlSession SqlSession = SqlSessionUtil.openSession();
    StudentMapper mapper = SqlSession.getMapper(StudentMapper.class);
    List<Student> students = mapper.selectById(1L);
    students.forEach(student -> System.out.println(student));
    SqlSession.close();
}
  • 单个参数Date类型:
// StudentMapper.xml
<select id="selectByBirth" resultType="Student">
    select * from student where birth = #{birth}
</select>
// 接口
public interface StudentMapper{
    List<Student> selectByBirth(Date birth);
}
// @test
public static void main(String[] args){
    SqlSession sqlSession = SqlSessionUtil.openSession();
    StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    Date birth = sdf.parse("2020-10-10");
    List<Student> students = mapper.selectByBirth(birth);
    students.forEach(student -> System.out.println(student));
    sqlSession.close();
}
// char --> Character
Character sex = Character.valueOf('男');
List<Student> students = mapper.selectBySex(sex);

2. Map参数:

// StudentMapper.xml
// #{}里面写的是map集合的key 
// 此处parameterType="map"省略不写也可以
<insert id="insertStudentByMap" parameterType="map">
    insert into student(id,name,age,sex,birth,height)
            values(null,#{姓名},#{年龄},#{性别},#{生日},#{身高})
</insert>
// 接口
public interface StudentMapper{
    int insertStudentByMap(Map<String,Object> map);
}
// @test
public static void main(String[] args) {
    SqlSession sqlSession = SqlSessionUtil.openSession();
    StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
    Map<String,Object> map = new HashMap<>();
    map.put("姓名","李四");
    map.put("年龄",6);
    map.put("身高",179);
    map.put("性别",'男');
    map.put("生日",new Date());
    mapper.insertStudentByMap(map);
    sqlSession.commit();
    sqlSession.close();
}

3. 实体类参数:

// StudentMapper.xml
// 此处parameterType="Student"省略不写,也可以
<insert id="insertStudentByPOJO" parameterType="Student">
    insert into student(id,name,age,sex,birth,height)
            values(null,#{name},#{age},#{sex},#{birth},#{height})
</insert>
// 接口
public interface StudentMapper{
    // student是单个参数, 不是简单类型
    int insertStudentByPOJO(Student student);
}
// @test
public static void main(String[] args) {
    SqlSession sqlSession = SqlSessionUtil.openSession();
    StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
    Student student = new Student(.....需要传的参数......);
    mapper.insertStudentByPOJO(student);
    sqlSession.commit();
    sqlSession.close();
}

4. 多参数:

4.1 arg0和arg1:

// StudentMapper.xml
<select id="selectByNameAndSex" resultType="Student">
    select * from student where name = #{arg0} and sex = #{arg1}
</select>
// 接口
public interface StudentMapper{
    // 多个参数!
    // mybatis底层会自动创建一个Map集合, 并且Map集合是以下面这种方式存储参数的.
    //     map.put("arg0",name);
    //     map.put("arg1",sex);
    //     map.put("param1",name);
    //     map.put("param2",sex);
    List<Student> selectBYNameAndSex(String name,Character sex);
}
// @test
public static void main(String[] args) {
    SqlSession sqlSession = SqlSessionUtil.openSession();
    StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
    List<Student> students = mapper.selectByNameAndSex("张三",'男');
    students.forEach(student -> System.out.println(student));
    sqlSession.close();
}

4.2 使用@Param注解:

  • 使用了@Param注解之后, 再使用arg0/arg就会报错, 使用param1/param2则不会
  • 核心: @Param("这里填写的其实就是map集合的key")
// StudentMapper.xml
// 此时大括号里面可以使用name,sex,param1, param2
<select id="selectByNameAndSex2" resultType="Student">
    select * from student where name = #{name} and sex = #{sex}
</select>
// 接口
public interface StudentMapper{
    // 多个参数!
    // mybatis框架底层的实现原理
    //     map.put("name",name);
    //     map.put("sex",sex);
    List<Student> selectBYNameAndSex2
            (@Param("name") String name, @Param("sex") Character sex);
}
// @test
public static void main(String[] args) {
    SqlSession sqlSession = SqlSessionUtil.openSession();
    StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
    List<Student> students = mapper.selectByNameAndSex2("张三",'男');
    students.forEach(student -> System.out.println(student));
    sqlSession.close();
}

4.3 @Param注解源码分析:

相关文章
|
6月前
|
SQL Java 数据库连接
Mybatis之核心配置文件详解、默认类型别名、Mybatis获取参数值的两种方式
【1月更文挑战第3天】 一、核心配置文件详解 二、默认的类型别名 三、MyBatis的增删改查 四、MyBatis获取参数值的两种方式 1、单个字面量类型的参数 2、多个字面量类型的参数 3、map集合类型的参数 4、实体类类型的参数 5、使用@Param标识参数
99 2
Mybatis之核心配置文件详解、默认类型别名、Mybatis获取参数值的两种方式
|
26天前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
30 10
|
2月前
|
SQL XML Java
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
文章介绍了MyBatis的简单增删改查操作,包括创建数据表、实体类、配置文件、Mapper接口及其XML文件,并解释了`#{}`预编译参数和`@Param`注解的使用。同时,还涵盖了resultType与resultMap的区别,并提供了完整的代码实例和测试用例。
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
|
4月前
|
Java 数据库连接 mybatis
Mybatis查询传递单个参数和传递多个参数用法
Mybatis查询传递单个参数和传递多个参数用法
63 11
|
4月前
|
SQL
自定义SQL,可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,如何自定义SQL呢?利用MyBatisPlus的Wrapper来构建Wh,在mapper方法参数中用Param注
自定义SQL,可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,如何自定义SQL呢?利用MyBatisPlus的Wrapper来构建Wh,在mapper方法参数中用Param注
|
5月前
|
Java 数据库连接 mybatis
mybatis参数报错Parameter ‘docId‘ not found. Available parameters are [arg1, arg0, param1, param2]
mybatis参数报错Parameter ‘docId‘ not found. Available parameters are [arg1, arg0, param1, param2]
|
6月前
|
SQL Java 数据库连接
Mybatis如何通过泛型来动态调整返回参数
Mybatis如何通过泛型来动态调整返回参数
445 0
|
6月前
|
XML Java 数据库连接
MyBatis 解决上篇的参数绑定问题以及XML方式交互
MyBatis 解决上篇的参数绑定问题以及XML方式交互
59 0
|
6月前
|
SQL Java 数据库连接
Mybatis拦截器实现带参数SQL语句打印
Mybatis拦截器实现带参数SQL语句打印