目录
1.MyBatis操作数据库
1.参数重命名@Param注解
加@Param
不加@Param
2.增Insert
1.传递多个参数
2.传递对象
3.补充:Integer返回值代表这个操作 影响的行数 是多少
4.给对象加注解@Param
改为:
为什么会有这种现象?
5.@Options获得主键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.StdOutImpl2.字段名与驼峰名的自动转换
mybatis:
configuration:
map-underscore-to-camel-case: true #配置驼峰自动转换