本文主要实现本文主要实现《Java EE企业级应用开发教程(Spring+SpringMVC+Mybatis)》第2版中的第3章课后习题:学生信息管理系统。

(1)多条件查询
当用户输入的学生姓名不为空时,则只根据学生姓名进行学生信息的查询
当用户输入的学生姓名为空而学生专业不为空时,则只根据学生专业进行学生信息的查询
当用户输入的学生姓名和专业都为空,则要求查询出所有的学号不为空的学生信息
(2)单条件查询出所有id值小于5的学生的信息

前面的搭建过程参考第一章代码:IDEA(2020版)实现MyBatis入门程序 – 每天进步一点点

本文源代码:https://box356.lanzoub.com/iV8C42t1vdwj

1.数据库部分
# 使用mybatis数据库
USE mybatis;
# 创建一个名称为dm_student的表
CREATE TABLE dm_student(
    id int(32) PRIMARY KEY AUTO_INCREMENT,
    name varchar(50),
    major varchar(50),
    sno varchar(16)
);
# 插入7条数据
INSERT INTO dm_student VALUES ('1', '张三', '数学', '10001');
INSERT INTO dm_student VALUES ('2', '李四', '英语', '10002');
INSERT INTO dm_student VALUES ('3', '王五', '计算机', '10003');
INSERT INTO dm_student VALUES ('4', '王刚', '化学', '10004');
INSERT INTO dm_student VALUES ('5', '李华', '物理', '10005');
INSERT INTO dm_student VALUES ('6', '李雷', '中文', '10006');
INSERT INTO dm_student VALUES ('7', '张飞', '英语', '10007');

执行结果如下:

2.创建实体类

右击pojo文件夹,New—>Java Class,名字写Student

参考代码如下:

package com.itheima.pojo;

/**
 * 学生持久化类
 */
public class Student {
    private Integer id;        //主键id
    private String name;      // 姓名
    private String major;     // 专业
    private String sno;        // 学号

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMajor() {
        return major;
    }

    public void setMajor(String major) {
        this.major = major;
    }

    public String getSno() {
        return sno;
    }

    public void setSno(String sno) {
        this.sno = sno;
    }

    @Override
    public String toString() {
        return "Student{" + "id=" + id +
                ", name='" + name + ", major=" + major +
                ", sno=" + sno + '}';
    }
}

创建完后如下:

3.创建mapper文件

右击mapper文件夹,选择New—>File

名字输入 StudentMapper.xml,代码参考如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.StudentMapper">
    <select id="findStudentByNameAndMajor"
            parameterType="com.itheima.pojo.Student"
            resultType="com.itheima.pojo.Student">
        select * from dm_student where 1=1
        <choose>
            <when test="name !=null and name !=''">
                and name like concat('%',#{name}, '%')
            </when>
            <when test="major !=null and major !=''">
                and major= #{major}
            </when>
            <otherwise>
                and sno is not null
            </otherwise>
        </choose>
    </select>

    <!--<foreach>遍历List -->
    <select id="findByList" parameterType="java.util.List"
            resultType="com.itheima.pojo.Student">
        select * from dm_student where id in
        <foreach item="id" index="index" collection="list"
                 open="(" separator="," close=")">
            #{id}
        </foreach>
    </select>

</mapper>

添加后如下:

4.修改mybatis-config.xml文件

打开mybatis-config.xml配置文件,添加内容如下:

<mapper resource="mapper/StudentMapper.xml"/>
5.修改测试类

打开测试类,修改代码如下:

package Test;

import com.itheima.pojo.Student;
import com.itheima.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

public class MyBatisTest {
    /**
     * 根据学生姓名或职业查询学生信息列表
     */
    @Test
    public void findStudentByNameOrMajorTest() {
        // 通过工具类生成SqlSession对象
        SqlSession session = MyBatisUtils.getSession();
        // Student,封装需要组合查询的条件
        Student student = new Student();
//        student.setName("张三");
//        student.setMajor("英语");
        // 执行SqlSession的查询方法,返回结果集
          List<Student> students = session.selectList("findStudentByNameAndMajor", student);
        // 输出查询结果信息
        for (Student student2 : students) {
            // 打印输出结果
            System.out.println(student2);
        }
        // 关闭SqlSession
        session.close();
    }

    /**
     * 根据学生id批量查询学生信息
     */
    @Test
    public void findByListTest() {
        // 获取SqlSession
        SqlSession session = MyBatisUtils.getSession();
        // 创建List集合,封装查询id
        List<Integer> ids = new ArrayList<Integer>();
        // 将小于5的id值放入list中
        for (int i = 1; i < 5; i++) {
            ids.add(i);
        }
        // 执行SqlSession的查询方法,返回结果集
        List<Student> students = session.selectList("findByList", ids);
        // 输出查询结果信息
        for (Student student : students) {
            // 打印输出结果
            System.out.println(student);
        }
        // 关闭SqlSession
        session.close();
    }

}
6.进行测试

(1)当用户输入的学生姓名不为空时,则只根据学生姓名进行学生信息的查询

修改测试类后,实现效果如下:

(2)当用户输入的学生姓名为空而学生专业不为空时,则只根据学生专业进行学生信息的查询

修改测试类后,实现效果如下:

(3)当用户输入的学生姓名和专业都为空,则要求查询出所有的学号不为空的学生信息

(4)单条件查询出所有id值小于5的学生的信息

执行findByListTest方法后,执行结果如下: