1. Không được đóng thủ công đối tượng SqlSession
Khi MyBatis được quản lý bởi Spring, bạn không nên đóng thủ công đối tượng SqlSession. Việc này sẽ gây xung đột với cơ chế quản lý vòng đời của session do Spring cung cấp thông qua SqlSessionTemplate, dẫn đến các ngoại lệ không mong muốn.
2. Tên thuộc tính trong cấu hình Connection Pool
Trong file cấu hình beans.xml, khi định nghĩa bean cho connection pool (ví dụ BasicDataSource), hãy đảm bảo sử dụng đúng tên thuộc tính. Các lỗi thường gặp bao gồm:
driverClassNamethay vìdriverClassurlthay vìjdbcUrlusernamethay vìuser
3. Thiếu các dependency cần thiết
Để sử dụng DBCP (Database Connection Pool) của Apache, bạn cần đảm bảo các thư viện sau có trong classpath của dự án:
commons-dbcpcommons-loggingcommons-pool
4. Quên import file mapper trong SqlMapConfig.xml
Khi sử dụng phương pháp phát triển DAO gốc (original DAO), bạn phải nhớ import các file mapper XML vào file cấu hình SqlMapConfig.xml của MyBatis. Nếu không, MyBatis sẽ không thể tìm thấy các câu truy vấn SQL được định nghĩa trong các file mapper.
Cấu hình ví dụ
File beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<context:component-scan base-package="com.example.demo"/>
<context:property-placeholder location="classpath:db.properties"/>
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="myDataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="mySqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"/>
<property name="dataSource" ref="myDataSource"/>
</bean>
<bean id="customerDao" class="com.example.demo.dao.impl.CustomerDaoImpl">
<property name="sqlSessionFactory" ref="mySqlSessionFactory"/>
</bean>
</beans>
File SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- Cấu hình toàn cục -->
<settings>
<!-- Bật tính năng tải lười (lazy loading) -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- Chuyển từ tải tích cực sang tải theo yêu cầu -->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- Bật bộ nhớ đệm cấp hai -->
<setting name="cacheEnabled" value="true"/>
</settings>
<mappers>
<!-- Tải một file mapper duy nhất -->
<mapper resource="mapper/CustomerMapper.xml"/>
<!-- Tải tất cả mapper trong một package -->
<package name="com.example.demo.mapper"/>
</mappers>
</configuration>