MyBatis学习笔记 (第1刷, 2021.01)(1/4 代码模板)

编程入门 行业动态 更新时间:2024-10-15 04:27:59

目录

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 代码模板)

本文发布于:2023-06-28 16:39:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/930445.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:学习笔记   模板   代码   MyBatis

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!