Mybatis--課程中循序漸進的體會 《黑馬程序員_Springmvc+Mybatis由淺入深全套視頻教程video》


 

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" /> 這句語句不起作用,最終導致鏈接不上數據庫。 老師是這么說的,沒有測試。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM