目录
MyBatis笔记
注意\报错
注意
报错
未解决
视频梗概
END
MyBatis笔记
第1刷,南湖立交2021.12,课程来源:B站up/黑马
注意\报错
注意
连接数据库的4个基本信息:全限定类名\url\username\password
一条数据库数据对应一个对象,同时也是一个集合元素
内行写法:写到一半注意提示,按enter补全,这么写可以少敲键盘并且导包
selectList的参数,就是xml文件中的name+id,,,xml文件中的name加上id就是sqlSession.selectList的参数
idea复制模块
- 新建模块
- 打开电脑磁盘,将旧模块的文件复制到新模块的目录中,不复制pom
- 完成
查询结果以自定义别名显示
SELECT *,id orderid FROM ordert;
//查询结果中,id将分别以id,orderid为列名显示2列
//java中的别名显示查询如下
<resultMap...>
<id column="oid" property="id"/>
...
</resultMap>
<select...>
select *,ordert.id oid from ordert,user where uid=user.id
</select>
- getResourceAsStream报红
InputStream inputStream=Resources.getResourceAsStream("sqlMapConfig.xml");//getResourceAsStream报红
InputStream inputStream=Resources.class.getResourceAsStream("sqlMapConfig.xml");//中间加上.class就不红了
下载的B站视频有音频画面不匹配的问题,优先使用浏览器看视频.
报错
1.
[已解决]Resources没有getResourceAsStream(resource ...)方法???
全部代码都按文档的去写,导包完毕\抛出异常完毕的话,是不爆红的!
2.
[已解决]mapper namespace=test的test爆红了???
解决方案A:等文档看完后看视频中的操作,
解决方案B(有效):设置 SQL 映射文件的 namespace 属性为 Mapper 接口全限定名
3.
[已解决]dos窗口输入mysql -uroot -p1111 -h127.0.0.1 -p3306不报错,再输入show databases就报错
解决: 按以下输入即可
mysql -uroot -p
1111
show databases;
4.
result type
Figure 7: image-20211221143923464
解决方案A[有效]:使用全限定类名给result type赋值
5.
- Could not find resource com/xxx/xxxMapper.xml
运行MybatisBrandTest,报错内容很多,抛出PersistenceException异常
方案A:CSDN@向上的青春:执行maven的clean\compile,执行idea的invalidate,重启idea,重新运行,出现相同报错
方案B:参考其他CSDN答主的答案,没有找到
方案C:观察原视频,没有涉及
方案D:暂时略过
方案E:对比下载的原版的代码, 找出代码中存在的不同
方案F-无效:代码修改如下
原件:
\InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
修改后:
\InputStream inputStream = Resources.getResourceAsStream("SQLMapConfig.xml");//改了参数
方案G:给了3个方案,说是哪个都可以,看起来很靠谱,实际全都无效
链接
方案H:@骆,-1-查看报错信息,-2-查看每个相关文件(
- pom.xml
- mybatis-config.xml
- sqlMapConfig.xml
- BrandMapper.xml
- Brand.java
- BrandMapper.java
- BrandMapperTest.test)
2个报错根源:-1-mybatis-config.xml写入数据库名,运行时间标准,-2-包名,要用斜线不要用点
原文(错误)
<property name="url" value="jdbc:mysql://mybatis?useSSL=false"/>
更正为
<property name="url" value="jdbc:mysql://localhost:3306/db03?serverTimezone=GMT"/>
//
原文(错误)
<mapper resource="com.it.mapper.BrandMapper.xml"/>
更正为
<mapper resource="com/it/mapper/BrandMapper.xml"/>
- idea没有连接数据库(应该是,因为没记得操作过),但没有文档中说的database窗口
有可能操作过,只是自己忘了,或者是刚安装时别人帮忙配置idea时操作过
解决方案:在mybatis-config.xml中配置
- 提示result type not match for select id,如下
Figure 8: image-20211221143826361
- Mapped Statements collection does not contain value for BrandMapper.save
原代码(错误)
\sqlSession.insert("BrandMapper.save",brand);//namespace+id
更正为
\sqlSession.insert("com.it.mapper.BrandMapper.save",brand);//namespace+id
namespace要全限定名,加上包名
- return userList
视频里这么写没事,自己写会报错-编译时报错
- Type interface com.it.mapper.UserMapper is not known to the MapperRegistry.
当前课程:练习动态SQL,<select id="findByCondition">
案发现场:测试类DynamicSqlDemo.java
报错信息:error was found in mapping #{}. Check syntax #{property|(expression), var1=value1, var2=value2, ...} ==说明出错的位置是映射文件
方案A,对比原代码,去掉不一致之处.==无效,且原代码没有findByCondition,只有FindByIds
方案B,检查以下文件,发现不当之处就更正并试运行
序号 | 文件 | 格式 | 修改 |
1 | jdbc | .properties | - 新增此文件 |
2 | sqlMapConfig | .xml | - |
3 | mybatis-config | .xml | - 删除此文件?因为原版资料中没有此文件 |
4 | UserMapper | .xml | - |
5 | User | .java | - |
6 | UserMapper | .java | - |
7 | DynamicSqlDemo | .java | - |
方案C,找mybatis入门文档来看,以便发现问题
至少确定一下mybatis-config.xml是不是必要的
==调试记录==
<property name="driver" value="com.mysql.jdbc.Driver"/>改为:
<property name="driver" value="${jdbc.driver}"/>
用老师的sqlmapconfig.xml替换自己的,exitcode 0!!!
==复盘==
对比两版sqlmapconfig.xml,对比结果:错误版多两行:
<typeAlias type="com.it.mapper.Brand" alias="brand">
<mapper resource="com/it/mapper/BrandMapper.xml">
测试1
成功版:\InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
未知版:\InputStream inputStream = Resources.getResourceAsStream("xx.xml");报错:error was found in mapping #{}. Check syntax #{property|(expression), var1=value1, var2=value2, ...}
测试2
注释掉错误版中多的两行,运行结果:成功
结论
错误版导致运行失败,原因在于多了两行
<typeAlias type="com.it.mapper.Brand" alias="brand"></typeAlias><mapper resource="com/it/mapper/BrandMapper.xml"></mapper>
- new Date()无法转换为int
有样学样这么写,系统提示编译时异常如上.反复来几次,又不报错了...
- Could not find resource sqlMapConfig.xml
当前课程:typeHandler
案发现场:项目/模块/运行类->MySpringB/config/DateTypeHandler
报错信息:Could not find resource sqlMapConfig.xml
复盘:回忆下解决方案,仔细排查,最终解决
- Column 'username' cannot be null
同一位置的报错,背景描述:(TypeHandlerDemo.java)user.setUsername("DANIEL");//也就是说,有给username赋值,但报错说username不能为空
发现第一个问题:
看视频,找不同.发现不同:视频的测试类里有setBirthday(new Date());我的没有,我的写了会报红.再看原代码的User属性,发现
[错误版]User:private int birthday;//数据类型错了
[正确版本]User:private Date birthday;
发现第二个问题:
[错误版本]UserMapper.java:public void save();//没写参数
[正确]UserMapper.java:public void save(User user);
发现第三个问题:
[错误版本]\TypeHandlerDemo.java:mapper.save();//没写参数
[正确版].java:mapper.save(user);
发现第四个问题
[错误版本]com.it.handler//一次创建了一个包.
[正确版]com/it/handler//分别创建com包,com.it包,com.it.handler包
[问题已解决]
复盘:不骄不躁,耐心排查.
- 元素类型为 "mapper" 的内容必须匹配
[错误版]
<select id="findall" resultType="user"/>
\select * from user
//缺了下标签
[正确版本]
<select id="findall" resultType="user">
select * from user
</select>
- public class Order {
private int id;
private int total;
private int uid;
//OVER HERE!!!
private User user;
...
}
- 运行没报错,但结果与预期不符
Figure 9: image-20211231180318331
[错误版]
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// PageHelper.startPage(2, 3);
List<User> userlist=mapper.findall();
PageHelper
PageHelper.startPage(2, 3);
[正确版本]
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
PageHelper.startPage(2, 3);
List<User> userlist=mapper.findall();
// PageHelper
// PageHelper.startPage(2, 3);
PageHelper.startPage () 必须加在执行查询sql语句(mapper.xx();)方法之前。
- idea中模块的icon变成灰色,无法新建类
设:有问题的模块为MBbasic,现用名称MBbasic,曾用名MBbasicM
[]方案A:C一下,多个网友的回答是file-setting-build..-maven-ignore..-取消对相应pom文件的勾选.检查过了,全都是没有勾选状态,不是这个问题
[有效]方案B:打开pom.xml,查看<module>标签中的模块名称是否和实际名称MBbasic一致
复盘原因:重命名模块后,pom.xml没有自动更新为新名称MBbasic,导致pom.xml中的模块名称MBbasicM和实际名称不一致,导致idea无法正常使用相应模块
未解决
- 解决报错通用流程
[]方案A:仔细检查相关代码有无错漏
[]方案B:借鉴网友回答,查看API手册
[]方案Y:延期处理
- already contains value
当前课程:注解开发多表查询
案发现场:mySpringB-HAnno-AnnoDemo
报错信息:
Mapped Statements collection already contains value for com.it.mapper.UserMapper.update.
please check com/it/mapper/UserMapper.xml and com/it/mapper/UserMapper.java (best guess)
[]方案A:百度一下,多个网友给的回答是xml中的CRUD标签的id重复了.检查过了,不是这个原因.
[]方案B:
回看视频(e188),查漏补缺.发现原因可能在于UserMapper.xml已删除,但核心文件中没有修改<mappers>.映射关系原本体现于UserMapper.xml,此文件删除后,替代代码还没写好.
<package name=”...”/>
已补充以上代码,依然报错
[]方案C:简化代码,注释掉新代码,运行基本代码,运行一次放开一行新代码,以便查看出错位置.
基本代码运行报错,
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
System.out.println(123);
//报文:already contains value
[]方案D:仔细检查代码有没有错漏之处
[]方案E:重启idea重启电脑
[]方案Y:延期处理
视频梗概
150,核心文件,标签释义
151,对照mapper.xml示意图的讲解
152-155,[mybatis的增删改查-插入数据],mybatis对数据库做增删改操作,以及一个小结
156-161,讲解核心文件sqlMapConfig.xml,其中的标签释义
这一节本应该一开始就讲的,这个文件不配好,查增改删根本不能做.也是报错Could not find resource com/xxx/xxxMapper.xml的原因
162,MyBatis测试类的讲解,Resources.getSourceAsStream->inputStream->sqlSessionFactoryBulider.build->sqlSession->openSession->xxMapper...
自动\手动提交事务
163,[剧情过渡]复现三层架构的写法,视频结尾说,有了MyBatis,可以使用代理接口的方式实现三层架构.UserMapperImpl.java,在dao包下.里面写什么?之前写在测试类里的那些(inputStream,sqlSsseion等),现在写在这个实现类里.实际工作中也是写在实现类里,而不是测试类
164,[描述]代理开发方式介绍
165,讲解mapper的4个规范,在此之前写的代码基本符合这个规范,因此讲一遍就好.
早点讲这个,后面说代理借口开发正好用上用多好.先做后说真是让人前期很懵,核心文件sqlMapConfig.xml也是,写好了也用过了,才来讲解.
166,强调了一下4个对应的关系
167,[动态sql],[mapper,dynamic sql,if,choose,trim,],以user的findByCondition为例讲解动态sql语句,未运行,不用运行,代码还有未解决的问题
168,动态sql之if上一集的遗留问题就是查询条件不是全部只有部分时会出现的问题.这一集用动态sql解决这个问题.也就是.练习时报错Type interface com.it.mapper.UserMapper is not known to the MapperRegistry.
169,[动态sql之foreach]
170,[动态SQL之include]
171,知识小结
172,173,typeHandler,-1-介绍typeHandler,-2-提出需求,搭建练习所需要的环境
174,-1-提出操作步骤, -2-编写并讲解DateTypeHandler.java
进度: 运行模块config的test1报错, 报错指向配置文件, save方法未写完整
175,核心配置文件之标签之pagehelper分页功能
176,进行编程
177,获得与分页相关的参数
178,知识小结
179,开始多表操作系列: 多表操作之一对一之一对一模型
180,多表操作 - 一对一表间关系 - 搭建开发环境
181,[重点]]多表操作 - 一对一表间关系 - 开发
182,<association><javaType>标签
183,<collection><ofType>一对多表间关系
184,MyBatis多对多查询
185,知识小结
186,注解开发/介绍
187,复习基本的MyBatis的CRUD操作
188,以xml实现的CRUD,改成以注解实现CRUD
189,[讲解原理] MyBatis的复杂查询以及一对一的多表查询开发操作, <resultMap>->@Results, 测试类: MyBatisTest2, 根据给定条件查2个表: user,order.
190, <association>->@, 根据order表中的一个外键字段查user表, 相关代码参看itheimaAnno.OrderMapper.java
191,相关代码参看itheimaAnno.UserMapper.java, 测试类: MyBatisTest3
192,
193,
END
更多推荐
MyBatis学习笔记 (第1刷, 2021.01)(1/4 代码模板)
发布评论