本文以一個 user 表為例,示範 MyBatis 如何完成創建、讀取、更新、刪除(CRUD)全流程。採用 XML 映射檔 + 介面式開發模式,結構清晰,易於維護。
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userName` varchar(50) DEFAULT NULL,
`userAge` int(11) DEFAULT NULL,
`userAddress` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `user` VALUES
('1', 'summer', '30', 'shanghai'),
('2', 'test2', '22', 'suzhou'),
('3', 'test1', '29', 'some place'),
('4', 'lu', '28', 'some place'),
('5', 'xiaoxun', '27', 'nanjing');
Configuration.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 alias="User" type="com.mybatis.test.User"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="admin"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/mybatis/test/User.xml"/>
</mappers>
</configuration>
User.xml<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.test.IUserOperation">
<!-- 單條查詢 -->
<select id="selectUserByID" parameterType="int" resultType="User">
SELECT * FROM `user` WHERE id = #{id}
</select>
<!-- 多條查詢(按姓名) -->
<select id="selectUsersByName" parameterType="string" resultType="User">
SELECT * FROM `user` WHERE userName = #{userName}
</select>
<!-- 新增:回寫自增主鍵 -->
<insert id="addUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
INSERT INTO `user`(userName, userAge, userAddress) VALUES(#{userName}, #{userAge}, #{userAddress})
</insert>
<!-- 修改 -->
<update id="updateUser" parameterType="User">
UPDATE `user` SET userName=#{userName}, userAge=#{userAge}, userAddress=#{userAddress} WHERE id=#{id}
</update>
<!-- 刪除 -->
<delete id="deleteUser" parameterType="int">
DELETE FROM `user` WHERE id=#{id}
</delete>
</mapper>
關鍵點:
useGeneratedKeys="true" keyProperty="id" 讓 MyBatis 自動獲取資料庫生成的自增 ID 並回填到對象。parameterType 與介面方法參數類型一致;resultType 對應返回實體類。<resultMap> 映射(文中註釋部分示範)。User.javapackage com.mybatis.test;
public class User {
private int id;
private String userName;
private int userAge;
private String userAddress;
// Getter/Setter 省略
@Override public String toString() {
return userName + " " + userAge + " " + userAddress;
}
}
IUserOperation.javapackage com.mybatis.test;
import java.util.List;
public interface IUserOperation {
User selectUserByID(int id);
List<User> selectUsersByName(String userName);
void addUser(User user);
void updateUser(User user);
void deleteUser(int id);
}
Test.java —— 關鍵:增刪改必須 commit()package com.mybatis.test;
import java.io.Reader;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class Test {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
Reader reader = Resources.getResourceAsReader("Configuration.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) { e.printStackTrace(); }
}
public void getUserByID(int userID) {
try (SqlSession session = sqlSessionFactory.openSession()) {
IUserOperation op = session.getMapper(IUserOperation.class);
User user = op.selectUserByID(userID);
if (user != null) System.out.println(user.getId() + ":" + user.getUserName() + ":" + user.getUserAddress());
}
}
public void addUser() {
User user = new User();
user.setUserAddress("place");
user.setUserName("test_add");
user.setUserAge(30);
try (SqlSession session = sqlSessionFactory.openSession()) {
IUserOperation op = session.getMapper(IUserOperation.class);
op.addUser(user);
session.commit(); // ★ 必須提交事務
System.out.println("新增用戶ID:" + user.getId());
}
}
// updateUser、deleteUser 同理需 commit()
public static void main(String[] args) { /* 測試代碼省略 */ }
}
session.commit():MyBatis 預設不自動提交,增刪改不提交數據不會落庫。finally 確保 session.close()。MyBatis CRUD 核心在於:配置文件正確、映射 SQL 與介面方法一一對應、事務手動提交。掌握此範例,即可輕鬆擴展至複雜業務場景。