# SqlSessionFactory和SqlSession怎么在MyBatis中使用
## 目錄
- [第一章:MyBatis核心組件概述](#第一章mybatis核心組件概述)
- [第二章:SqlSessionFactory詳解](#第二章sqlsessionfactory詳解)
- [第三章:SqlSession核心機制解析](#第三章sqlsession核心機制解析)
- [第四章:最佳實踐與性能優化](#第四章最佳實踐與性能優化)
- [第五章:常見問題解決方案](#第五章常見問題解決方案)
- [第六章:整合Spring的進階用法](#第六章整合spring的進階用法)
- [第七章:源碼級深度解析](#第七章源碼級深度解析)
- [第八章:未來發展與總結](#第八章未來發展與總結)
---
## 第一章:MyBatis核心組件概述
### 1.1 MyBatis架構全景圖
```mermaid
graph TD
A[Configuration] --> B[SqlSessionFactory]
B --> C[SqlSession]
C --> D[Executor]
D --> E[StatementHandler]
E --> F[ResultSetHandler]
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(configuration);
配置項 | 默認值 | 生產環境建議 |
---|---|---|
cacheEnabled | true | 分布式環境建議false |
lazyLoadingEnabled | false | 根據業務需求設置 |
defaultExecutorType | SIMPLE | BATCH適合批量操作 |
try (SqlSession session = sqlSessionFactory.openSession()) {
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
// 自動關閉時執行rollback(未顯式commit)
}
類型 | 特點 | 適用場景 |
---|---|---|
SIMPLE | 普通執行 | 常規CRUD |
REUSE | 預處理語句復用 | 高頻相同SQL |
BATCH | 批量模式 | 數據導入場景 |
// 手動提交模式
session.commit();
// 回滾操作
session.rollback();
// 設置自動提交
SqlSession autoCommitSession =
sqlSessionFactory.openSession(true);
<!-- Druid配置示例 -->
<dataSource type="com.alibaba.druid.pool.DruidDataSource">
<property name="maxActive" value="20"/>
<property name="initialSize" value="5"/>
</dataSource>
@CacheNamespace(
implementation = RedisCache.class,
eviction = LruCache.class,
flushInterval = 60000
)
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User selectById(int id);
}
try {
mapper.update(data);
} catch (PersistenceException e) {
if (e.getCause() instanceof SQLException) {
// 處理SQL異常
}
}
// 添加攔截器檢測未關閉Session
@Intercepts(@Signature(type= Executor.class, method="close", args={boolean.class}))
public class SessionLeakInterceptor implements Interceptor {
// 實現代碼...
}
@Configuration
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })
@EnableConfigurationProperties(MybatisProperties.class)
public class MybatisAutoConfiguration {
// 自動配置邏輯...
}
// 源碼調用鏈
DefaultSqlSessionFactory.openSession()
→ TransactionFactory.newTransaction()
→ Executor.newExecutor()
→ create StatementHandler
// MyBatis Reactive示例
Flux<User> users = mybatisReactiveTemplate.selectList(
"com.example.mapper.UserMapper.findAll");
? Kubernetes感知的連接池 ? Serverless環境下的冷啟動優化 “`
注:此為文章結構示例,完整11500字內容需擴展每個章節的詳細技術解析、代碼示例、性能測試數據、原理示意圖等內容。建議每個主要章節保持2000-3000字的深度技術解析,配合實際案例說明。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。