在企業級 Java 開發中,Spring 負責統一管理業務層與持久層組件,而 MyBatis 則提供靈活的 SQL 映射能力。兩者整合的關鍵在於:
SqlSessionFactorySqlSessionFactory 建立 SqlSession建議採用標準 Maven 專案結構,核心依賴包括:
在 applicationContext.xml 中配置資料源與 SqlSessionFactoryBean:
<context:property-placeholder location="classpath:db.properties" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxActive" value="10" />
<property name="maxIdle" value="5" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="mybatis/SqlMapConfig.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
DAO 實作類繼承 SqlSessionDaoSupport,透過 Spring 注入 SqlSessionFactory:
<bean id="userDao" class="cn.itcast.ssm.dao.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
使用 MapperFactoryBean 逐一定義代理對象雖然可行,但維護成本高。建議採用 MapperScannerConfigurer 掃描包路徑自動註冊:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.itcast.ssm.mapper" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
注意:使用 sqlSessionFactoryBeanName 而非 sqlSessionFactory,確保資料源與屬性檔優先載入。
官方提供的 MyBatis Generator 可針對單表自動生成 PO、Mapper 介面與 XML 映射檔,極大提升開發效率。
<generatorConfiguration>
<context id="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis"
userId="root" password="mysql">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<javaModelGenerator targetPackage="cn.itcast.ssm.po" targetProject=".\src">
<property name="enableSubPackages" value="false" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<sqlMapGenerator targetPackage="cn.itcast.ssm.mapper" targetProject=".\src">
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER" targetPackage="cn.itcast.ssm.mapper" targetProject=".\src">
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<table tableName="items"/>
<table tableName="orders"/>
<table tableName="orderdetail"/>
<table tableName="user"/>
</context>
</generatorConfiguration>
將生成的代碼複製至專案對應包路徑,即可直接使用 Mapper 介面提供的 CRUD 方法,例如:
// 條件查詢
ItemsExample example = new ItemsExample();
example.createCriteria().andNameEqualTo("筆記本3");
List<Items> list = itemsMapper.selectByExample(example);
// 主鍵查詢
Items item = itemsMapper.selectByPrimaryKey(1);
// 新增
Items newItem = new Items();
newItem.setName("手機");
newItem.setPrice(999f);
itemsMapper.insert(newItem);
// 更新(全欄位)
Items updateItem = itemsMapper.selectByPrimaryKey(1);
updateItem.setName("水杯");
itemsMapper.updateByPrimaryKey(updateItem);
Spring 整合 MyBatis 透過統一管理 SqlSessionFactory 與 Mapper 掃描,實現了依賴注入與聲明式事務的無縫銜接。搭配逆向工程,可快速完成基礎持久層代碼生成,讓開發者專注於業務邏輯與複雜 SQL 優化。