本文主要实现本文主要实现《Java EE企业级应用开发教程(Spring+SpringMVC+Mybatis)》第2版中的第3章课后习题:学生信息管理系统。
(1)多条件查询
当用户输入的学生姓名不为空时,则只根据学生姓名进行学生信息的查询
当用户输入的学生姓名为空而学生专业不为空时,则只根据学生专业进行学生信息的查询
当用户输入的学生姓名和专业都为空,则要求查询出所有的学号不为空的学生信息
(2)单条件查询出所有id值小于5的学生的信息
前面的搭建过程参考第一章代码:IDEA(2020版)实现MyBatis入门程序 – 每天进步一点点
本文源代码(访问密码: 1542):
MyBatis03.zip: https://url47.ctfile.com/f/64055047-1502053786-268115?p=1542
可能遇到的报错:
java.io.IOException: Could not find resource mybatis-config.xml
IDEA 连接数据库报错Public Key Retrieval is not allowed
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 + '}';
}
}
创建完后如下:

下面要创建工具类;
因为要做增删改查操作,所以可以把第1章sqlSession部分封装一下,封装成工具类
右击“itheima—>New—>Package”

文件夹名称选择“utils”,然后回车

然后右击刚才创建的 utils文件夹,选择“New—>Java Class”

文件名称输入 MyBatisUtils,然后点击回车

代码参考如下:
package com.itheima.utils;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* 工具类
*/
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory = null;
// 初始化SqlSessionFactory对象
static {
try {
// 使用MyBatis提供的Resources类加载MyBatis的配置文件
Reader reader =
Resources.getResourceAsReader("mybatis-config.xml");
// 构建SqlSessionFactory工厂
sqlSessionFactory =
new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
e.printStackTrace();
}
}
// 获取SqlSession对象的静态方法
public static SqlSession getSession() {
return sqlSessionFactory.openSession();
}
}

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方法后,执行结果如下:
