一、整合思路
需要spring通過單例方式管理SqlSessionFactory。
spring和mybatis整合生成代理對象,使用SqlSessionFactory創建SqlSession(spring和mybatis整合自動完成)。
持久層的mapper都需要由spring進行管理。
二、整合之後結構圖
三、配置SqlSessionFactory和數據源
在applicationContext.xml配置SqlSessionFactory和數據源。<!—加載配置文件 -->
<context:property-placeholder location=”classpath:db.properties”/>
<!—數據源,使用dbcp -->
<bean id=”dataSource” class=”org.apache.commons.dbcp.BasicDataSource” destroy-method=”close”>
<property name=”driverClassName” value=”${jdbc.driver}”
//繼續配置url、username、password、maxActive、maxIdle等
</bean>
<!-- sqlSessionFactory -->
<bean id=”sqlSessionFactory” class=”org.mybatis.spring.SqlSessionFactoryBean”>
<!—加載mybatis的配置文件 -->
<property name=”configLocation” value=”mybatis/SqlMapConfig.xml”/>
<!—數據源 -->
<property name=”datasource” ref=” datasource”/>
</bean>
假設已經寫好pojo、映射文件(原始dao方式名稱爲User.xml;代理開發方式爲xxMapper.xml)。、在SQLConfigMap.xml中加載映射文件,然後接着開發:
四、原始dao方式
1、dao實現類繼承SqlSessionDaoSupport
dao接口實現類需要注入SqlSessionFactory,通過spring進行注入。兩種方式:自動注入或者聲明配置方式;這裏使用聲明配置方式,配置dao的bean:讓UserDaoImpl實現類繼承SqlSessionDaoSupport。
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao{
@override
public User findUserById(int id) throws Exception{
//繼承SqlSessionDaoSupport,通過this.getSqlSession()得到sqlSession
SqlSession sqlSession = this.getSqlSession();
User user = sqlSession.selectOne(“test.findUserById”, id);
return user;
<span style="white-space:pre"> </span>}
}
2、配置dao
在applicationContext.xml中配置dao。
<!—原始dao接口 -->
<bean id=”userDao” class=”cn.itcast.ssm.dao.UserDaoImpl”>
<property name=”sqlSessionFactory” ref=”sqlSessionFactory”/>
</bean>
3、測試
public class UserDaoImplTest{
private ApplicationContext applicationContext;
//在setUp這個方法得到spring容器
@Before
public void setUp() throws Exception{
applicationContext = new ClassPathXmlApplicationContext(“classpath:spring/applicationContext”)
<span style="white-space:pre"> </span>}
@Test
public void testFindUserById() throws Exception{
UserDao userDao = (UserDao)applicationContext.getBean(“userDao”);
User user = userDao.findUserById(1);
System.out.println(user);
<span style="white-space:pre"> </span>}
}
五、mapper代理開發方式
1、mapper.xml和mapper.java
2、通過MapperFactoryBean創建代理對象
<!—mapper配置MapperFactoryBean:根據mapper接口生成代理對象 -->
<bean id=”userMapper” class=”org.mybatis.spring.mapper.MapperFactoryBean”>
<!--mapperInterface指定mapper接口 -->
<property name=”mapperInterface” value=”cn.itcast.ssm.mapper.UserMapper”/>
<property name=”sqlSessionFactory” ref=”sqlSessionFactory”/>
</bean>
此方法問題:需要針對每個mapper進行配置,麻煩。
3、通過MapperScannerConfigurer進行mapper掃描
<!—加載映射文件 -->
<mappers>
<mapper resource=”sqlmap/User.xml”/>
<!—批量加載mapper
指定mapper接口的包名,mybatis自動掃描包下所有mapper接口進行加載。遵循一些規範:需要將mapper接口類名和mapper.xml映射文件名保持一致,且在一個目錄下。上邊規範的前提是:使用 的是mapper代理方法。
和spring整合後,使用mapper掃描器,mybatis的配置文件中就不需要配置了
<!-- <package name=”cn.itcast.ssm.mapper”/> -->
-->
</mappers>
<!—mapper批量掃描,從mapper包中掃描出mapper接口,自動創建代理對象並且在spring容器中註冊。遵循規範:將mapper.java和mapper.xml映射文件名稱保持一致,且在一個目錄中。自動掃描出來的mapper的bean的id爲mapper類名(首字母小寫) -->
<bean class=”org.mybatis.spring.mapper.MapperScannerConfigurer”>
<!—指定掃描的包名。如果掃描多個包,每個包中間使用半角逗號分隔 -->
<property name=”basePackage” value=”cn.itcast.ssm.mapper”/>
<property name=”sqlSessionFactoryBeanName” value=”sqlSessionFactory”/>
</bean>
4、測試代碼
@Test
public void testFindUserById() throws Exceptino{
UserMapper userMapper = (userMapper)applicationContext.getBean(“userMapper”);
User user = userMapper.findUserById(1);
System.out.println(user);
}
六、逆向工程
mybatis需要程序員自己編寫sql語句,mybatis官方提供逆向工程,可以針對單表自動生成mybatis執行所需要的代碼(mapper.java、mapper.xml、po等等)
企業實際開發彙總,常用的逆向工程方式:由數據庫的表生成java代碼。