zoukankan      html  css  js  c++  java
  • 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" /> 这句语句不起作用,最终导致链接不上数据库。 老师是这么说的,没有测试。

  • 相关阅读:
    2016"百度之星"
    codeforces 55 div2 C.Title 模拟
    codeforces 98 div2 C.History 水题
    codeforces 97 div2 C.Replacement 水题
    codeforces 200 div2 C. Rational Resistance 思路题
    bzoj 2226 LCMSum 欧拉函数
    hdu 1163 九余数定理
    51nod 1225 余数的和 数学
    bzoj 2818 gcd 线性欧拉函数
    Codeforces Round #332 (Div. 2)D. Spongebob and Squares 数学
  • 原文地址:https://www.cnblogs.com/rogge7/p/7212413.html
Copyright © 2011-2022 走看看