mybatis 剛開始是用最原始的方法開發了一個入門程序,(沒有dao)
1、將數據源配置在SqlMapConfig.xml
2、寫一個po類 和映射文件User.xml(中的namespace=“名字隨意”,
Mapper開發中是需要等於mapper接口地址的)
3、在sqlMapConfig.xml中加載User.xml:就准備可以操作數據了
4、直接讀取sqlMapConfig.xml獲得sqlSessionFactory,再得到SqlSession
5、SqlSession.selectOne("test.findUserById",1),傳statement 的 id 即可;
這種方式最低級,最不可取
DAO方式:(和上面差不多,沒有什么改進,只是多了個dao層次而已,然並卵) 1、定義Dao接口,和dao實現類(構造方法傳一個SqlSessionFactory進去作為全局變量) 2、測試時;UserDao userDao = new UserDaoImpl(sqlSessionFactory); User user = userDao.findUserById(1); dao實現類中 User user = sqlSession.selectOne("test.findUserById", id); 整個下來只是代碼寫好了一點,更有面向對象的思想了而已;還是這種低級的實現方式; Mapper代理的方法:(不需要特殊配置,只要遵循下面的開發規范即可) 開發規范: 1、在mapper.xml中namespace等於mapper接口地址 2、mapper.java接口中的方法名和mapper.xml中statement的id一致 3、mapper.java接口中的方法輸入參數類型和mapper.xml中statement的parameterType指定的類型一致。 4、mapper.java接口中的方法返回值類型和mapper.xml中statement的resultType指定的類型一致。 步驟:1、主要寫 userMapper.java和 userMapper.xml,教程中是寫成同名的並到mapper后綴,實際項目中同名即可(最好帶Dao結尾); 2、在SqlMapConfig.xml中加載mapper.xml(開發中會用包掃描方式) 3、應用:獲得sqlSessionFactory,獲得sqlSession,獲得UserMapper對象(此對象是自動生成的) 代碼如下: // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); // 創建會話工廠,傳入mybatis的配置文件信息 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); //創建UserMapper對象,mybatis自動生成mapper代理對象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.findUserById(1);調用 兩者區別:1、不用寫DAO的實現類, 2、看不到sqlSession.selectOne("test.findUserById", id);這樣的語句。 后續主要練習 一對一,一對多,多對多的查詢,pojo和mapper的寫法;resultMap,和加載延遲,緩存; 二級緩存參數配置,和分布式緩存ehcache,redis,mamcached;逆向工程的配置生成代碼
spring和mybatis整合: 在applicationContext.xml配置sqlSessionFactory和數據源,數據源原來在SqlMapConfig.xml中的 很多bean也通過spring管理, Dao開發: 1、寫好dao 和 dao實現類(不需要傳入SqlSessionFactory進去,要繼承於SqlSessionDaoSupport) 2、applicationContext.xml中配好 dao實現類的bean並ref傳入sqlSessionFactory對象; 3、應用:applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml"); UserDao userDao = (UserDao) applicationContext.getBean("userDao"); User user = userDao.findUserById(1); 第3步中可見,多了spring特有的applicationContext,加載bean的方式也不一樣了。其他基本和未整合前的dao大同小異 mapper代理開發:和整合前區別主要是bean在 1、寫好符合mapper代理的 **dao.java 和**dao.xml 2、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、調用:applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml"); UserMapper userMapper = (UserMapper) applicationContext.getBean("userMapper"); User user = userMapper.findUserById(1);
問題: 此時看起來:就是少了bean管理,但是配置工作量很繁重,以下解決; <!-- 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> 到此感覺到的改善: 1、只需在applicationContext.xml配置sqlSessionFactory和數據源 2、在批量掃描中對每個bean注入sqlSessionFactory,不用一個個傳入 3、不用寫DAO的實現類 4、調用時,bea創建的方式不一樣了,從spring容器中加載出來
mapper批量掃描時:
配置里面的 sqlSessionFactory 屬性時要注意:不可以寫成
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>;如果這樣寫,會造成上方的
<!-- 加載配置文件 -->
<context:property-placeholder location="classpath:db.properties" /> 這句語句不起作用,最終導致鏈接不上數據庫。 老師是這么說的,沒有測試。