【案例目标】
本章对MyBatis的动态SQL进行了详细讲解,包括使用动态SQL进行条件查询、更新以及复杂查询操作。本案例要求利用本章所学知识完成一个学生信息查询系统,该系统要求实现2个以下功能。
(1)多条件查询
当用户输入的学生姓名不为空,则只根据学生姓名进行学生信息的查询;
当用户输入的学生姓名为空,而学生专业不为空,则只根据学生专业进行学生的查询;
当用户输入的学生姓名和专业都为空,则要求查询出所有学号不为空的学生信息。
(2)单条件查询查询出所有id值小于5的学生的信息。
【实现步骤】:多条件查询
**1.**项目搭建
**1.1 **创建一个名称为mybatis-demo03的项目
Grouple:通常设置为公司倒置的网络域名,如:com.itheima
ArtifactId:通常设置为项目名,如:mybatistest
Version为idea默认的版本
name:项目名
location:选择项目存放路径
**1.2 **引入相关依赖pom.xml,导入mysql驱动包、JUnit测试包、MyBatis的核心包等
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!-- <scope>test</scope>-->
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
**2.****数据准备 **
2.1 创建数据库,在mysql中创建一个名为mybatis的数据库:
create database mybatis;
2.2 创建数据库连接信息配置文件。在src/main/resources目录下创建数据库连接的配置文件db.properties:
mysql.driver=com.mysql.cj.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&
characterEncoding=utf8&useUnicode=true&useSSL=false
mysql.username=root //mysql用户名
mysql.password=123456 //mysql登录密码
**2.3 **创建MyBatis核心配置文件。在项目的src/main/resources目录下创建mybatis-config.xml。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 环境配置 -->
<!-- 加载类路径下的属性文件 -->
<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 数据库连接相关配置 ,db.properties文件中的内容-->
<dataSource type="POOLED">
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments>
</configuration>
**2.4 **在名称为mybatis的数据库中,创建一个dm_student表,并插入几条测试数据。
# 使用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');
完成后查看表
3. 创建POJO实体
在项目src/main/java目录下创建com.itheima.pojo包,在com.itheima.pojo包下创建持久化类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 + '}';
}
}
**4.创建映射文件 **
在项目src/main/java目录下创建com.itheima.mapper包,在com.itheima.mapper包下创建映射文件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>
5. 修改mybatis-config.xml配置文件,添加
<!-- mapping文件路径配置 -->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
//<mapper>元素指定了StudentMapper.xml映射文件的路径。
6.** 编写MyBatisUtils工具类**
在项目src/main/java目录下创建com.itheima.utils包,在com.itheima.utils包下创建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;
// 初始化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();
}
}
7.** 编写测试方法**
在项目的src/test/java目录下创建Test包,在Test包下创建MyBatisTest类:
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("com.itheima.mapper"
+ ".StudentMapper.findStudentByNameAndMajor", student);
// 输出查询结果信息
for (Student student2 : students) {
// 打印输出结果
System.out.println(student2);
}
// 关闭SqlSession
session.close();
}
执行测试类MyBatisTest的findStudentByNameOrMajorTest()方法。
【实现步骤】:单条件查询
**1.修改映射文件 **
在映射文件StudentMapper.xml中的<mapper>元素下,编写查询所有id值小于5的学生信息的动态SQL。
<!--<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>
**2.**编写测试方法
在测试类MyBatisTest中,编写测试方法findByListTest(),findByListTest()具体代码如下:
/**
* 根据学生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("com.itheima.mapper"
+ ".StudentMapper.findByList", ids);
// 输出查询结果信息
for (Student student : students) {
// 打印输出结果
System.out.println(student);
}
// 关闭SqlSession
session.close();
}
执行MyBatisTest测试类的findByListTest()方法。
版权归原作者 夏目贵志_ 所有, 如有侵权,请联系我们删除。