Java EE期末总结(第四章)

发布于:2025-04-07 ⋅ 阅读:(21) ⋅ 点赞:(0)

目录

一、ORM框架 

二、MyBatis与Hibernate

1、 概念与设计理念

2、SQL 控制

3、学习成本

4、开发效率

三、MyBatisAPI 

1、SqlSessionFactoryBuilder

2、SqlSessionFactory

3、SqlSession

四、MyBatis配置

1、核心依赖与日志依赖

2、建立.XML映射文件

3、建立映射接口文件

4、数据源特性文件

5、框架配置文件

6、封装MyBatisUtil


一、ORM框架 

我们先来了解以下什么时ORM,下图就是一个很直观的展示了ORM之间的关系。 

         ORM框架就是对JDBC进行封装的持久层框架,在实体类对象(POJO对象)与SQL之间通过配置映射文件建立映射关系,将SQL所需的参数及返回的结果字段映射到相应的实体类中。

二、MyBatis与Hibernate

        MyBatis的官方文档:MyBatis中文网

        MyBatis和Hiberbate都是非常流行的ORM框架,前者对JDBC提供了较为完整的封装,后者主要是对实体类对象与SQL之间的映射关系。

1、 概念与设计理念

        MyBatis:作为半自动化的持久化框架,MyBatis 需要开发者手动编写 SQL 语句,对 SQL 有很强的控制能力,更适合对 SQL 性能有较高要求、数据库表结构复杂多变的项目。

        Hibernate:属于全自动化的持久化框架,通过对象关系映射(ORM)技术,开发者无需编写 SQL,只需操作对象即可完成数据库操作,能提高开发效率,适用于快速开发和数据库表结构相对稳定的项目。

2、SQL 控制

        MyBatis:支持开发者编写自定义的 SQL 语句,因此可以对 SQL 进行精细优化,能够处理复杂的查询和业务逻辑。

        Hibernate:自动生成 SQL 语句,虽然方便快捷,但对于复杂的查询,自动生成的 SQL 可能不够优化,而且难以进行深度的定制。

3、学习成本

        MyBatis:由于需要手动编写 SQL,开发者需要具备一定的 SQL 基础和数据库知识,学习成本相对较高。

        Hibernate:无需编写 SQL,只需掌握 ORM 的基本概念和框架的使用方法,学习成本相对较低。

4、开发效率

        MyBatis:手动编写 SQL 会增加开发时间和工作量,尤其是在处理大量的增删改查操作时,但对于复杂业务逻辑,能更灵活地满足需求。

        Hibernate:自动生成 SQL,减少了开发工作量,提高了开发效率,尤其适合快速迭代的项目

三、MyBatisAPI 

1、SqlSessionFactoryBuilder

        此 API 用于构建SqlSessionFactory实例。它能从不同来源(如 XML 配置文件、Java 代码)读取配置信息,进而创建SqlSessionFactory。通常在应用启动时使用一次,创建出的SqlSessionFactory会被复用。

2、SqlSessionFactory

        这是 MyBatis 的核心对象之一,是线程安全的。其作用是创建SqlSession实例,在整个应用中一般只需一个SqlSessionFactory实例。

3、SqlSession

        代表与数据库的一次会话,是非线程安全的,要在一次请求中使用并及时关闭。它提供了执行 SQL 语句、管理事务等功能,包含selectOneselectListinsertupdatedeletecommitrollback等常用方法。

注:在使用SqlSession的方法insert()/delete()/update()时,必须使用事务提交方法commit()。

四、MyBatis配置

实例项目结构

mybatis-demo
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── example
│   │   │           ├── entity
│   │   │           │   └── User.java
│   │   │           ├── mapper
│   │   │           │   └── UserMapper.java
│   │   │           ├── util
│   │   │           │   └── MyBatisUtil.java
│   │   │           └── Main.java
│   │   └── resources
│   │       ├── db.properties
│   │       ├── mybatis-config.xml
│   │       └── com
│   │           └── example
│   │               └── mapper
│   │                   └── UserMapper.xml
└── pom.xml

1、核心依赖与日志依赖

pom.xml

<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>com.example</groupId>
    <artifactId>mybatis-project</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- MyBatis 核心依赖 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <!-- MySQL 数据库驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>
        <!-- SLF4J 和 Logback 日志依赖 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.2</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2、建立.XML映射文件

UserMapper.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.example.mapper.UserMapper">

    <!-- 根据 ID 查询用户 -->
    <select id="getUserById" parameterType="int" resultType="com.example.entity.User">
        SELECT * FROM users WHERE id = #{id}
    </select>

    <!-- 查询所有用户 -->
    <select id="getAllUsers" resultType="com.example.entity.User">
        SELECT * FROM users
    </select>

    <!-- 插入用户 -->
    <insert id="insertUser" parameterType="com.example.entity.User">
        INSERT INTO users (name, age) VALUES (#{name}, #{age})
    </insert>

    <!-- 更新用户 -->
    <update id="updateUser" parameterType="com.example.entity.User">
        UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}
    </update>

    <!-- 删除用户 -->
    <delete id="deleteUser" parameterType="int">
        DELETE FROM users WHERE id = #{id}
    </delete>

</mapper> 

3、建立映射接口文件

UserMapper.java

package com.example;

import java.util.List;

// 此接口对应 XML 映射文件中的 SQL 操作
public interface UserMapper {

    /**
     * 查询所有用户
     * @return 用户列表
     */
    List<User> getAllUsers();

    /**
     * 根据 ID 查询用户
     * @param id 用户 ID
     * @return 用户对象
     */
    User getUserById(int id);

    /**
     * 插入用户
     * @param user 用户对象
     */
    void insertUser(User user);

    /**
     * 更新用户信息
     * @param user 用户对象
     */
    void updateUser(User user);

    /**
     * 根据 ID 删除用户
     * @param id 用户 ID
     */
    void deleteUser(int id);
}    

4、数据源特性文件

db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/DBname?characterEncoding=UTF-8
jdbc.username=root // 根据数据库实际用户名更改
jdbc.password=123456 // 根据数据库实际密码更改

可能这里和书上不一样,这里加了jdbc.*但书上没有,这个具体呢要看你的properties中怎么读取的,如果如下图一样就要加

那什么时候不要加呢,如下图

5、框架配置文件

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"/>
            <!-- 数据源类型 -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 映射器配置 -->
    <mappers>
        <!-- 引入映射文件 -->
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>    

6、封装MyBatisUtil

MyBatisUtil.java

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.IOException;
import java.io.InputStream;

public class MyBatisUtil {
    // 定义静态的 SqlSessionFactory 对象
    private static SqlSessionFactory sqlSessionFactory;

    // 静态代码块,在类加载时执行,用于初始化 SqlSessionFactory
    static {
        try {
            // 加载 MyBatis 配置文件
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            // 创建 SqlSessionFactory
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取 SqlSession 对象
     * @return SqlSession 对象
     */
    public static SqlSession getSqlSession() {
        // 从 SqlSessionFactory 中获取 SqlSession 对象
        return sqlSessionFactory.openSession();
    }

    public static void closeSqlSession(SqlSession session){
        if(session!=null)
        {
            session.close();
        }
    }
}