前言:本篇主要记录在MyBatis学习过程中的主要知识点。
1.mybatis环境的搭建,通过maven可以快速的进行环境的搭建。
1 23 10 113.4.5 44.12 55.1.38 61.2.17 71.7.25 81.3.6 912 43 4413 17 18org.mybatis 14mybatis 15${mybatis.version} 1619 23 24mysql 20mysql-connector-java 21${mysql-driver.version} 2225 29 30junit 26junit 27${junit.version} 2831 35 36log4j 32log4j 33${log4j.version} 3437 41 42org.slf4j 38slf4j-log4j12 39${slf4j.version} 4045 46 47 6248 54src/main/java 4950 52**/*.xml 51true 5355 61src/main/resources 5657 60**/*.xml 58**/*.properties 5963 9164 65 90org.mybatis.generator 66mybatis-generator-maven-plugin 67${mbg.version} 6869 70 74src/main/resources/mybatis-generator-config.xml 71true 72true 7375 8276 81Generate MyBatis Artifacts 7778 80generate 7983 8984 88org.mybatis.generator 85mybatis-generator-core 86${mbg.version} 87
2.mybatis核心配置文件
mybatis的核心配置文件,位置与名称都不固定。
需要注意的是mybatis的核心配置文件的标签是有顺序的,如果顺序不对,会产生错误提示,可根据具体提示进行标签位置的调整。
mybatis核心配置文件主要配置如下:
1 2 56 7 11 12 13 14 15 21 22 2316 17 18 19 20 24 25 27 28 29 32 33 35 36 3834 39 50 51 5240 41 4942 43 4844 45 46 47 53 54 56 5755 58 59 60 61 62 63 6564
3.关于sql映射文件
由于我们采用mapper接口式的编程,所以sql映射文件与mapper接口类的名称要相同,并且sql映射文件中namespace的值为对应mapper接口的全类名形式。
4.关于mybatis中的参数处理
对于mapper接口中单个参数,mybatis不会做特殊处理。可以通过#{参数名}进行取值操作。
对于mapper接口中的多个参数,mybatis会做特殊处理。多个参数会被mybatis封装成一个map,#{}就是从map中进行取值。
key的形式为:param1、param2......paramN的形式。
value:就是说要传入的值。
但是这种方式的可读性极差,因此可以采用命名参数的形式,通过@Param注解明确指定map中的key值。
如果多个参数正好是业务逻辑的数据模型,则可直接传入POJO,通过#{属性名}进行取值。
特别注意,如果参数为Collection(List,Set)类型或者是数组,mybatis也会特殊处理,mybatis也会把list或者数组封装在map中。
如果参数为Collection则map中的key为Collection(collection)。
如果参数为List,则map中的key可以直接使用list。
如果参数为数组,则map中的key为array。
5.关于mybatis的返回值和实体类字段与数据库字段不一致的问题
当mapper接口中某函数的返回值类型为List时,在其对应sql语句的resultType上直接写List集合的中元素的类型即可。
使用resultMap(自定义结果集映射规则),解决数据库字段和实体类属性不一致的情况。注意:resultMap和resultType只能二选一。
6.mybatis中的缓存机制
mybatis中默认定义了两级缓存,默认情况下一级缓存(本地缓存)开启。
一级缓存:在与数据库同一次会话期间的数据会放到一级缓存中,以后如果需要查询相同的数据,直接从缓存中取,不需要到数据中进行查询。
注意:一级缓存为sqlSession级别的缓存,一直都是开启的,不能关闭。
一级缓存失效的四种情况:
1)sqlSession不同,缓存失效。
2)sqlSession相同,查询条件不同,缓存失效,因为缓存中可能还没有相关数据。
3)sqlSession相同,在两次查询期间,执行了增删改操作,缓存失效。
4)sqlSession相同,但是手动清空了一级缓存,缓存失效。
二级缓存(全局缓存)需要进行配置,二级缓存是基于namespace级别的,一个namespace对应一个二级缓存。
二级缓存工作机制:
1)一个会话,查询一条数据,该数据会放在当前会话的一级缓存中。
2)如果当前会话关闭,对应的一级缓存会被保存到二级缓存中,新的会话查询信息,就可以参照二级缓存。3)不同namespace查询出的数据会放在自己对应的缓存中。注意:查出的数据都会默认放在一级缓存中,只有会话提交或关闭后,一级缓存的数据才会被转移到二级缓存中。by Shawn Chen,2018.3.14日,晚。