MyBatis操作数据库(入门2)

目录

1.MyBatis操作数据库

1.参数重命名@Param注解

加@Param

不加@Param

2.增Insert

1.传递多个参数

2.传递对象

[3.补充:Integer返回值代表这个操作 影响的行数 是多少](#3.补充:Integer返回值代表这个操作 影响的行数 是多少)

4.给对象加注解@Param

改为:

为什么会有这种现象?

5.@Options获得主键id的值

[这个 id 是咋赋值给 userInfo.id 的?](#这个 id 是咋赋值给 userInfo.id 的?)

6.补充:占位符打印日志

3.删Delete

4.改Update

5.查select

6.报错检查方法

1.复制MyBatis打印的SQL模板语句到MySQL中执行

2.参数为null

7.idea参数名与数据库字段名不一致问题

解法一:别名

解法二:@Results+@Result注解

注解复用:

什么情况下需要注解复用?

方法:@ResultMap注解实现主解复用​编辑

解法三:开启驼峰命名

8.注意

1.打印日志要开启配置项:

2.字段名与驼峰名的自动转换

9.寄语


1.MyBatis操作数据库

1.参数重命名@Param注解

加@Param

@Param是给参数起别名,MyBatis是按照【别名】匹配【#{}】里的值。SQL里的#{} 与方法参数顺序无关,只根据注解里的名字一一匹配。

不加@Param

如果开了-parameters,没加@Param:MyBtais能读到方法参数原名,MyBatis是按照【别名】匹配【#{}】里的值;

如果没开-parameters时,没加@Param:Java编译丢掉了参数名,MyBatis识别不了原名,就只能写#{arg0}、#{arg1}.

2.增Insert

1.传递多个参数

传递多个参数最好加@Param注解

2.传递对象

把参数封装成对象:

3.补充:Integer返回值代表这个操作 影响的行数 是多少

MyBatis里@Insert、@Delete、@Update这三个操作(如果有返回值)返回值默认是Integer类型,代表这个操作影响的行数有多少。

4.给对象加注解@Param

改为:

为什么会有这种现象?

不加@Param:单个 实体参数,MyBatis会直接把【实体】里面的【属性】暴露到顶层,即相当于:写【#{username}】MyBatis做了【#{userInfo.username}】。

加@Param:把这个实体打包成一个叫【userInfo】的【参数】,要想拿到username,必须写成【#{userInfo.username}】

5.@Options获得主键id的值

这个 id 是咋赋值给 userInfo.id 的?

上图insert时,未设置id,id=null

------》MyBatis拿着已set的值去执行insertUser2

------》MySQL表的id是自增主键AUTO_INCREATMENT,数据插入成功后,自动生成了一个新id=8

------》useGeneratedKeys=true:告诉MyBatis把数据库生成的自增主键值拿回来

------》keyProperty="id":告诉MyBatis,拿到这个主键值之后,赋值给传入的这个UserInfo对象的id属性,底层调用userInfo.setId(8)

------》插入完成之后,原来传进去的同一个UserInfo对象,它内部的id已经被MyBatis设置好了,所以getId()拿到8.

总结就是MyBatis修改了参数userInfo的内部属性。

6.补充:占位符打印日志

3.删Delete

4.改Update

5.查select

6.报错检查方法

1.复制MyBatis打印的SQL模板语句到MySQL中执行

在控制台查看MyBatis打印的预编译的SQL语句,把这个复制到MySQL里查看哪里有写错的

2.参数为null

如果不仔细看idea的日志,只看左侧的执行结果显示的执行成功,以为业务正常进行,就找不到出错点。

这里的Updates:0,数据库没有执行成功

7.idea参数名与数据库字段名不一致问题

查询数据

数据库给idea的返回结果:

idea显示的值

可以发现,除了有些字段原本就没有赋值 之外,剩下显示null的都是【idea的参数名】与【MySQL字段名】不一致的项:

表列名起别名:

所以:

解法一:别名

数据库返回的数据:

idea显示的值:

解法二:@Results+@Result注解

@Results+@Result注解:告诉MyBatis【数据库字段】和【idea属性名】怎么对应

注解复用:

什么情况下需要注解复用?

@Results+@Result注解默认只对它所在的Mapper方法生效,别的方法不会使用这套映射规则

如果别的方法也要用这套映射,而再写一遍@Results+@Result注解 就会重复冗余,所以就用到了【注解复用】

简答来说就是在另一个查询方法上用这个已经写过的注解

方法:@ResultMap注解实现主解复用

然后selectOne就有值了

解法三:开启驼峰命名

在application.xml下复制这段文字:

mybatis:

configuration:

map-underscore-to-camel-case: true #配置驼峰自动转换

开启后再次查询:

8.注意

1.打印日志要开启配置项:

复制代码
mybatis:
  configuration: # 配置打印 MyBatis日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2.字段名与驼峰名的自动转换

mybatis:

configuration:

map-underscore-to-camel-case: true #配置驼峰自动转换

9.寄语

相关推荐
心中有你02141 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
龙亘川1 小时前
综合素质评价业务建模:从过程性评价到成长档案全链路闭环
数据库·智慧城市·数据可视化
数据库小组2 小时前
NineData 实战教程:MySQL 5.5 数据迁移同步到 MySQL 8.0(跨版本升级)
数据库·mysql·mysql优化·数据库开发·数据库迁移·版本升级·数据复制
步行cgn2 小时前
Spring MVC + Thymeleaf 模板解析失败:从 500 错误到页面正常显示
java·spring·mvc
zhangjw342 小时前
1-5 PostgreSQL 数据类型全集:基础类型、字符串、数值、时间类型
数据库·postgresql
IT_陈寒2 小时前
Java序列化踩坑记:对象循环引用让我加班两小时
前端·人工智能·后端
lgcgkCQ2 小时前
【AI 转型实战 1】SpringAI 入门:搭建基础大模型对话能力
java·ai·agent·rag·spring ai·mcp·langchain4j
泡海椒2 小时前
05-雷达图多维画像-信用评级多维画像
后端
王中阳Go2 小时前
5.27 分钟干完后端和全部测试:一场三小时笔试的五个失分点,四个不在代码上
大数据·数据库·人工智能·后端·大语言模型