環境準備清單
| 組件 | 版本建議 | 下載來源 |
| JDK | 1.8+ (推薦 11/17 LTS) | Oracle / Adoptium |
| IDE | Eclipse IDE for Java EE / IntelliJ IDEA | 官網 |
| MySQL | 5.7 / 8.0 | MySQL 官網 |
| MyBatis 核心包 | 3.5.x | Maven Central / GitHub |
| MySQL 驅動 | 8.0.x (mysql-connector-j) | Maven Central |
項目結構規範
MybatisDemo
├── src
│ ├── david.mybatis.demo // 測試代碼、工具類
│ └── david.mybatis.model // 實體類
├── config // MyBatis 全局配置文件
├── mapper // SQL 映射文件
└── lib // 手動管理 JAR 包(非 Maven 項目)
核心配置文件詳解
1. mybatis-config.xml - 全局配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 類型別名:簡化映射文件中的類型聲明 -->
<typeAliases>
<typeAlias type="david.mybatis.model.Visitor" alias="Visitor"/>
<!-- 批量掃描包下所有實體 -->
<package name="david.mybatis.model"/>
</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://127.0.0.1:3306/mybatis_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 映射器掃描 -->
<mappers>
<package name="david.mybatis.mapper"/>
</mappers>
</configuration>
關鍵配置說明
- dataSource type="POOLED":啟用連接池,生產環境必備
- MySQL 8.0+ 驅動類:
com.mysql.cj.jdbc.Driver(舊版為 com.mysql.jdbc.Driver)
- URL 參數:
useSSL=false 禁用 SSL,serverTimezone 避免時區警告
- mapper 掃描:
<package> 批量註冊,避免逐個配置
2. 數據庫表結構初始化
CREATE DATABASE mybatis_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE mybatis_db;
CREATE TABLE Visitor (
Id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(100) NOT NULL,
Email VARCHAR(100) NOT NULL,
Status INT NOT NULL DEFAULT 1,
CreateTime DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE Website (
Id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
Name VARCHAR(100) NOT NULL,
VisitorId INT,
Status INT NOT NULL DEFAULT 1,
CreateTime DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (VisitorId) REFERENCES Visitor(Id)
);
CREATE TABLE Channel (
Id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
Name VARCHAR(100) NOT NULL,
WebsiteId INT,
Status INT NOT NULL DEFAULT 1,
CreateTime DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (WebsiteId) REFERENCES Website(Id)
);
核心工具類實現
MybatisUtils.java - Session 管理
public class MybatisUtils {
private static final String CONFIG = "config/mybatis-config.xml";
private static SqlSessionFactory sqlSessionFactory;
static {
try (InputStream is = Resources.getResourceAsStream(CONFIG)) {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
throw new ExceptionInInitializerError("MyBatis 初始化失敗: " + e.getMessage());
}
}
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession(); // 非自動提交
}
public static void closeSession(SqlSession session) {
if (session != null) session.close();
}
}
實體類示例
public class Visitor {
private int id;
private String name;
private String email;
private int status;
private Date createTime;
// 構造器、getter/setter、toString...
}
Mapper 接口與 XML
// IVisitorOperation.java
public interface IVisitorOperation {
Visitor basicQuery(int id);
}
<!-- VisitorMapper.xml -->
<mapper namespace="david.mybatis.demo.IVisitorOperation">
<select id="basicQuery" parameterType="int" resultType="Visitor">
select * from Visitor where id = #{id} and Status > 0
</select>
</mapper>
Hello World 測試
public class App {
public static void main(String[] args) {
SqlSession session = MybatisUtils.getSqlSession();
try {
IVisitorOperation mapper = session.getMapper(IVisitorOperation.class);
Visitor visitor = mapper.basicQuery(1);
System.out.println("查詢結果: " + visitor);
} finally {
MybatisUtils.closeSession(session);
}
}
}
常見坑點與解決方案
| 問題現象 | 原因分析 | 解決方案 |
| Loading class com.mysql.jdbc.Driver 失敗 | MySQL 8.0+ 驅動類名變更 | 改用 com.mysql.cj.jdbc.Driver |
| CST 時區警告 / 時間差 8 小時 | JDBC URL 缺少 serverTimezone | 添加 serverTimezone=Asia/Shanghai |
| Mapper 找不到 / BindingException | namespace 與接口全限定名不一致 | 嚴格對應 namespace = 接口全名 |
| 中文亂碼 | 字符集配置缺失 | URL 添加 useUnicode=true&characterEncoding=utf8,表用 utf8mb4 |
| 自增主鍵回填失效 | 缺少 useGeneratedKeys/keyProperty | insert 標籤添加 useGeneratedKeys="true" keyProperty="id" |
Maven 依賴管理(推薦)
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.9</version>
</dependency>
</dependencies>
總結
MyBatis 環境搭建的核心在於:配置文件規範(typeAliases、environments、mappers)、數據庫連接正確(驅動版本匹配、URL 參數完整)、Mapper 映射精準(namespace/id/類型嚴格對應)。建議採用 Maven 管理依賴,使用 <package> 批量掃描減少配置錯誤。完成 Hello World 後,即可進階學習動態 SQL、關聯映射、分頁插件、緩存機制等核心特性。