承接上篇 MyBatis 快速入門,本文詳細講解如何使用 MyBatis 對 users 表執行 Create、Retrieve、Update、Delete 完整操作,涵蓋 XML 映射與註解兩種實現方式。
users(id, name, age)me.gacl.domain.User (id, name, age + getter/setter)MyBatisUtil 提供 SqlSessionFactory 與 SqlSessionconf.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="me.gacl.mapping.userMapper">
<!-- 查詢單個用戶 -->
<select id="getUser" parameterType="int" resultType="me.gacl.domain.User">
SELECT * FROM users WHERE id = #{id}
</select>
<!-- 新增用戶 (Create) -->
<insert id="addUser" parameterType="me.gacl.domain.User">
INSERT INTO users(name, age) VALUES(#{name}, #{age})
</insert>
<!-- 刪除用戶 (Delete) -->
<delete id="deleteUser" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>
<!-- 更新用戶 (Update) -->
<update id="updateUser" parameterType="me.gacl.domain.User">
UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}
</update>
<!-- 查詢所有用戶 -->
<select id="getAllUsers" resultType="me.gacl.domain.User">
SELECT * FROM users
</select>
</mapper>
package me.gacl.test;
import me.gacl.domain.User;
import me.gacl.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class TestCRUDByXmlMapper {
@Test
public void testAdd() {
// true = 自動提交事務
SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
String statement = "me.gacl.mapping.userMapper.addUser";
User user = new User();
user.setName("用戶孤獨蒼狼");
user.setAge(25);
int result = sqlSession.insert(statement, user);
sqlSession.close();
System.out.println("新增結果: " + result); // 返回影響行數
}
@Test
public void testUpdate() {
SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
String statement = "me.gacl.mapping.userMapper.updateUser";
User user = new User();
user.setId(1);
user.setName("孤獨蒼狼");
user.setAge(26);
int result = sqlSession.update(statement, user);
sqlSession.close();
System.out.println("更新結果: " + result);
}
@Test
public void testDelete() {
SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
String statement = "me.gacl.mapping.userMapper.deleteUser";
int result = sqlSession.delete(statement, 1);
sqlSession.close();
System.out.println("刪除結果: " + result);
}
@Test
public void testGetAll() {
SqlSession sqlSession = MyBatisUtil.getSqlSession();
String statement = "me.gacl.mapping.userMapper.getAllUsers";
List<User> users = sqlSession.selectList(statement);
sqlSession.close();
System.out.println("查詢全部: " + users);
}
}
package me.gacl.mapping;
import me.gacl.domain.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface UserMapperI {
@Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})")
int add(User user);
@Delete("DELETE FROM users WHERE id = #{id}")
int deleteById(int id);
@Update("UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}")
int update(User user);
@Select("SELECT * FROM users WHERE id = #{id}")
User getById(int id);
@Select("SELECT * FROM users")
List<User> getAll();
}
<mappers>
<mapper resource="me/gacl/mapping/userMapper.xml"/>
<mapper class="me.gacl.mapping.UserMapperI"/>
</mappers>
package me.gacl.test;
import me.gacl.domain.User;
import me.gacl.mapping.UserMapperI;
import me.gacl.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class TestCRUDByAnnotationMapper {
@Test
public void testAdd() {
SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
UserMapperI mapper = sqlSession.getMapper(UserMapperI.class);
User user = new User();
user.setName("用戶xdp");
user.setAge(20);
int result = mapper.add(user);
sqlSession.close();
System.out.println("註解新增: " + result);
}
@Test
public void testUpdate() {
SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
UserMapperI mapper = sqlSession.getMapper(UserMapperI.class);
User user = new User();
user.setId(1);
user.setName("孤獨蒼狼_xdp");
user.setAge(30);
int result = mapper.update(user);
sqlSession.close();
System.out.println("註解更新: " + result);
}
@Test
public void testGetAll() {
SqlSession sqlSession = MyBatisUtil.getSqlSession();
UserMapperI mapper = sqlSession.getMapper(UserMapperI.class);
List<User> users = mapper.getAll();
sqlSession.close();
System.out.println("註解查詢全部: " + users);
}
}
package me.gacl.util;
import org.apache.ibatis.session.*;
import java.io.InputStream;
public class MyBatisUtil {
public static SqlSessionFactory getSqlSessionFactory() {
String resource = "conf.xml";
InputStream is = MyBatisUtil.class.getClassLoader().getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(is);
}
public static SqlSession getSqlSession() {
return getSqlSessionFactory().openSession();
}
public static SqlSession getSqlSession(boolean autoCommit) {
return getSqlSessionFactory().openSession(autoCommit);
}
}
me.gacl.mapping.userMapper.addUser = namespace + "." + insert id,唯一定位一條 SQL。
#{id}:預編譯參數 (PreparedStatement),防 SQL 注入,推薦${id}:字串直接替換,僅用於動態表名/欄位名等無法預編譯場景resultType="User" 自動匹配屬性名與欄位名<resultMap> 處理關聯查詢、嵌套結果openSession(true):自動提交,適合單條增刪改openSession(false):手動提交,sqlSession.commit(),適合多步事務| 場景 | 推薦方式 | 理由 |
|---|---|---|
| 簡單 CRUD | 註解 | 代碼集中、重構友好、IDE 支援好 |
| 複雜動態 SQL | XML | <if><choose><trim> 等標籤更直觀 |
| 多表關聯查詢 | XML | <resultMap> <association> <collection> 強大 |
| SQL 需 DBA 獨立維護 | XML | SQL 與 Java 代碼分離 |
| 存儲過程調用 | XML | <select statementType="CALLABLE"> |
autoCommit=true 或手動 commit()sqlSession.close()本文展示了 MyBatis 實現 CRUD 的兩種主流方式:XML 映射適合複雜 SQL 與團隊協作,註解映射適合簡單 CRUD 與開發效率。掌握 SqlSession 的獲取、SQL 定位、參數綁定、結果映射、事務控制五大核心環節,即可熟練使用 MyBatis 進行資料庫操作。