MyBatis参数详解(四天学会MyBatis之第五天)

MyBatis参数详解(四天学会MyBatis之第五天),第1张

MyBatis参数详解(四天学会MyBatis之第五天)

目录

1.parameterType

2.dao接口方法参数一个简单类型的参数

3.dao接口方法中有多个简单类型的参数

4.dao接口方法使用一个对象作为参数

5.dao接口中多个简单类型的参数,使用位置

6.dao接口参数是一个Map


参数就是通过java程序把数据传入到mapper文件中的sql语句。参数主要是指dao接口方法的形参

1.parameterType

parameterType:表示参数的类型,指定dao方法的形参数据类型。这个形参的数据类型是给mybatis使用。mybatis是给sql语句的参数赋值时使用。

PreparedStatement.setXXX(位置, 值)

要想理解这里必须对JDBC中的PreparedStatement有足够的了解,推荐看我之前写的一篇文章

一文学会JDBC(两万字,适用于新手)_ypxcan的博客-CSDN博客

我们来看mapper文件中select查询语句

    
        select id, name, email, age from student where id = #{studentId}
    

 我们在测试类中测试一下

发现是可以执行的

但是我们发现一个问题,好像parameterType不写也是可以的,没错,parameterType不是强制的,mybatis通过反射机制是可以得到参数类型的,绝大多数情况下我们不需要写这个参数。

2.dao接口方法参数一个简单类型的参数

如果dao接口中方法的形参是一个简单类型,那么mapper文件中,获取这个参数值,使用#{任意字符}

简单类型:八种基本类型 + String

我们来讲一个例子,首先在dao接口中定义一个方法

package com.lu.dao;

import com.lu.entity.Student;

public interface StudentDao {

    Student selectStudentByEmail(String email);
}

在mapper文件中来写查询代码





    
    
    
        select id, name, email, age from student where name = #{studentName} or age = #{studentAge}
    

在测试类中测试

    @Test
    public void testSelectByNameOrAge() {
        SqlSession session = MyBatisUtil.getSqlSession();
        StudentDao dao = session.getMapper(StudentDao.class);
        List students = dao.selectByNameOrAge("张三", 25);
        students.forEach(student -> System.out.println(student));
        session.close();
    }

控制台输出:

报错了,mybatis不能识别多个参数,所以这时候我们就需要使用@Param注解

该注解的使用位置在dao接口中

List selectByNameOrAge(@Param("myname") String name, @Param("myage") Integer age);

 当使用了@Param后,例如@Param("myname"),在mapper文件中,使用#{命名的参数},

例如#{myname},那么mapper文件中就需要改成

    
        select id, name, email, age from student where name = #{name} or age = #{age}
    

这里我们只写了name和age,那么测试类中就可以这么写

    @Test
    public void testSelectByObject() {
        SqlSession session = MyBatisUtil.getSqlSession();
        StudentDao dao = session.getMapper(StudentDao.class);

        Student student = new Student();
        student.setName("张三");
        student.setAge(25);
        List students = dao.selectByObject(student);
        students.forEach(stu -> System.out.println(stu));

        session.close();
    }

控制台输出:

可以看到可以正常输出

我们必须明白我们的参数不一定使我们定义的Student实体类,也可以是其他类,只要该类的属性有set和get方法即可

5.dao接口中多个简单类型的参数,使用位置

参数位置:dao接口中方法的形参列表,从左往右,参数位置是0,1,2...

语法格式:#{arg0},#{arg1}

下面来讲一个例子:

我们首先在接口中定义一个方法

    
    List selectByPosition(String name, Integer age);

 mapper文件中

    
        select id, name, email, age from student where name = #{myname} or age = #{myage}
    

 测试类中:

    @Test
    public void testSelectByMap() {
        SqlSession session = MyBatisUtil.getSqlSession();
        StudentDao dao = session.getMapper(StudentDao.class);

        //使用Map传递参数
        Map data = new HashMap<>();
        data.put("myname", "张三");
        data.put("myage", 20);
        List students = dao.selectStudentByMap(data);
        students.forEach(student -> System.out.println(student));

        session.close();
    }

控制台输出:

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5076170.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-16
下一篇 2022-11-16

发表评论

登录后才能评论

评论列表(0条)

保存