目录
[3.补充:Integer返回值代表这个操作 影响的行数 是多少](#3.补充:Integer返回值代表这个操作 影响的行数 是多少)
[这个 id 是咋赋值给 userInfo.id 的?](#这个 id 是咋赋值给 userInfo.id 的?)
1.复制MyBatis打印的SQL模板语句到MySQL中执行
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.寄语
