实验要求
本实验要求根据学生表在数据库中创建一个s_student表,根据班级表在数据库中创建一个c_class表,班级表c_class和学生表s_student是一对多的关系。
实验内容
学生编号(id) | 学生名称(name) | 学生年龄(age) | 所属班级(cid) |
---|---|---|---|
1 | 孙悟空 | 1000 | 1 |
2 | 猪悟能 | 600 | 2 |
3 | 沙悟净 | 9000 | 2 |
4 | 唐三藏 | 45 | 1 |
班级编号(id) | 班级名称(classname) |
---|---|
1 | 一班 |
2 | 二班 |
该案例需要使用MyBatis实现以下功能:
- MyBatis注解实现查询操作。
根据表1和表2在数据库分别创建一个学生表s_student和一个班级表c_class,并查询id为2的学生的信息。 - MyBatis注解实现修改操作。
修改id为4的学生的姓名修改为金蝉子,年龄修改为10000。 - MyBatis注解实现一对多查询。
查询出二班所有学生的信息。
实验分析
本实验主要考查对MyBatis的注解开发的掌握。
- 建立好实验所需的数据库及表(其中需要用到外键)。
- 需要在项目的src/main/resource目录下创建数据库连接的配置文件和MyBatis的核心配置文件。
- 再在src/main/java下创建一个实体类Student,编写学生的基本信息;实体类Class,编写班级的基本信息。
- 再创建工具类MyBatisUtils。
- 最后在src/test/java下创建一个测试类Test1完成实验内容。
学生表s_student和班级表c_clas及外键的设置
代码实现
Resource
db.properties(数据库连接配置文件)
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&\ characterEncoding=utf8&useUnicode=true&useSSL=false
username=root
password=1
mybatis-config.xml(MyBatis的核心配置文件)
<?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"> </properties>
<settings>
<!-- 打开延迟加载的开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 将积极加载改成消息加载,即按需加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
<!-- 别名 -->
<typeAliases>
<package name="com.cqust.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="com.cqust.dao.StudentMapper"/>
<mapper class="com.cqust.dao.ClassMapper"/>
</mappers>
</configuration>
dao层
StudentMapper接口
package com.cqust.dao;
import com.cqust.pojo.Student;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.util.List;
public interface StudentMapper {
// 根据学生id查询学生信息
@Select("select * from s_student where id=#{id}")
Student selectStudentById(int id);
// 根据学生id修改学生姓名和年龄
@Update("update s_student set name = #{name},age =#{age} where id = #{id}")
int updateStudent(Student student);
// 根据班级id查询本班学生信息
@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<Student> selectStudentByClassId(int cid);
}
ClassMapper接口
package com.cqust.dao;
import com.cqust.pojo.Class;
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 ClassMapper {
// 根据班级id查询班级信息
@Select("select * from c_class where id=#{id}")
@Results({@Result(id = true,column = "id",property = "id"),
@Result(column = "classname",property = "classname"),
// select属性用于指定students的值
@Result(column = "id",property = "students",many = @Many(select = "com.cqust.dao.StudentMapper.selectStudentByClassId"))})
Class selectStudentByClassId(int id);
}
pojo层
Student类
package com.cqust.pojo;
public class Student {
private int id; //学生id
private String name; //学生姓名
private int age; //学生年龄
public int getId() {
return id;
}
public void setId(int 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 +
'}';
}
}
Class类
package com.cqust.pojo;
import java.util.List;
public class Class {
private int id; //班级id
private String classname; //班级名称
private List<Student> students; //班级包含的学生
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getClassname() {
return classname;
}
public void setClassname(String classname) {
this.classname = classname;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
@Override
public String toString() {
return "Class{" +
"id=" + id +
", classname='" + classname + '\'' +
", students=" + students +
'}';
}
}
utils层
MyBatisUtils类
package com.cqust.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.Reader;
/**
* 工具类
*/
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory = null;
//初始化SQLSessionFactory对象
static {
try{
//使用MyBatis提供的Resource类加载MyBatis的配置文件
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
//构建SQLSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e){
e.printStackTrace();
}
}
//获取SqlSession对象的方法
public static SqlSession getSession(){
//若传入true表示关闭事务控制,自动提交;false表示开启事务控制
return sqlSessionFactory.openSession(true);
}
}
测试层
Test1(测试类)
import com.cqust.dao.ClassMapper;
import com.cqust.dao.StudentMapper;
import com.cqust.pojo.Class;
import com.cqust.pojo.Student;
import com.cqust.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class Test1 {
/**
* 根据学生id查询学生信息
*/
@Test
public void findStudentByIdTest(){
SqlSession sqlSession = MyBatisUtils.getSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
Student student = mapper.selectStudentById(2);
System.out.println(student);
sqlSession.close();
}
/**
* 根据学生id修改学生姓名和年龄
*/
@Test
public void updateStudentTest(){
SqlSession sqlSession = MyBatisUtils.getSession();
Student student = new Student();
student.setId(4);
student.setName("金蝉子");
student.setAge(10000);
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
int result = mapper.updateStudent(student);
if(result > 0)
System.out.println("成功更新"+ result + "条数据");
else System.out.println("更新数据失败");
System.out.println(student);
sqlSession.commit();
sqlSession.close();
}
/**
* 根据班级id查询本班学生信息
*/
@Test
public void findStudentByClassnameTest(){
SqlSession sqlSession = MyBatisUtils.getSession();
ClassMapper mapper = sqlSession.getMapper(ClassMapper.class);
Class class1 = mapper.selectStudentByClassId(2);
System.out.println(class1);
sqlSession.close();
}
}
实验运行结果:
实验小结
本实验主要考察了MyBatis的注解开发。如@Select注解、@Update注解;还考察了基于注解的关联查询,如一对多查询。在MyBatis框架中,掌握这些注解十分重要,熟练掌握它们能极大地提高开发效率。
谢谢浏览!