Mybatis
(p 69-75完整项目实例)
P1-p4 框架、使用框架对应jdbc的好处,已经框架封装的对应关系,以mybatis对上述的具体描述。
P5-p7 具体小项目的搭建,5、主要是一个项目自身所建且所需的导包配置文件,6最重要,为两个配置文件的填写,6为注意事项,写项目的时候要特别记住
P8 p9 两p是基于上述环境搭建好后的三种不同方法使用mybatis将数据库表传入实体类中:
Xml方式
注释方式
基于以上两种任一方式后,实现dao层接口的实现类
P10 实现mybatis框架的测试类的核心代码基于软件工程设计模式知识的解析,每一条语句分别对应了哪些设计模式,以及使用这么多设计模式的目的(原本可以一行语句完成):为了更灵活,可操作性强
P11 基于两个xml配置文件中的核心代码解析,引出分别对应jdbc技术的哪些语句内容(没卵用),同时抛出selectList方法,引出下p基于该方法的解析
P12 获得selectList方法所需的代理对象的创建方法:getMapper的解析,如何自定义该方法的三个关键点:
类加载器
需实现的字节码数组
如何代理(关键)
P13-p17 自定义mybatis框架代理对象实现类
P19 总结上述从p10开始的mybatis完成数据库表封装至实体类的全过程。
P20 p5-p8的内容结合,完整的一次mybatis小项目环境搭建过程
P21-p26 为mybatis框架增删改查等操作的测试类编写,主要要注意p25中的模糊查询的两种不同的方法,一个是Preparedstatement占位符,一个是statement拼接,前者性能更好(都注意,如需使用%,则都要用”%”+字符串拼接的方式)。以及p26的插入id的select方法。
P27 参数parameterType深入类型的深入,除简单类型外的,额外介绍了pojo对象类型(即实体类)的传入,其中经过ognl表达式解析,特别讲解了ognl表达式。
P28 修改实体类属性致返回值不对应报错的深入研究,特别注意,在windows中mySQL数据库是不区分大小写的,但Linux严格区分。
P29 基于上述问题实体类属性致返回值不对应的一个解决方法:resultMap标签,同时需要在方法标签属性中,用resultMap替换resultType。
P30-32 再一次演示实现dao层接口类,比较得出还是不自己实现好。
P33 p34 解读上述dao层实现类的r方法(Retrieve查询方法)所调用的源码过程分析,
P35 解读上述dao层实现类的cud方法(增改删方法)所调用的源码过程分析
P36 解读使用代理对象dao实现crud方法所调用的源码过程分析
(这四p着重要注意学习使用断点来使用debug调试代码)
P37 38 配置文件中三个标签的使用和详解,36中的url讲解
P40 41 连接池,mybatis连接池介绍,引出三个mybatis的type属性:unpooled,pooled和jndi(拓展内容)
p42 43 mybatis中unpooled和pooled属性详解和对比
p44 mybatis中的事务原理和自动提交设置(自动提交最好不用,后续spring讲解中会再说明)
p45-47 mybatis动态SQL语句四个标签:
<if>
<where>
<foreach> 内容中#{?} ?的值是由标签属性item的值来决定的
<sql> 仅作了解,作用:抽取重复SQL内容
P48 mybatis表之间关系分析
一对一
一对多
多对一
多对多
//包含对方的一个集合引用即是对多,SQL语句中需使用left outer join而不是传统的’,’(inner),长SQL语句换行后记得加空格保证语句正确
P49-52 对上述前三种表关系以项目实例讲解
- 49 项目搭建,表的建立
- 50-51 一对一查询实例,并介绍两种封装多表至实体类的方法:
新建一个包含两个实体类属性的子类
在配置文件中建立一个包含association(关系映射)标签的resultMap标签并使用,具体见视频(常用) - 52 一对多的查询实例,封装多表至实体类的方法:
在配置文件中建立一个包含collection(集合映射)标签的resultMap标签并使用
P53-56 对多对多表关系以项目实例讲解 - 53 54 项目搭建,表的建立(多对多的关键是中间表)
- 56 57 两个不同的方向的多对多实例演示
P58 59 JNDI - 58 JNDI MAVEN的war工程搭建
- 59 查询方法实例应用,部署在Tomcat服务器上
P61 以上述所建表提出两个问题,引出延迟加载和立即加载的概念,并得出一个伪结论:通常:
X对多查询时,是延迟加载,X对一时是立即加载
P62 63 一对一和一对多两个案列讲解延迟加载,注意的是,最先一步需要修改的是SQL语句的查询,因为原查询语句直接全部查询完毕,无法实现延迟。所以需要在resultMap标签内的两个映射标签加一个select属性掉用一个其他查询方法来实现。
通过配置文件中的<settings>
标签的两个属性来打开延迟加载:
lazyLoadingEnabled (开关)
aggressiveLazyLoading 3.4.1版本以后默认为false,不需要设置(按需加载)
然后在调用语句中自定义一个逻辑来实现延迟加载。
P64 缓存的基本概念和适用于缓存的条件
P65 66 一级缓存(SqlSession对象的缓存)案例讲解使用方法和注意事项
P67 二级缓存(SqlSessionFactory对象的缓存)案例简介开启二级缓存的三个步骤和使用方法,同时注意:
不同于一级缓存的以对象方式存放,二级缓存中存储的是数据类型数据,再次查询时以这些数据新建一个实体类对象
P68-75 mybatis注释开发综合案例
Pom.xml问题:
在按照视频讲解的步骤第一步就遇见了问题,org.mybatis包依赖获取不了,解决过程:
-
开始找到maven 下载包到本地仓库的方法:https://www.cnblogs.com/nbweber/p/11634109.html,https://blog.csdn.net/Mountaingroup/article/details/107081650,没有成功,进度条消失的很快,并没有下载,
-
以为是maven仓库在C盘写入文件需要管理员权限的原因,把maven迁移至了D盘,配置重配花了一点时间,但还是失败了
-
把视频给的源码下载下来,重复进行第一步,失败
-
百度找的了这个解决方法:https://blog.csdn.net/weixin_41425956/article/details/107083940,但博文没有讲清楚,应该是增加这个依赖,而不是把原来的mybatis依赖覆盖(如果是增加mybatis依赖问题包括下面这个问题也解决了,只剩下了个Junit问题),不幸的是我选择了覆盖,引出了下一个问题
-
无法引入org.apache.ibatis.annotations.CRUD,找的以下博文,合并知晓解决这两个问题:https://blog.csdn.net/zqq_2016/article/details/88427519,运行后还出现了一个Junit问题
-
!!! JUnit version 3.8 or later expected:异常解决,找的博文:https://blog.csdn.net/niuniu1994/article/details/82814132,结合左侧external libraries下没有Junit包,发现是版本号原因导致导入失败,根据博文修改版本号即可。
IntellJ两个小细节:
1、 修改包层级结构显示方式:在点击齿轮符号后,取消勾选Compact Empty Middle Packages即可
2、 添加类注释以及方法注释:https://www.jianshu.com/p/d194e7a6e61c。SqlMapConfig.xml 问题
用idea第一次写MyBatis配置文件,发现报错URI is not registered (Settings | Languages & Frameworks | Schemas and DTDs)
解决:https://blog.csdn.net/weixin_43367967/article/details/85198352,注册统一资源标识符IUserDao接口 @Select注释找不到符号 问题:
没有导入org.apache.ibatis.annotations包,导入号提示Error:java: 程序包org.apache.ibatis.annotations不存在,原因:external libraries中没有导入pom.xml依赖中填写的包。解决:
1、 重启intellj idea:https://blog.csdn.net/weixin_41231928/article/details/92073540?utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase,(我遇到的就是这个)
2、 检查设置中有没有忽略xml文件:https://blog.csdn.net/weixin_41529708/article/details/105443965?utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase。
这个破问题找了我老半天没解决,给我气的。Build时提示警告:java: 源值1.5已过时, 将在未来所有发行版中删除
https://blog.csdn.net/qq_28773851/article/details/81387722。P69 再次对比注解和解析xml两种开发方式
P69-71 单表查询的增删改查和总数(查询有三个)
P72 注解开发方式下,遇到实体类名与数据库表映射对不上的解决方法:
1、 xml方式也可以用的方法,修改SQL语句,采用别名的方式
2、 添加一个**@Results{@Result}注释,类似于xml的resultMap表情,具体见视频。
添加id属性标识,在需要的方法上添加@ResultMap(value={#id})来使用该映射
P73 74 @Results{@Result}中的@One、@Many属性实现X对一和X对多的注解开发案例,以及上述两个属性中的fetchType属性实现立即或延迟加载。
P75 一级缓存SqlSession两种方式都是默认开启的,使用.close()方法**后即清除一级缓存
开启二级缓存:两个步骤(xml方式为三个步骤,两种方式第一步都默认开启了)第二步@CacheNamespace注解blocking属性值为true即可。