MyBatis 是優秀的半自動 ORM 框架,支援自定義 SQL、存儲過程、高級映射。本文從核心概念、JAR 依賴、Spring 整合配置、實體/DAO/Mapper 編寫、事務管理、JUnit/SpringMVC 測試,提供一份可直接落地的完整教程。
SqlSessionFactory、SqlSession、Mapper 接口、XML 映射文件。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.27</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.27</version>
</dependency>
CREATE DATABASE student_manager;
USE student_manager;
CREATE TABLE student_tbl (
student_id VARCHAR(255) PRIMARY KEY,
student_name VARCHAR(10) NOT NULL,
student_sex VARCHAR(10),
student_birthday DATE,
class_id VARCHAR(255)
);
INSERT INTO student_tbl VALUES ('10000013', '張三', '男', '2000-01-01', '121546');
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/student_manager?useSSL=false&serverTimezone=UTC
jdbc.username=root
jdbc.password=123456
<?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="StudentEntity" type="com.manager.data.model.StudentEntity"/>
</typeAliases>
<mappers>
<mapper resource="com/manager/data/maps/StudentMapper.xml"/>
</mappers>
</configuration>
<beans ...>
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 掃描 Mapper 接口自動創建代理 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.manager.data"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
public class StudentEntity implements Serializable {
private String studentID;
private String studentName;
private String studentSex;
private Date studentBirthday;
private ClassEntity classEntity; // 關聯對象
// getter/setter 略
}
public interface StudentMapper {
StudentEntity getStudent(String studentID);
StudentEntity getStudentAndClass(String studentID); // 關聯查詢
List<StudentEntity> getStudentAll();
void insertStudent(StudentEntity entity);
void deleteStudent(StudentEntity entity);
void updateStudent(StudentEntity entity);
}
<mapper namespace="com.manager.data.StudentMapper">
<resultMap id="studentResultMap" type="StudentEntity">
<id property="studentID" column="STUDENT_ID"/>
<result property="studentName" column="STUDENT_NAME"/>
<result property="studentSex" column="STUDENT_SEX"/>
<result property="studentBirthday" column="STUDENT_BIRTHDAY"/>
<association property="classEntity" javaType="ClassEntity">
<id property="classId" column="CLASS_ID"/>
<result property="className" column="CLASS_NAME"/>
</association>
</resultMap>
<select id="getStudent" parameterType="String" resultMap="studentResultMap">
SELECT * FROM student_tbl WHERE student_id = #{studentID}
</select>
<select id="getStudentAll" resultMap="studentResultMap">
SELECT * FROM student_tbl
</select>
<insert id="insertStudent" parameterType="StudentEntity">
INSERT INTO student_tbl (student_id, student_name, student_sex, student_birthday, class_id)
VALUES (#{studentID}, #{studentName}, #{studentSex}, #{studentBirthday}, #{classEntity.classId})
</insert>
<update id="updateStudent" parameterType="StudentEntity">
UPDATE student_tbl SET student_name=#{studentName}, student_sex=#{studentSex},
student_birthday=#{studentBirthday}, class_id=#{classEntity.classId}
WHERE student_id=#{studentID}
</update>
<delete id="deleteStudent" parameterType="StudentEntity">
DELETE FROM student_tbl WHERE student_id=#{studentID}
</delete>
</mapper>
DataSourceTransactionManager + <tx:annotation-driven/>。@Transactional,異常回滾。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class StudentMapperTest {
@Autowired StudentMapper studentMapper;
@Test
@Transactional // 測試回滾
public void testCRUD() {
StudentEntity s = studentMapper.getStudent("10000013");
assertNotNull(s);
List<StudentEntity> list = studentMapper.getStudentAll();
assertTrue(list.size() > 0);
}
}
@Controller
public class TestController {
@Autowired StudentMapper studentMapper;
@RequestMapping("/index.do")
@ResponseBody
public String index() {
StudentEntity s = studentMapper.getStudent("10000013");
return "name: " + s.getStudentName();
}
}
MyBatis + Spring 整合核心在於:SqlSessionFactoryBean 綁定 DataSource、MapperScannerConfigurer 掃描接口生成代理、事務管理器接管事務邊界。掌握 XML 映射細節(resultMap、association、collection),即可高效完成數據訪問層開發。