本文主要实现《Java EE企业级应用开发教程(Spring+SpringMVC+Mybatis)》第2版中的第5章课后习题:
要求:
(1)MyBatis注解实现查询操作
(2)MyBatis注解实现修改操作(将id为4的学生修改为李雷,年龄修改为21)
(3)MyBatis注解实现一对多查询(查询出二班所有学生的信息)
前面的搭建过程参考第一章代码:IDEA(2020版)实现MyBatis入门程序 – 每天进步一点点
1.数据库部分
USE mybatis;
# 创建一个名称为c_class的表
CREATE TABLE c_class (
id int(32) PRIMARY KEY AUTO_INCREMENT,
classname varchar(40)
);
# 插入2条数据
INSERT INTO c_class VALUES (1, '一班');
INSERT INTO c_class VALUES (2, '二班');
# 创建一个名称为s_student的表
CREATE TABLE s_student (
id int(32) PRIMARY KEY AUTO_INCREMENT,
name varchar(40),
age int,
cid int(32) NOT NULL,
FOREIGN KEY(cid) REFERENCES c_class(id)
);
# 插入4条数据
INSERT INTO s_student VALUES (1, '张三', 18,1);
INSERT INTO s_student VALUES (2, '李四', 18,2);
INSERT INTO s_student VALUES (3, '王五', 19,2);
INSERT INTO s_student VALUES (4, '赵六', 20,1);
执行结果如下:

2.创建实体类
右击“pojo”文件夹,选择 “New—>Java Class”,名字叫 IStudent

IStudent实体类代码参考如下:
package com.itheima.pojo;
/**
* 学生持久化类
*/
public class IStudent {
private Integer id; // 主键id
private String name; // 姓名
private int age; // 年龄
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" + "id=" + id +
", name='" + name + ", age=" + age + '}';
}
}

然后再创建一个IClass实体类
代码参考如下:
package com.itheima.pojo;
import java.util.List;
/**
* 班级持久化类
*/
public class IClass {
private Integer id; // 主键id
private String classname; // 班级名称
private List<IStudent> studentList; // 学生集合
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getClassname() {
return classname;
}
public void setClassname(String classname) {
this.classname = classname;
}
public List<IStudent> getStudentList() {
return studentList;
}
public void setStudentList(List<IStudent> studentList) {
this.studentList = studentList;
}
@Override
public String toString() {
return "IClass{" +
"id=" + id +
", classname='" + classname +
", studentList=" + studentList + '}';
}
}

3.创建dao层
右击“itheima”,然后选择“New—>Package”,名称选择 “dao”

然后,右击刚才创建的dao文件夹,选择“New”

然后我们创建一个Mapper,名字就用 “IStudentMapper”

里面的内容参考如下:
package com.itheima.dao;
import com.itheima.pojo.IStudent;
import org.apache.ibatis.annotations.Select;
public interface IStudentMapper {
@Select("select * from s_student where id = #{id}")
IStudent selectStudent(int id);
}

4.修改配置文件,引入mapper
打卡mabatis-config.xml文件
在其中引入下面的代码
<mapper class="com.itheima.dao.IStudentMapper"/>

5.编写测试类
(1)作业1:查询id为2的学生的信息
我们在测试类里输入下面的参考代码
package Test;
import com.itheima.dao.IStudentMapper;
import com.itheima.pojo.IStudent;
import com.itheima.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class MyBatisTest {
@Test
public void findIStudentByIdTest() {
// 1.通过工具类获取SqlSession对象
SqlSession session = MyBatisUtils.getSession();
IStudentMapper mapper = session.getMapper(IStudentMapper.class);
// 2.使用IStudentMapper对象查询id为2的学生的信息
IStudent student = mapper.selectStudent(2);
System.out.println(student.toString());
// 3.关闭SqlSession
session.close();
}
}
运行结果如下:

(2)作业2,将id为4的学生姓名修改为李雷,年龄修改为21
修改IStudentMapper文件,增加下面的代码
@Update("update s_student set name=#{name}, age=#{age} where id =#{id}")
int updateStudent(IStudent iStudent);

修改测试类,增加如下代码
//(2) 更新id为4的学生信息
@Test
public void updateIStudentByIdTest(){
// 1.通过工具类获取SqlSession对象
SqlSession session = MyBatisUtils.getSession();
IStudentMapper mapper = session.getMapper(IStudentMapper.class);
// 2.使用IStudentMapper
IStudent iStudent = new IStudent();
iStudent.setName("李雷");
iStudent.setAge(21);
iStudent.setId(4);
int result = mapper.updateStudent(iStudent);
System.out.println(result);
}

(3)作业3:注解实现一对多查询
打开IStudentMapper文件,新增下面的代码
@Select("select * from s_student where cid = #{id}")
@Results({
@Result(id = true, column = "id", property = "id"),
@Result(column = "name", property = "name"),
@Result(column = "age", property = "age")
})
List<IStudent> selectIStudentByClassId(int cid);

然后右击”dao“文件夹,新增一个IClassMapper

里面的代码参考如下:
package com.itheima.dao;
import com.itheima.pojo.IClass;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
public interface IClassMapper {
@Select("select * from c_class where id = #{id}")
@Results({
@Result(id =true, column = "id", property = "id"),
@Result(column = "classname",property = "classname"),
@Result(column = "id",property = "studentList",
many=@Many(select = "com.itheima.dao.IStudentMapper.selectIStudentByClassId"))
})
IClass selectIClassById(int id);
}
在mybatis-config.xml文件中,引入刚才创建的IClassMapper
<mapper class="com.itheima.dao.IClassMapper"/>

然后修改测试类,代码参考如下:
//(3)实现一对多查询
@Test
public void findIStudentByCid(){
SqlSession session = MyBatisUtils.getSession();
IClassMapper mapper = session.getMapper(IClassMapper.class);
IClass iClass = mapper.selectIClassById(2);
System.out.println(iClass.toString());
}

运行后实现效果如下:
