Mybatis学习(基础版)
000.基础配置
001.包引用,注意该包需要在 start.spring.io上配置
Mybatis集成的主要插件、
JDBC(如果是关系型数据则需要引入)、
MySQL(根据不同的数据库引入)
002.配置文件解析
对于Spring Boot中的配置文件,可以使用application.properties也可以使用application.yml,直接配置即可被引用,两种配置方式见如下文件。注意:在url配置中加有%的地方为特殊处理mysql时间差问题,配置时需要重点关注。
#yml配置数据源 spring: datasource: url: jdbc:mysql://localhost:3306/mybatis-110?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8 username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver
#properties配置
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis-110?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8 spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
003.普通Mybatis构成
3.1Mybatis的主体配置文件mybatis-config.xml (该文件内一般含有数据源,事物配置和mapper文件的导入)、
3.2每个模型的映射文件 *mapper.xml(根据业务进行分包管理,内配置有域名空间和CRUD的相关sql)、
3.3模型对应的bean文件
3.4对应mapper的接口,将mapper中的方法整理成接口的方法,以此来进行方法调用。(官方推荐此种方式,此方式叫做动态代理,在此时,mapper的namespace的名字要与映射接口路径一致。)
注意:基本的Mybatis基本使用SqlSessionFaction生成SqlSession来执行sql操作。
004.spring与Mybatis集成
4.1与spring集成的最大亮点是Mybatis的DataSource、SqlSessionFactory、mapper映射都交由spring容器管理。
4.2 mapper的配置也可以通过扫描来装载,省却了繁琐的配置文件编写。
005.与Spring Boot集成的Mybatis
5.1spring主体文件中配置数据池等相应信息
5.2带有映射标签的mapper.java类,每个类表示一个模型。
5.3模型的bean类
注意:使用mapper时需要通过mapperScan扫描并进行注入。
010.Mybatis小技巧
011.针对字段名与对象名不对称有三种解决方案
11.1在sql写入时使用别名映射对象名
11.2开启驼峰式匹配,在跟标签下写配置<settings><setting name="mapUnderscoreToCamelCase" value="true"/></settings>
11.3使用ResultMap标签解决,该标签相当于一个数据库与Mybatis的映射,配置后可随处使用。
注意:resultMap可悲继承。
012.typeAliases别名配置,用于减少类完全限定名的冗余。如:com.util.List 可以配置为List,可以缩减前缀的书写。
013.Mybatis具有sql分片功能,使用<sql>标签写入,为相应标签附上id。在使用的地方根据域名和id通过<include>标签引入。
注意:配置标签的xml文件需要引入到mybatis-config.xml文件中。
014.mapper引入mybatis-config.xml可以通过packge标签将一个包下所有的mapper引入。
015.动态sql
15.1 if,如果存在则实现
15.2 choose when otherwise 可以多个when连用,最后一个otherwise收官
15.3 where if 通过判断向sql中写入条件
15.4 foreach 循环拼接,一般用于部分数据的迭代,如in条件拼接
15.5 trim 拼接条件去除多余字符,如果使用第一个条件直接拼接where语句,可能存在开头或者末尾多出一个逗号,用这个可以解决
15.6 association 用于一对一的表连接查询,将对象嵌入其他对象中
15.7 collection 用于一对多或多对多的表连接查询,将对象集合嵌入其他对象中,理清数据关系,使其保持连接即可
15.8 慎用Mybatis中大于、小于、等于符号,有的时候xml解析出错导致程序抛出异常。
020.Mybatis注解
021.@Mapper 注解需要映射的实体对象,省却Mybatis的XML配置
022.@MapperScan扫描类注解,扫描@mapper标注的对象在当前注解类中通过注入即可使用。注意:该注解使用时,必须指定至少一个指向mapper类的基包,不然会报错。
023.@Insert、@Delete、@Update、@Select写入相应的sql模板,在调用时载入参数即可执行。
024.@Options 自增主键,当需要插入时返回主键编号可使用该注解。当useGeneratedKeys=true时,表示使用数据库自动增长的主键。
030.重要功能模块
031.一级缓存
Mybatis的一级缓存的作用域是session,默认打开,执行sql时首先命中缓存,如果不存在则查询数据库。
sqlSession.clearCache()会清除缓存,使用insert、update、delete等非查询语句会清空缓存。
032.二级缓存
Mybatis的二级缓存的作用域是mapper的namespace,同一个namespace查询可以被命中。
使用<mapper namespace=''><cache/></mapper>开启namespace的二级缓存,针对该缓存,可以配置缓存相关数据
在mybatis-config.xml的setting中使用cacheEnabled关键字开启二级缓存
033.延迟加载
前置:导入cglib包实现的功能
虽然有级联关系,但数据只有在使用时才会加载。通过在内嵌的级联查询中嵌入sql从而使得对象在使用时自动装载。
注意:1.在使用延迟加载时需要在setting中配置 lazyLoadingEnable为true和aggressiveLazyLoading为false。
2.在级联标签中配置时,注意select标签值和cloumn值对饮相应查询标签的id和参数
040.exception
041.@MapperScan配置不完整
问题:At least one base package must be specified
原因:@MapperScan使用时至少指定一个基包
解决:在@MapperScan中配置相应的mapper包
042.mysql设置问题
问题:The server time zone value '?D1ú±ê×?ê±??' is unrecognized or represents more
原因:mysql时区设置错误,在连接url中配置有问题
解决:在url配置中添加serverTimezone=GMT%2B8
043.驱动配置问题
问题:Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdb
原因:在Spring Boot整合中出现新的驱动
解决:将com.mysql.jdbc.Driver改为com.mysql.cj.jdbc.Driver
044.在tomcat中无法执行
问题:将项目置入tomcat,启动后无法相应
原因:Spring Boot有内嵌的服务器,直接启动application即可,如果不进行相应配置,则在tomcat上无法启用。
045.元素内容格式错误
问题:Error creating document instance. Cause: org.xml.sax.SAXParseException;
原因:大于小于等特殊符号解析失败
解决:使用<![CDATA[ ?]]> 来转移或者使用使用Mybatis的标签来分解。