mybatis與Spring整合之後,開發dao的原始方法,不推薦使用,這裏僅與之前mybatis獨自開發時做簡單的對比。【005-mybatis獨自使用開發dao】
整合思路
需要spring通過單例方式管理SqlSessionFactory。(人工)spring和mybatis整合生成代理對象,使用SqlSessionFactory創建SqlSession。(spring和mybatis整合自動完成)
持久層的mapper都需要由spring進行管理。(人工)
整合環境
創建一個新的java工程(接近實際開發的工程結構)jar包:
mybatis3.2.7的jar包
spring3.2.0的jar包
mybatis和spring的整合包:早期ibatis和spring整合是由spring官方提供,mybatis和spring整合由mybatis提供。
現在開始,重新創建工程項目,基於maven,Spring mvc和mybatis。
【1】新建maven工程,name爲mybatis_spring,建成後添加Spring mvc框架。同之前一樣,創建dao文件夾(包含UserDao.java、UserDaoImpl.java),po文件夾(User),以及resource目錄下的sqlMap文件夾及一些文件。
結構如下:
【2】關鍵代碼
UserDao.java代碼如下:
public interface UserDao {
//根據id查詢
User findUserById(int id) throws Exception;
}
UserDaoImpl.java代碼如下:
dao接口實現類需要注入SqlSessoinFactory,之前通過構造函數實現,now,通過spring進行注入。
這裏spring聲明配置方式,配置dao的bean:
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
public User findUserById(int id) throws Exception {
//繼承sqlSessionDaoSupport,通過this.getSqlSession()得到sqlSession
SqlSession sqlSession = this.getSqlSession();
User user = sqlSession.selectOne("test.findUserById",id);
return user;
}
}
sqlMapConfig.xml代碼如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 別名定義 -->
<typeAliases>
<!-- 批量別名定義
指定包名,mybatis自動掃描包中的po類,自動定義別名,別名就是類名(首字母大寫或小寫都可以)-->
<package name="po"/>
</typeAliases>
<!-- 加載 映射文件 -->
<mappers>
<!--<package name="mapper"/>-->
<mapper resource="sqlMap/User.xml"/>
</mappers>
</configuration>
applicationContext.xml代碼如下:
在applicationContext.xml中配置dao。
<?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"
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">
<!--加載配置文件-->
<context:property-placeholder location="db.properties"/>
<!--數據源:使用dbcp-->
<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>
<!--sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--加載mybatis的配置文件-->
<property name="configLocation" value="classpath:SqlMapConfig.xml"/>
<!--數據源-->
<property name="dataSource" ref="dataSource"/>
</bean>
<!--原始dao接口-->
<bean id="userDao" class="dao.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
</beans>
User.xml代碼如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace命名空間,作用就是對sql進行分類化管理,理解sql隔離
注意:使用mapper代理方法開發,namespace有特殊重要的作用-->
<mapper namespace="test">
<!-- 在 映射文件中配置很多sql語句 -->
<!-- 需求:通過id查詢用戶表的記錄 -->
<!-- 通過 select執行數據庫查詢
id:標識 映射文件中的 sql
將sql語句封裝到mappedStatement對象中,所以將id稱爲statement的id
parameterType:指定輸入 參數的類型,這裏指定int型
#{}表示一個佔位符號
#{id}:其中的id表示 接收輸入 的參數,參數名稱就是id,如果輸入參數是簡單類型,#{}中的參數名可以任意,可以value或其它名稱
resultType:指定sql輸出結果 的所映射的java對象類型,select指定resultType表示將單條記錄映射成的java對象。-->
<select id="findUserById" parameterType="int" resultType="po.User">
SELECT *FROM USER WHERE id=#{value}
</select>
</mapper>
【3】測試程序,關鍵代碼如下:
public class UserDaoImplTest {
private ApplicationContext applicationContext;
//在這裏得到Spring容器
@Before
public void setUp() throws Exception {
applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void findUserById() throws Exception {
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
//調用userDao方法
po.User user = userDao.findUserById(1);
System.out.println(user);
}
}
【4】結果顯示