★学习目标:
完成一个学生信息查询系统,能够实现如下功能多条件查询、单条件查询查询出所有id值小于5的学生的信息
★思考任务:
MyBatis动态SQL中多条件查询、单条件查询的基本步骤是怎么样的?
★任务学习:
★知识要点:
学生信息查询系统的功能
本章对MyBatis的动态SQL进行了详细讲解,包括使用动态SQL进行条件查询、更新以及复杂查询操作。本案例要求利用本章所学知识完成一个学生信息查询系统,该系统要求实现2个以下功能。
多条件查询
当用户输入的学生姓名不为空,则只根据学生姓名进行学生信息的查询;
当用户输入的学生姓名为空,而学生专业不为空,则只根据学生专业进行学生的查询;
单条件查询
查询出所有id值小于5的学生的信息;
项目搭建:创建一个名称为mybatis-demo03的项目,项目的具体搭建过程请参考1.3节。
数据准备:在名称为mybatis的数据库中,创建一个dm_student表,并插入几条测试数据。
USE mybatis;
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');
POJO类准备:在项目src/main/java目录下创建com.itheima.pojo包,在该包下创建持久化类Student,在类中声明id、name、major和sno属性,以及属性对应的getter/setter方法。
public class Student {// 定义变量主键id,姓名name,专业major,学号sno
private Integer id; private String name;
private String major;
private String sno;
// 省略getter/setter方法
@Override
public String toString() {
return “Student{” + “id=” + id + “, name=‘” + name + “, major=" + major + ", sno=" + sno + '}';}}
创建映射文件:在项目src/main/java目录下创建com.itheima.mapper包,在该包下创建映射文件StudentMapper.xml,编写根据学生姓名和专业组合成的条件查询学生信息的动态SQL。
<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>
</mapper>
修改mybatis-config.xml核心配置文件:在mybatis-config.xml映射文件的<mappers>元素下添加StudentMapper.xml映射文件路径的配置,用于将StudentMapper.xml映射文件加载到程序中。具体配置代码如下。
<mapper resource="com/itheima/mapper/StudentMapper.xml"/>
编写MyBatisUtils工具类:在项目src/main/java目录下创建com.itheima.utils包,在com.itheima.utils包下创建MyBatisUtils工具类,该类用于封装读取配置文件信息的代码。
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory = null;
static {
try {
Reader reader = Resources.getResourceAsReader(“mybatis-config.xml”); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {e.printStackTrace();} }
public static SqlSession getSession() {
return sqlSessionFactory.openSession();}
}
编写测试方法:在测试类MyBatisTest中,编写测试方法findStudentByNameOrMajorTest(),该方法用于根据学生姓名或专业查询学生信息。
public void findStudentByNameOrMajorTest() {
SqlSession session=MyBatisUtils.getSession();
Student student=new Student();
student.setName("张三");
student.setMajor("英语");
List<Student> students = session.selectList("com.itheima.mapper"
+ ".StudentMapper.findStudentByNameAndMajor",student);
for (Student student2 : students) {System.out.println(student2);}
session.close();
}
查看运行结果:执行测试类MyBatisTest的findStudentByNameOrMajorTest()方法,控制台会输出结果。


