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

  • 相关阅读:
    JavaScript 判断对象中是否有某属性
    微信小程序form表单提交到数据库
    'vue' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
    使用vue-cli脚手架自动化搭建一个vue项目
    css经典布局——头尾固定高度中间高度自适应布局
    小程序weui官网:https://developers.weixin.qq.com/miniprogram/dev/extended/weui/ 小程序使用weui 库
    HTML5终极备忘大全 一、文字备忘之标签
    JS正则表达式验证数字非常全
    Python3 PIL库问题:ImageChops.difference返回None
    一些windows批处理脚本
  • 原文地址:https://www.cnblogs.com/rogge7/p/7212413.html
Copyright © 2011-2022 走看看