简单的学习完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是我查询数据库的名
-
-
association:对象使用
-
collection:集合使用
-
ofType:集合内部对象
-
result:最基本的属性映射了
-
property:类中属性的名字
-
column:
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!
继续加油哦~~