Mybatis参数


一、单个简单类型参数

简单类型包括:
(七种基本数据类型)byte short int long float double char
(其中包装类)Byte Short Integer Long Float Double Character
String
java.util.Date
java.sql.Date
需求:根据name查、id查、birth查、sex查

准备一张表:t_student
在这里插入图片描述
准备表中数据:
在这里插入图片描述
搭框架省略(创建模块)
pojo:Student类 构造方法有参无参 setter getter方法 toString方法。
mapper:StudentMapper接口类以及StudentMapper.xml核心配置文件
util:工具类 返回session对象
resources:核心配置文件:
mybatis-config.xml
jdbc.properties
test:测试类 StudentMapperTest
在这里插入图片描述

1.接口中单个参数并且是简单数据类型

接口:

    /**
     * 当接口中的方法参数只有一个(单个参数),并且参数的数据类型都是简单类型
     * 根据id查询 name查询......
     */
    List<Student> selectById(Long id);
    List<Student> selectByName(String name);
    List<Student> selectByBirth(Date name);
    List<Student> selectBySex(Character name);

mapper.xml

    <select id="selectById" resultType="student">
        select * from t_student where id=#{id}
    </select>
    <select id="selectByName" resultType="student">
        select * from t_student where name=#{name}
    </select>
    <select id="selectByBirth" resultType="student">
        select * from t_student where birth=#{birth}
    </select>
    <select id="selectBySex" resultType="student">
        select * from t_student where sex=#{sex}
    </select>
<select id="selectById" resultType="student"> select标签中实际上还有一种属性parameterType="long"简单数据类型可省略 所以通常不写。Mybatis有自动类型推断机制。

测试:

 @Test
    public void testSelectById() throws IOException, ParseException {
        SqlSession session = SqlSessionUtil.openSession();
        StudentMapper mapper = session.getMapper(StudentMapper.class);
        //id
        List<Student> students = mapper.selectById(1L);
        //sex
        Character sex = Character.valueOf('男');
        List<Student> students1s = mapper.selectBySex(sex);
        //birth
        SimpleDateFormat spf = new SimpleDateFormat("yyyy-MM-dd"); //指定类型
        Date parse = spf.parse("1999-09-30"); //将字符串转为date类型
        List<Student> students2s = mapper.selectByBirth(parse);

        students.forEach(student->{
            System.out.println("根据id");
            System.out.println(student);
        });
        students1s.forEach(students1->{
            System.out.println("根据sex");
            System.out.println(students1);
        });
        students2s.forEach(students2->{
            System.out.println("根据birth");
            System.out.println(students2);
        });
        session.close();
    }

运行结果:
在这里插入图片描述

2.单个参数,类型是Map集合

接口:

    /**
     * 通过map集合保存学生信息,单个参数,但是参数的类型不是简单数据类型,是map集合
     * @param map
     * @return
     */
    int insertStudentByMap(Map<String,Object> map);

mapper.xml:

    <insert id="insertStudentByMap">
        insert into t_student(id,name,age,sex,birth,height)
        values(null,#{name},#{age},#{sex},#{birth},#{height})
    </insert>

测试:

    @Test
    public void testInsertByMap() throws IOException, ParseException {
        SqlSession session = SqlSessionUtil.openSession();
        StudentMapper mapper = session.getMapper(StudentMapper.class);
        Map<String,Object> map = new HashMap<>();
        map.put("name","小小川");
        map.put("age",24);
        Character sex = Character.valueOf('女');
        map.put("sex",sex);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = sdf.parse("1998-09-29");
        map.put("birth",date);
        map.put("height",1.78);
        int count = mapper.insertStudentByMap(map);
        System.out.println(count);
        session.commit();
        session.close();
    }

运行结果:
在这里插入图片描述

3.单个参数,类型是POJO类

直接new对象 不赘述

二、多个参数

1.用map

 * 如果是多个参数 Mybatis框架是如何做的?
 *  mybatis框架会自动创建一个map集合,并且map集合是以这种方式存储参数的
 *      map.put("arg0",name);
 *      map.put("arg1",sex);
 *      或者
 *      map.put("param1",name);
 *      map.put("param2",sex);
 * 混着用也可以

接口:

    /**
     * 根据name和sex查询student信息
     * @param name
     * @param sex
     * @return
     */
    List<Student> selectByNameAndSex(String name,Character sex);

mapper.xml文件

    <select id="selectByNameAndSex" resultType="student">
        select * from t_student
        where name=#{arg0} and sex=#{arg1}
    </select>

测试:

    @Test
    public void testSelectByNameAndSex() throws IOException, ParseException {
        SqlSession session = SqlSessionUtil.openSession();
        StudentMapper mapper = session.getMapper(StudentMapper.class);
        List<Student> students = mapper.selectByNameAndSex("小小川",'女');
        students.forEach(student -> {
            System.out.println(student);
        });
        session.close();
    }

运行结果:
在这里插入图片描述

2.用Param注解

可以自己指定map集合的key,通过注解告诉mybatis
接口:

/**
     * 根据name和sex查询student信息 param注解
     * @param name
     * @param sex
     * @return
     */
    List<Student> selectByNameAndSex2(@Param("name") String name, @Param("sex") Character sex);
mybatis框架底层的实现原理:
 *      map.put("name",name);
 *      map.put("sex",sex);

mapper.xml

    <select id="selectByNameAndSex2" resultType="student">
        select * from t_student
        where name=#{name} and sex=#{sex}
    </select>

测试:与2.1一致 改方法名即可
运行结果:同2.1
使用了@Param注解之后,arg0、arg1失效;param1、param2还可以用

Param注解源码分析

StudentMapper mapper = session.getMapper(StudentMapper.class);
mapper实际上是指向了代理对象
mapper.selectByNameAndSex("小小川",'女');
selectByNameAndSex是代理方法

在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值