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!

 

继续加油哦~~

 

posted @ 2020-07-21 07:05  程序杰杰  阅读(165)  评论(0编辑  收藏  举报