罪恶克星 发表于 2025-1-12 06:50:02

【基于轻量型架构的WEB开辟】课程 实行一 mybatis操作 Java EE企业级应用开

实行一 mybatis操作

实行目的


[*]掌握MyBatis情况搭建,MyBatis核心配置文件及其元素的利用,MyBatis映射文件及其元素的利用。
[*]掌握MyBatis中动态SQL元素的利用,MyBatis的条件查询操作,MyBatis的复杂查询操作。
[*]掌握MyBatis的关联映射和缓存机制。
[*]掌握MyBatis的基于注解的多对多关联查询开辟。

实行情况


[*]IntelliJ IDEA Ultimate2024
[*]jdk-17
[*]MySQL 8.0

实行内容

1 数据准备

https://i-blog.csdnimg.cn/direct/6d09bfd931c54b9a980e8a4e0117b4ff.png
1. 创建弟子表(student)、课程表(course)、成绩表(score)。
CREATE DATABASE experiment;
USE experiment;
CREATE TABLE student (
                         id INT PRIMARY KEY AUTO_INCREMENT, -- 学生ID,主键,自动递增
                         name varchar(32),                      -- 学生姓名,最多32字符
                         sex VARCHAR(8),                        -- 性别,最多8字符,通常为"男"或"女"
                         age INT,                               -- 年龄,整数类型
                         sclass INT                             -- 班级编号,整数类型
);

CREATE TABLE course (
                        id INT PRIMARY KEY AUTO_INCREMENT, -- 课程ID,主键,自动递增
                        name varchar(32),                      -- 课程名称,最多32字符
                        semester char(10)                       -- 学期标识,例如'2024-1'表示2024年第一学期
);

CREATE TABLE score (
                       id INT PRIMARY KEY AUTO_INCREMENT, -- 成绩记录ID,主键,自动递增
                       student_id INT,                    -- 学生ID,外键引用student表的id
                       course_id INT,                     -- 课程ID,外键引用course表的id
                       score INT,                             -- 分数,整数类型
                       FOREIGN KEY(student_id) REFERENCES student(id),
                       FOREIGN KEY(course_id) REFERENCES course(id)
); 2.插入代表个人信息的真实数据。
-- 插入学生信息
INSERT INTO student (name, sex, age, sclass)
VALUES ('lql', '女', 21, 1),
       ('大学生2', '男', 20, 2);

-- 插入课程信息
INSERT INTO course (name, semester)
VALUES ('程序设计基础', '2022-1'),
       ('管理学原理', '2022-1'),
       ('Java核心技术', '2023-1'),
       ('基于轻量型架构的WEB开发', '2024-1');

-- 插入学生成绩信息
INSERT INTO score (student_id, course_id, score)
VALUES (1, 1, 92),
       (1, 2, 95),
       (1, 3, 93),
       (2, 1, 88),
       (2, 2, 90); https://i-blog.csdnimg.cn/direct/475e24ff5e3241b497c963ee72afd247.png
https://i-blog.csdnimg.cn/direct/e61985b97ce2451e9f69a93ddef30eff.png
https://i-blog.csdnimg.cn/direct/8d352cad2d6944429c93d688711e45d9.png

2 情况准备

2.1安装和配置IntelliJ IDEA Ultimate 2024



[*]下载和安装:
[*]访问JetBrains官网,下载IntelliJ IDEA Ultimate 2024版。安装并启动IDEA。
[*]配置JDK:
[*]在IDEA中,打开“File” > “Project Structure” > “SDKs”。添加JDK 17,确保其为项目利用的JDK。
2.2 安装和配置MySQL 8.0



[*]下载和安装:
[*]访问MySQL官网,下载MySQL 8.0版本。安装MySQL并设置root用户暗码。
[*]配置MySQL:
[*]运行MySQL服务。创建数据库。
[*]配置数据库连接:
[*]在IDEA中,打开“Database”视图。配置MySQL 8.0数据库连接,输入数据库地址、端口、用户名和暗码。
2.3 创建Maven项目



[*]创建项目:
[*]在IDEA中,选择“File” > “New” > “Project...”。选择“Maven”项目,点击“Next”。输入项目名称,选择项目存储位置,点击“Finish”。
[*]配置pom.xml:
添加MyBatis和MySQL驱动的依赖。
示例pom.xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>bigDataWeb</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!-- MyBatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.16</version>
        </dependency>
        <!-- MySQL Connector -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
        <!-- JUnit 5 -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.7.0</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.7.0</version>
        </dependency>
        <!-- Logging -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.30</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
        <!-- Connection Pool -->
        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
            <version>3.4.5</version>
        </dependency>


    </dependencies>
</project> 2.4 配置MyBatis



[*]创建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"/>

    <typeAliases>
        <package name="com.example.domain"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="mapper/StudentMapper.xml"/>
    </mappers>

</configuration>

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

2.5 创建实体类和Mapper接口



[*]实体类:
[*]创建Student.java、Course.java和Score.java。
[*]package com.example.domain;
[*]Mapper接口:
创建StudentMapper.java、CourseMapper.java和ScoreMapper.java。

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

1.弟子信息多条件查询(条件之间存在制约)
a)当用户输入的弟子姓名不为空时,则只根据弟子姓名进行弟子信息的查询;
https://i-blog.csdnimg.cn/direct/c2d5872ecda84ce8b1c1cb99c75d14a6.png
https://i-blog.csdnimg.cn/direct/85238431d2c04f4fb92ecbc614d7c445.png
b)当用户输入的弟子姓名为空而弟子班级不为空时,则只根据弟子班级进行弟子信息的查询;
https://i-blog.csdnimg.cn/direct/ba692b55ea57480a9c079c2d2644e5e6.png
https://i-blog.csdnimg.cn/direct/c9de1e7064c64c7bb484329b3f9e719c.png
c)当用户输入的弟子姓名和班级都为空,则要求查询出全部学号不为空的弟子信息。
@Test
public void testFindStudentsByConditions() {
    try (SqlSession session = MyBatisUtil.getSqlSession()) {
        StudentMapper mapper = session.getMapper(StudentMapper.class);
        List<Student> students = mapper.findStudentsByConditions(null, null);
        students.forEach(System.out::println);
    }
} https://i-blog.csdnimg.cn/direct/d95469d4575243d1bcce0e0a021a12c8.png

2.弟子信息多条件查询
可以通过弟子的姓名和班级来查找弟子,也可以只通过弟子姓名或只通过弟子班级来查找弟子,还可以没有条件查找出全部弟子。
https://i-blog.csdnimg.cn/direct/76bf8a237d2e46c18a2026409fc42283.png
https://i-blog.csdnimg.cn/direct/c9f7294e2dd947058bed51470c9901d8.png
https://i-blog.csdnimg.cn/direct/998f85b0f962446f8591ed6d06dd9386.png
https://i-blog.csdnimg.cn/direct/bdbe3a6494f64e9c9d1bc12f8d8c4c8a.png
https://i-blog.csdnimg.cn/direct/e72daf80c2a045a3bb77f814179fb1bd.png
https://i-blog.csdnimg.cn/direct/9b36038c5c0e48d897d9911f39936239.png

3.单条件查询
a)查询出全部id值小于5的弟子的信息。
@Test
public void testFindStudentsByIdLessThanFive() {
    try (SqlSession session = MyBatisUtil.getSqlSession()) {
        StudentMapper mapper = session.getMapper(StudentMapper.class);
        List<Student> students = mapper.findStudentsByIdLessThanFive();
        students.forEach(System.out::println);
    }
} https://i-blog.csdnimg.cn/direct/700b1e0b69864f61bc17d1cdbca539b1.png

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

查询某个弟子的全部课程成绩        
要求输入弟子姓名,输出弟子信息和课程信息以及分数。
@Test
public void testFindStudentScoresByName() {
    try (SqlSession session = MyBatisUtil.getSqlSession()) {
        StudentMapper mapper = session.getMapper(StudentMapper.class);
        List<Score> scores = mapper.findStudentScoresByName("lql");
        scores.forEach(System.out::println);
    }
} https://i-blog.csdnimg.cn/direct/b9228f24fe4545e88427acbc7bf257eb.png

5 缓存机制

1.一级缓存测试
对Course表根据id进行两次相同的查询。
@Test
public void testFirstLevelCache() {
    try (SqlSession session = MyBatisUtil.getSqlSession()) {
        StudentMapper mapper = session.getMapper(StudentMapper.class);
        // 第一次查询
        List<Student> students = mapper.findAll();
        System.out.println("第一次查询结果: " + students);

        // 修改数据
        Student student = new Student();
        student.setName("测试");
        student.setAge(20);
        student.setSex("男");
        student.setSclass(1);
        mapper.insert(student);

        // 第二次查询,应该使用缓存数据
        students = mapper.findAll();
        System.out.println("第二次查询结果: " + students);
    }
} https://i-blog.csdnimg.cn/direct/8e7ad79acd984bc08b39bdf059a2923a.png
https://i-blog.csdnimg.cn/direct/8e80b6c5a821489fa5f169d6c0b7f371.png

2.一级缓存的清空
在两次相同查询之间,利用插入、更新或删除语句对Course表中的信息进行修改,第二次查询时Mybatis依然会从数据库查询。
@Test
public void testClearFirstLevelCache() {
    try (SqlSession session = MyBatisUtil.getSqlSession()) {
        StudentMapper mapper = session.getMapper(StudentMapper.class);
        // 查询
        List<Student> students = mapper.findAll();
        System.out.println("查询结果: " + students);

        // 清空一级缓存
        session.clearCache();

        // 再次查询,这次不会使用缓存
        students = mapper.findAll();
        System.out.println("清空缓存后查询结果: " + students);
    }
} https://i-blog.csdnimg.cn/direct/d8a7f13cd4e7498f86f374dbeb699e0b.png

3.二级缓存测试
除了参照教材的方式开启二级缓存,还需要序列化对象,比如在CourseMapper开启了二级缓存,则Course这个POJO需要实现Serializable接口,即implements Serializable,否则程序会报错。
https://i-blog.csdnimg.cn/direct/fd0e64e4d824480091a61991633e5830.png
package com.example;

import com.example.domain.Course;
import com.example.mapper.CourseMapper;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;

import java.util.List;

public class CourseMapperTest {
    @Test
    public void testFindAll() {
        try (SqlSession session = MyBatisUtil.getSqlSession()) {
            CourseMapper mapper = session.getMapper(CourseMapper.class);
            List<Course> courses = mapper.findAll();
            courses.forEach(System.out::println);
        }
    }
} https://i-blog.csdnimg.cn/direct/86cbb696e3374c2188fd09eb551b6c82.png

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

6 注解开辟

利用注解的开辟方式实实际验内容三的第1个任务:查询某个弟子的全部课程成绩,要求利用面向接口的开辟方式。
/**
 * 根据姓名查询学生的课程与分数
 *
 * @param name 学生姓名
 * @return 学生对象,包含课程和分数信息
 */
@Select("SELECT s.*, c.id AS cid, c.name AS cname, sc.score AS score " +
        "FROM student s " +
        "JOIN score sc ON s.id = sc.student_id " +
        "JOIN course c ON sc.course_id = c.id " +
        "WHERE s.name = #{name}")
@Results({
        @Result(property = "id", column = "id"),
        @Result(property = "name", column = "name"),
        @Result(property = "age", column = "age"),
        @Result(property = "sex", column = "sex"),
        @Result(property = "sclass", column = "sclass"),
        @Result(property = "courseList", column = "cid",
                many = @Many(select = "com.example.domain.CourseMapper.findByStudentId"))
})
Student findByNameCourseAndScore(String name); https://i-blog.csdnimg.cn/direct/5559475a35e046e7ad5810e43ee5be3c.png
https://i-blog.csdnimg.cn/direct/c92ea97fd8e84614b6ad28e541b33364.png

实行总结

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


[*]情况搭建与配置:我成功安装并配置了IntelliJ IDEA Ultimate 2024、JDK 17和MySQL 8.0,为后续的MyBatis开辟打下了坚实的基础。通过配置IDEA和MySQL,我加深了对开辟情况搭建的理解。
[*]MyBatis核心配置:我学会了怎样编写MyBatis的核心配置文件,包括数据源配置、事务管理器配置以及映射文件的引用。这些配置是MyBatis工作的基础,通过实践我掌握了它们的详细含义和作用。
[*]动态SQL与条件查询:通过实行,我掌握了MyBatis中动态SQL的利用,包括条件查询操作和复杂查询操作。我学会了怎样利用<if>、<choose>、<when>等动态SQL元向来构建机动的查询语句。
[*]关联映射与缓存机制:我探索了MyBatis的关联映射功能,通过编写映射文件和Mapper接口,实现了弟子与课程成绩的关联查询。此外,我还相识了MyBatis的一级缓存和二级缓存机制,并掌握了怎样在实际开辟中利用和配置缓存。
[*]注解开辟:我实行了利用注解的方式进行MyBatis开辟,这种方式简化了XML配置文件的编写,使我能够更专注于业务逻辑的实现。通过注解,我实现了查询某个弟子的全部课程成绩的功能。
[*]问题解决:在实行过程中,我遇到了一些问题,如SLF4J的警告和MyBatis的PersistenceException。通过查阅文档和资料,我成功解决了这些问题,这不仅提升了我的问题解决能力,也加深了我对MyBatis和相关技能的理解。










免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【基于轻量型架构的WEB开辟】课程 实行一 mybatis操作 Java EE企业级应用开