環境準備
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
核心配置文件
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 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.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/mybatis/test/UserMapper.xml"/>
</mappers>
</configuration>
UserMapper.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.UserMapper">
<resultMap id="userMap" type="User">
<id property="id" column="id"/>
<result property="userName" column="user_name"/>
<result property="userAge" column="user_age"/>
<result property="userAddress" column="user_address"/>
</resultMap>
<select id="selectById" parameterType="int" resultMap="userMap">
SELECT * FROM `user` WHERE id = #{id}
</select>
<select id="selectByName" parameterType="string" resultMap="userMap">
SELECT * FROM `user` WHERE user_name = #{userName}
</select>
<insert id="insert" parameterType="User" useGeneratedKeys="true" keyProperty="id">
INSERT INTO `user`(user_name, user_age, user_address)
VALUES(#{userName}, #{userAge}, #{userAddress})
</insert>
<update id="update" parameterType="User">
UPDATE `user` SET user_name=#{userName}, user_age=#{userAge},
user_address=#{userAddress} WHERE id=#{id}
</update>
<delete id="delete" parameterType="int">
DELETE FROM `user` WHERE id = #{id}
</delete>
</mapper>
實體類與 Mapper 接口
// User.java
public class User {
private Integer id;
private String userName;
private Integer userAge;
private String userAddress;
// getter/setter/toString 省略
}
// UserMapper.java
public interface UserMapper {
User selectById(Integer id);
List<User> selectByName(String userName);
void insert(User user);
void update(User user);
void delete(Integer id);
}
測試類:事務控制關鍵點
public class MyBatisTest {
private static SqlSessionFactory sqlSessionFactory;
@BeforeClass
public static void init() throws IOException {
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
}
@Test
public void testCRUD() {
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
// 1. 新增(需提交事務)
User user = new User();
user.setUserName("張三");
user.setUserAge(25);
user.setUserAddress("北京");
mapper.insert(user);
session.commit(); // ★ 關鍵:insert/update/delete 必須 commit
System.out.println("自增 ID: " + user.getId());
// 2. 查詢
User u = mapper.selectById(user.getId());
System.out.println("查詢: " + u);
// 3. 修改
u.setUserAddress("上海");
mapper.update(u);
session.commit();
// 4. 刪除
mapper.delete(u.getId());
session.commit();
}
}
}
核心最佳實踐總結
- resultMap 顯式映射:解決字段名與屬性名不一致(如 user_name ↔ userName)
- useGeneratedKeys + keyProperty:自動回填自增主鍵
- 參數類型匹配:parameterType 與接口方法參數一致
- 事務手動提交:MyBatis 默認不自動提交,增刷改必須
session.commit()
- try-with-resources:自動關閉 SqlSession 防洩漏