zoukankan      html  css  js  c++  java
  • Mybatis完结小结

    简单的学习完Mybatis来一个系统性的总结,来一个提问式的吧~~

    Q:what is mybatis

    A:一款优秀的持久层框架,支持自定义SQL、存储过程以及高级映射等等

    Q:IDEA如如何引入呢

    A:首先pom中引入mybatis,mysql,junit这些必要的包,参考官网书写util类,编写核心xml文件,书写相关的关于属性,设置,映射等信息的写入,建立pojo实体,对应mapper与mapper.xml,书写sql标签,缓存等等。

    Q:Maven工程地址在IDEA中如何切换

    A:这个很实用哈,在setting->Build->Build Tolls->Maven修改setting file位置以及仓储位置为我们预先安装好的,这样以后下载的仓储就到我们设置的仓储位置啦,就不需要占C盘了,当然仓储位置,在setting file中也需要修改,要不然它怎么知道去哪找。

    Q:Mybatis默认的transactionManager事务管理器)基于默认的dataSource(数据源)是什么

    A:JDBC与POOLED(这个就是一个池子,我们使用完的SqlSession会放回池子中)

    在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]")

    Q:SqlSession的创建在Mybatis中使用的最主要的设计模式思想是什么

    A:从SqlSessionFactoryBuilder这一个建造者模式通过读取我们配置的核心XML流,构建Configuration创建SqlSession,这一过程体现了建造设计模式的思想;从SqlSessionFactory构建SqlSession过程中体现了工厂模式的思想。ps:一个SqlSessionFactory只能连接一个数据库,如果需要多重连接,那么我们就需要构建多个SqlSessionFactory的对象。

    Q:Mybatis默认读取resources下的xml和properties,我们如何修改

    A:只需要在build标签中加入resources标签(因为他默认读的就是resources,这很好理解哈),加入我们需要引入的地址和文件类型就好,如:

          <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>**/*.properties</include>
                        <include>**/*.xml</include>
                    </includes>
                    <filtering>false</filtering>
                </resource>
    
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.properties</include>
                        <include>**/*.xml</include>
                    </includes>
                    <filtering>false</filtering>
                </resource>
            </resources>

    Q:能讲讲CRUD中主要标签的含义,还有其主要属性的含义吗

    A:

      1.namespace指示xml文件需要配置的mapper接口,有点类似与实现了接口的impl

      2.标签有select,update,insert,delete这些和sql没区别

      3.属性id代表绑定的方法名,parameterType代表输入参数的类型,resultType代表输出参数的类型,ps:如果没有在配置文件中写别名,那么这里写的必须是全限定名,如果设置了,那么官方推荐默认小写

      4.resultMap:对于查询sql的字段和我们实体类字段不一样,我们需要绑定,或者一对一,一对多的时候,需要使用它来映射一下字段,内部有javaType(表面看起来是啥就是啥) ofType(当为一对多的时候,多的那个泛型类型是啥)

      5.preperty是我实体字段名,column是我查询数据库的名

    • javaType:就是类中现在属性是什么,他就是什么;【比如:是一个类,那么他就写什么类就好了;是一个List,那么他就写list】

    • association:对象使用

    • collection:集合使用

    • ofType:集合内部对象

    • result:最基本的属性映射了

    • property:类中属性的名字

    • column:从sql查询出来,我们使用的名字是什么。【如果select col1 as colnew,那么它就是colnew,而非col1了】

    Q:动态SQL有哪些,可以大致讲一讲吗

    A:<if><choose><when><otherwise><set><where><foreach><sql>等

      对于set与where实际上就是使用<trim>构建的,当然我们也可以自己使用trim自定义实现  

      对于动态sql中标签中的test,就相当于java中的代码,如

        <!--test="list.size()!=0"-->
        <if test="!list.isEmpty()">

        都可以

    Q:Mybatis缓存可以讲下吗

    A:Mybatis分为一级缓存和二级缓存,默认是一级缓存,也就是SqlSession对象内部的缓存,这个缓存只有在这个对象没有被close放回pool时才生效,但是如果使用它update,insert,delete就会强制刷新缓存了

    二级缓存需要我们手动写<cache/>标签,或者可以使用其他属性定制一个缓存,当二级缓存被关闭了,一个进程的SqlSession释放以后,就会将他的一级缓存放入到二级缓存中,我们另一个SqlSession就可以读取这个缓存了。但是这样有可能会产生脏读的现象,【比如SqlSession1查询id=1的name为nxj,然后关闭写入二级缓存了,然后期间另外一个进程/线程更新了数据库将name更新为ali,此时SqlSession2读取的就是缓存中的数据了,产生脏读】。

    【上面写的没问题,我们在mybatis中执行增删改,一二级缓存都会被清除掉,但是其他地方如果没有使用mybatis触发,比如我手动修改数据库,二级缓存则删不掉,但是这种现实中一般不会有这样的情况】

    Mybatis的缓存就是,用户-》二级缓存-》一级缓存-》数据库,这个顺序,都测过了,通过debug这些都测过了,这个顺序肯定没有问题,我们的缓存就是按照这样来找的!

    当然对于缓存这些,重点放在Redis中,这里做个了解,知道Mybatis缓存是干什么的,知道如何应对它就可以啦,OK!

    继续加油哦~~

  • 相关阅读:
    将python对象序列化成php能读取的格式(即能反序列化到对象)
    Atitit.研发管理---api版本号策略与版本控制
    Atitit.研发管理---api版本号策略与版本控制
    Atitit.jsou html转换纯文本 java c# php
    Atitit.jsou html转换纯文本 java c# php
    atitit.基于bat cli的插件管理系统.doc
    atitit.基于bat cli的插件管理系统.doc
    atititi.soa  微服务 区别 联系 优缺点.doc
    atititi.soa  微服务 区别 联系 优缺点.doc
    userService 用户 会员 系统设计 v2 q224 .doc
  • 原文地址:https://www.cnblogs.com/ningxinjie/p/13352859.html
Copyright © 2011-2022 走看看