MyBatis 是一款优秀的持久层框架,它通过 SQL 映射的方式实现 Java 对数据库操作的映射,既保留了 SQL 语句的灵活性,也简化了代码的编写。
在一个 MyBatis 项目中,核心部分主要有:
mybatis-config.xml
)Mapper.xml
)Entity
/POJO
)Mapper接口
)SqlSessionFactory
)下面我们按照典型的 MyBatis 项目结构,逐步解释这些组成部分。
使用 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 项目管理文件
实体类是与数据库表对应的 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 + "'}";
}
}
User
类对应数据库中的 User
表。id
,name
和 email
对应表中的字段。getter
和 setter
方法用于获取和设置属性值。toString()
方法用于格式化输出用户信息。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();
}
UserMapper
是一个接口,里面定义了两个方法用于查询数据库。@Select
注解直接将 SQL 语句嵌入在方法上,这是一种简单的方式,另一种方式是使用 XML 映射文件(后面会讲解)。selectUserById
方法通过用户 id
查询用户信息。selectAllUsers
方法查询所有用户信息。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>
namespace
对应 Mapper 接口的全限定名,即 com.example.mapper.UserMapper
。select
标签定义了 SQL 语句,每个 id
对应 Mapper 接口中的方法名。parameterType
表示参数类型,resultType
表示返回结果类型。#{}
语法来绑定参数,例如 #{id}
表示将方法参数传递给 SQL 查询。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>
environments
配置了 MyBatis 的运行环境,包括数据库连接的相关信息。default
属性指定默认的环境为 development
。transactionManager
配置事务管理器,JDBC
方式直接使用数据库的事务。dataSource
配置数据库连接池,这里使用 POOLED
连接池,参数包括数据库驱动、URL、用户名和密码。mappers
中注册了 UserMapper.xml
映射文件。主程序入口用于初始化 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);
}
}
}
Resources.getResourceAsStream
方法加载 MyBatis 配置文件。SqlSessionFactoryBuilder
创建 SqlSessionFactory
,用于创建 SqlSession
对象。SqlSession
是 MyBatis 操作数据库的会话对象,类似于 JDBC 的 Connection
。session.getMapper(UserMapper.class)
获取 Mapper 接口的代理对象。UserMapper
接口的方法来执行数据库查询操作。SqlSession
来执行具体的数据库操作。这就是一个 MyBatis 项目的完整结构和关键部分解释。通过这种方式,MyBatis 将数据库操作与 Java 代码解耦,便于维护和扩展。