MyBatis系统学习(一)——项目结构及其含义

1. MyBatis 简介

MyBatis 是一款优秀的持久层框架,它通过 SQL 映射的方式实现 Java 对数据库操作的映射,既保留了 SQL 语句的灵活性,也简化了代码的编写。

在一个 MyBatis 项目中,核心部分主要有:

  • 配置文件(mybatis-config.xml
  • 映射文件(Mapper.xml
  • 实体类(Entity/POJO
  • 接口类(Mapper接口
  • MyBatis 会话工厂(SqlSessionFactory

下面我们按照典型的 MyBatis 项目结构,逐步解释这些组成部分。

2. 项目结构

使用 MyBatis 的项目结构通常如下:

src
├── main
│   ├── java
│   │   └── com
│   │       └── example
│   │           ├── entity           # 实体类
│   │           │   └── User.java
│   │           ├── mapper           # Mapper接口
│   │           │   └── UserMapper.java
│   │           ├── service          # 业务逻辑层
│   │           │   └── UserService.java
│   │           └── MyBatisMain.java # 主程序入口
│   ├── resources
│   │   ├── mapper                   # Mapper XML 文件
│   │   │   └── UserMapper.xml
│   │   └── mybatis-config.xml       # MyBatis 配置文件
├── test                              # 测试目录
│   └── java
└── pom.xml                           # Maven 项目管理文件

3. 实体类(Entity/POJO)

实体类是与数据库表对应的 Java 类,它通常包含数据库表中各字段的属性以及 getter/setter 方法。

示例代码:User.java
package com.example.entity;

public class User {
    private Integer id;
    private String name;
    private String email;

    // getter 和 setter 方法
    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 String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{id=" + id + ", name='" + name + "', email='" + email + "'}";
    }
}
解释:
  1. User 类对应数据库中的 User 表。
  2. 类中的属性 idnameemail 对应表中的字段。
  3. gettersetter 方法用于获取和设置属性值。
  4. toString() 方法用于格式化输出用户信息。

4. Mapper 接口

Mapper 接口定义了针对数据库的操作方法。每个方法都对应数据库中的一个 SQL 操作。

示例代码:UserMapper.java
package com.example.mapper;

import com.example.entity.User;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface UserMapper {

    @Select("SELECT * FROM users WHERE id = #{id}")
    User selectUserById(Integer id);

    @Select("SELECT * FROM users")
    List<User> selectAllUsers();
}
解释:
  1. UserMapper 是一个接口,里面定义了两个方法用于查询数据库。
  2. @Select 注解直接将 SQL 语句嵌入在方法上,这是一种简单的方式,另一种方式是使用 XML 映射文件(后面会讲解)。
  3. selectUserById 方法通过用户 id 查询用户信息。
  4. selectAllUsers 方法查询所有用户信息。

5. Mapper XML 文件

Mapper XML 文件中定义了 SQL 映射,它提供了比注解更多的灵活性。

示例代码:UserMapper.xml

DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">

    <select id="selectUserById" parameterType="int" resultType="com.example.entity.User">
        SELECT * FROM users WHERE id = #{id}
    select>

    <select id="selectAllUsers" resultType="com.example.entity.User">
        SELECT * FROM users
    select>

mapper>
解释:
  1. namespace 对应 Mapper 接口的全限定名,即 com.example.mapper.UserMapper
  2. select 标签定义了 SQL 语句,每个 id 对应 Mapper 接口中的方法名。
  3. parameterType 表示参数类型,resultType 表示返回结果类型。
  4. 使用 #{} 语法来绑定参数,例如 #{id} 表示将方法参数传递给 SQL 查询。

6. MyBatis 配置文件

mybatis-config.xml 是 MyBatis 的核心配置文件,用于设置环境、数据库连接和其他全局配置。

示例代码:mybatis-config.xml

DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    
    
     
    <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/testdb"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            dataSource>
        environment>
    environments>

    
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    mappers>
configuration>
解释:
  1. environments 配置了 MyBatis 的运行环境,包括数据库连接的相关信息。default 属性指定默认的环境为 development
  2. transactionManager 配置事务管理器,JDBC 方式直接使用数据库的事务。
  3. dataSource 配置数据库连接池,这里使用 POOLED 连接池,参数包括数据库驱动、URL、用户名和密码。
  4. mappers 中注册了 UserMapper.xml 映射文件。

7. 主程序入口

主程序入口用于初始化 MyBatis,并执行数据库操作。

示例代码:MyBatisMain.java
package com.example;

import com.example.entity.User;
import com.example.mapper.UserMapper;
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;
import java.util.List;

public class MyBatisMain {
    public static void main(String[] args) throws IOException {
        // 1. 读取 MyBatis 配置文件
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        
        // 2. 创建 SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        
        // 3. 获取 SqlSession
        try (SqlSession session = sqlSessionFactory.openSession()) {
            // 4. 获取 Mapper
            UserMapper userMapper = session.getMapper(UserMapper.class);
            
            // 5. 执行查询操作
            User user = userMapper.selectUserById(1);
            System.out.println(user);
            
            // 查询所有用户
            List<User> users = userMapper.selectAllUsers();
            users.forEach(System.out::println);
        }
    }
}
解释:
  1. Resources.getResourceAsStream 方法加载 MyBatis 配置文件。
  2. SqlSessionFactoryBuilder 创建 SqlSessionFactory,用于创建 SqlSession 对象。
  3. SqlSession 是 MyBatis 操作数据库的会话对象,类似于 JDBC 的 Connection
  4. session.getMapper(UserMapper.class) 获取 Mapper 接口的代理对象。
  5. 使用 UserMapper 接口的方法来执行数据库查询操作。

8. 总结

  • 实体类 用于映射数据库中的表,类中的属性对应表中的字段。
  • Mapper 接口 定义了与数据库交互的方法,通过注解或 XML 来编写 SQL 语句。
  • Mapper XML 文件 可以定义更复杂的 SQL 语句。
  • MyBatis 配置文件 包含数据库连接、事务管理、Mapper 文件注册等配置。
  • 主程序入口 通过 MyBatis 的 SqlSession 来执行具体的数据库操作。

这就是一个 MyBatis 项目的完整结构和关键部分解释。通过这种方式,MyBatis 将数据库操作与 Java 代码解耦,便于维护和扩展。

你可能感兴趣的:(MyBatis,mybatis,学习,web,后端)