IT评测·应用市场-qidao123.com

标题: 【基于轻量型架构的WEB开辟】课程 实行一 mybatis操作 Java EE企业级应用开 [打印本页]

作者: 罪恶克星    时间: 2025-1-12 06:50
标题: 【基于轻量型架构的WEB开辟】课程 实行一 mybatis操作 Java EE企业级应用开
实行一 mybatis操作

实行目的


实行情况


实行内容

1 数据准备


1. 创建弟子表(student)、课程表(course)、成绩表(score)。
  1. CREATE DATABASE experiment;
  2. USE experiment;
  3. CREATE TABLE student (
  4.                          id INT PRIMARY KEY AUTO_INCREMENT, -- 学生ID,主键,自动递增
  5.                          name varchar(32),                      -- 学生姓名,最多32字符
  6.                          sex VARCHAR(8),                        -- 性别,最多8字符,通常为"男"或"女"
  7.                          age INT,                               -- 年龄,整数类型
  8.                          sclass INT                             -- 班级编号,整数类型
  9. );
  10. CREATE TABLE course (
  11.                         id INT PRIMARY KEY AUTO_INCREMENT, -- 课程ID,主键,自动递增
  12.                         name varchar(32),                      -- 课程名称,最多32字符
  13.                         semester char(10)                       -- 学期标识,例如'2024-1'表示2024年第一学期
  14. );
  15. CREATE TABLE score (
  16.                        id INT PRIMARY KEY AUTO_INCREMENT, -- 成绩记录ID,主键,自动递增
  17.                        student_id INT,                    -- 学生ID,外键引用student表的id
  18.                        course_id INT,                     -- 课程ID,外键引用course表的id
  19.                        score INT,                             -- 分数,整数类型
  20.                        FOREIGN KEY(student_id) REFERENCES student(id),
  21.                        FOREIGN KEY(course_id) REFERENCES course(id)
  22. );
复制代码
2.插入代表个人信息的真实数据。
  1. -- 插入学生信息
  2. INSERT INTO student (name, sex, age, sclass)
  3. VALUES ('lql', '女', 21, 1),
  4.        ('大学生2', '男', 20, 2);
  5. -- 插入课程信息
  6. INSERT INTO course (name, semester)
  7. VALUES ('程序设计基础', '2022-1'),
  8.        ('管理学原理', '2022-1'),
  9.        ('Java核心技术', '2023-1'),
  10.        ('基于轻量型架构的WEB开发', '2024-1');
  11. -- 插入学生成绩信息
  12. INSERT INTO score (student_id, course_id, score)
  13. VALUES (1, 1, 92),
  14.        (1, 2, 95),
  15.        (1, 3, 93),
  16.        (2, 1, 88),
  17.        (2, 2, 90);
复制代码




2 情况准备

2.1安装和配置IntelliJ IDEA Ultimate 2024


2.2 安装和配置MySQL 8.0


2.3 创建Maven项目


添加MyBatis和MySQL驱动的依赖。
示例pom.xml配置:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.     <modelVersion>4.0.0</modelVersion>
  6.     <groupId>org.example</groupId>
  7.     <artifactId>bigDataWeb</artifactId>
  8.     <version>1.0-SNAPSHOT</version>
  9.     <properties>
  10.         <maven.compiler.source>17</maven.compiler.source>
  11.         <maven.compiler.target>17</maven.compiler.target>
  12.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13.     </properties>
  14.     <dependencies>
  15.         <!-- MyBatis -->
  16.         <dependency>
  17.             <groupId>org.mybatis</groupId>
  18.             <artifactId>mybatis</artifactId>
  19.             <version>3.5.16</version>
  20.         </dependency>
  21.         <!-- MySQL Connector -->
  22.         <dependency>
  23.             <groupId>mysql</groupId>
  24.             <artifactId>mysql-connector-java</artifactId>
  25.             <version>8.0.28</version>
  26.         </dependency>
  27.         <!-- JUnit 5 -->
  28.         <dependency>
  29.             <groupId>org.junit.jupiter</groupId>
  30.             <artifactId>junit-jupiter-api</artifactId>
  31.             <version>5.7.0</version>
  32.         </dependency>
  33.         <dependency>
  34.             <groupId>org.junit.jupiter</groupId>
  35.             <artifactId>junit-jupiter-engine</artifactId>
  36.             <version>5.7.0</version>
  37.         </dependency>
  38.         <!-- Logging -->
  39.         <dependency>
  40.             <groupId>org.slf4j</groupId>
  41.             <artifactId>slf4j-api</artifactId>
  42.             <version>1.7.30</version>
  43.         </dependency>
  44.         <dependency>
  45.             <groupId>ch.qos.logback</groupId>
  46.             <artifactId>logback-classic</artifactId>
  47.             <version>1.2.3</version>
  48.         </dependency>
  49.         <!-- Connection Pool -->
  50.         <dependency>
  51.             <groupId>com.zaxxer</groupId>
  52.             <artifactId>HikariCP</artifactId>
  53.             <version>3.4.5</version>
  54.         </dependency>
  55.     </dependencies>
  56. </project>
复制代码
2.4 配置MyBatis


在src/main/resources目次下创建mybatis-config.xml。
示例配置:
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3.         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4.         "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6.     <properties resource="db.properties"/>
  7.     <typeAliases>
  8.         <package name="com.example.domain"/>
  9.     </typeAliases>
  10.     <environments default="development">
  11.         <environment id="development">
  12.             <transactionManager type="JDBC"/>
  13.             <dataSource type="POOLED">
  14.                 <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
  15.                 <property name="url" value="jdbc:mysql://localhost:3306"/>
  16.                 <property name="username" value="root"/>
  17.                 <property name="password" value="123456"/>
  18.             </dataSource>
  19.         </environment>
  20.     </environments>
  21.     <mappers>
  22.         <mapper resource="mapper/StudentMapper.xml"/>
  23.     </mappers>
  24. </configuration>
复制代码

在src/main/resources/mapper目次下创建映射文件,如StudentMapper.xml。

2.5 创建实体类和Mapper接口


创建StudentMapper.java、CourseMapper.java和ScoreMapper.java。

3 动态SQL(利用xml配置文件方式)

1.弟子信息多条件查询(条件之间存在制约)
a)当用户输入的弟子姓名不为空时,则只根据弟子姓名进行弟子信息的查询;


b)当用户输入的弟子姓名为空而弟子班级不为空时,则只根据弟子班级进行弟子信息的查询;


c)当用户输入的弟子姓名和班级都为空,则要求查询出全部学号不为空的弟子信息。
  1. @Test
  2. public void testFindStudentsByConditions() {
  3.     try (SqlSession session = MyBatisUtil.getSqlSession()) {
  4.         StudentMapper mapper = session.getMapper(StudentMapper.class);
  5.         List<Student> students = mapper.findStudentsByConditions(null, null);
  6.         students.forEach(System.out::println);
  7.     }
  8. }
复制代码


2.弟子信息多条件查询
可以通过弟子的姓名和班级来查找弟子,也可以只通过弟子姓名或只通过弟子班级来查找弟子,还可以没有条件查找出全部弟子。







3.单条件查询
a)查询出全部id值小于5的弟子的信息。
  1. @Test
  2. public void testFindStudentsByIdLessThanFive() {
  3.     try (SqlSession session = MyBatisUtil.getSqlSession()) {
  4.         StudentMapper mapper = session.getMapper(StudentMapper.class);
  5.         List<Student> students = mapper.findStudentsByIdLessThanFive();
  6.         students.forEach(System.out::println);
  7.     }
  8. }
复制代码


4 关联映射(利用xml配置文件方式)

查询某个弟子的全部课程成绩        
要求输入弟子姓名,输出弟子信息和课程信息以及分数。
  1. @Test
  2. public void testFindStudentScoresByName() {
  3.     try (SqlSession session = MyBatisUtil.getSqlSession()) {
  4.         StudentMapper mapper = session.getMapper(StudentMapper.class);
  5.         List<Score> scores = mapper.findStudentScoresByName("lql");
  6.         scores.forEach(System.out::println);
  7.     }
  8. }
复制代码


5 缓存机制

1.一级缓存测试
对Course表根据id进行两次相同的查询。
  1. @Test
  2. public void testFirstLevelCache() {
  3.     try (SqlSession session = MyBatisUtil.getSqlSession()) {
  4.         StudentMapper mapper = session.getMapper(StudentMapper.class);
  5.         // 第一次查询
  6.         List<Student> students = mapper.findAll();
  7.         System.out.println("第一次查询结果: " + students);
  8.         // 修改数据
  9.         Student student = new Student();
  10.         student.setName("测试");
  11.         student.setAge(20);
  12.         student.setSex("男");
  13.         student.setSclass(1);
  14.         mapper.insert(student);
  15.         // 第二次查询,应该使用缓存数据
  16.         students = mapper.findAll();
  17.         System.out.println("第二次查询结果: " + students);
  18.     }
  19. }
复制代码



2.一级缓存的清空
在两次相同查询之间,利用插入、更新或删除语句对Course表中的信息进行修改,第二次查询时Mybatis依然会从数据库查询。
  1. @Test
  2. public void testClearFirstLevelCache() {
  3.     try (SqlSession session = MyBatisUtil.getSqlSession()) {
  4.         StudentMapper mapper = session.getMapper(StudentMapper.class);
  5.         // 查询
  6.         List<Student> students = mapper.findAll();
  7.         System.out.println("查询结果: " + students);
  8.         // 清空一级缓存
  9.         session.clearCache();
  10.         // 再次查询,这次不会使用缓存
  11.         students = mapper.findAll();
  12.         System.out.println("清空缓存后查询结果: " + students);
  13.     }
  14. }
复制代码


3.二级缓存测试
除了参照教材的方式开启二级缓存,还需要序列化对象,比如在CourseMapper开启了二级缓存,则Course这个POJO需要实现Serializable接口,即implements Serializable,否则程序会报错。

  1. package com.example;
  2. import com.example.domain.Course;
  3. import com.example.mapper.CourseMapper;
  4. import org.apache.ibatis.session.SqlSession;
  5. import org.junit.jupiter.api.Test;
  6. import java.util.List;
  7. public class CourseMapperTest {
  8.     @Test
  9.     public void testFindAll() {
  10.         try (SqlSession session = MyBatisUtil.getSqlSession()) {
  11.             CourseMapper mapper = session.getMapper(CourseMapper.class);
  12.             List<Course> courses = mapper.findAll();
  13.             courses.forEach(System.out::println);
  14.         }
  15.     }
  16. }
复制代码


4.二级缓存的清空
参照一级缓存的清空,区别在于利用不同的sqlsession进行查询和修改操作。
在 MyBatis 中,二级缓存是全局的,可以跨 SqlSession 利用。二级缓存的清空通常涉及到利用不同的 SqlSession 来执行查询和修改操作。这是因为二级缓存是全局的,所以它不受单个 SqlSession 的限定。
要清空二级缓存,可以在 MyBatis 配置文件中设置 eviction 策略。MyBatis 提供了几种不同的清空策略,例如 LRU(最近最少利用)、FIFO(先进先出)、SOFT(软引用) 和 NO(无)。这些策略决定了在什么情况下二级缓存会被清空。
  1. @Test
  2. public void testClearSecondLevelCache() {
  3.     try (SqlSession session1 = MyBatisUtil.getSqlSession()) {
  4.         CourseMapper mapper1 = session1.getMapper(CourseMapper.class);
  5.         List<Course> courses = mapper1.findAll();
  6.         session1.evict();
  7.         try (SqlSession session2 = MyBatisUtil.getSqlSession()) {
  8.             CourseMapper mapper2 = session2.getMapper(CourseMapper.class);
  9.             List<Course> coursesAfterEvict = mapper2.findAll();
  10.             System.out.println("二级缓存清空成功");
  11.         }
  12.     }
  13. }
复制代码


6 注解开辟

利用注解的开辟方式实实际验内容三的第1个任务:查询某个弟子的全部课程成绩,要求利用面向接口的开辟方式。
  1. /**
  2.  * 根据姓名查询学生的课程与分数
  3.  *
  4.  * @param name 学生姓名
  5.  * @return 学生对象,包含课程和分数信息
  6.  */
  7. @Select("SELECT s.*, c.id AS cid, c.name AS cname, sc.score AS score " +
  8.         "FROM student s " +
  9.         "JOIN score sc ON s.id = sc.student_id " +
  10.         "JOIN course c ON sc.course_id = c.id " +
  11.         "WHERE s.name = #{name}")
  12. @Results({
  13.         @Result(property = "id", column = "id"),
  14.         @Result(property = "name", column = "name"),
  15.         @Result(property = "age", column = "age"),
  16.         @Result(property = "sex", column = "sex"),
  17.         @Result(property = "sclass", column = "sclass"),
  18.         @Result(property = "courseList", column = "cid",
  19.                 many = @Many(select = "com.example.domain.CourseMapper.findByStudentId"))
  20. })
  21. Student findByNameCourseAndScore(String name);
复制代码



实行总结

在本次实行中,我通过一系列步调掌握了











免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4