【JavaEE进阶】MyBatis通过注解实现增删改查
目录
🍃前言
🍀打印日志
🌴传递参数
🎋增(Insert)
🚩返回主键
🎄删(Delete)
🌲改(Update)
🌳查(Select)
🚩起别名
🚩结果映射
🚩开启驼峰命名(推荐使用)
🍃前言
首先我们准备相应的表如下:
application.yml配置文件内容如下:
UserInfo类代码如下:
以下所有操作都是在该接口进行操作:所有测试单元代码都是在如下代码里面完成的:
🍀打印日志
在学习这些操作之前,我们先来学习MyBatis⽇志打印
在Mybatis当中我们可以借助⽇志,查看到sql语句的执⾏、执⾏传递的参数以及执⾏结果
在配置⽂件中进⾏配置即可
yml配置:
重新运⾏上述单元测试中的程序,可以看到SQL执⾏内容,以及传递参数和执⾏结果
未配置日志:
配置日志:
🌴传递参数
需求:查找id=1的⽤⼾,对应的SQL就是:select * from userinfo where id=1
代码:
但是这样的话, 只能查找id=1的数据,所以SQL语句中的id值不能写成固定数值,需要变为动态的数值 解决⽅案:在queryUserInfo⽅法中添加⼀个参数(id),将⽅法中的参数,传给SQL语句
使⽤ #{} 的⽅式获取⽅法中的参数
代码:
生成测试代码:
运行结果:
注意:如果mapper接⼝⽅法形参只有⼀个普通类型的参数,#{…}⾥⾯的属性名可以随便写,如:#{id}、#{value}。建议和参数名保持⼀致
如果有多个参数,属性名一定要与参数名保持一致,当然也可以进行修改,具体方法后面会详细讲解
也可以通过 @Param ,设置参数的别名,如果使⽤ @Param设置别名,#{...}⾥⾯的属性名必须和@Param 设置的⼀样
代码:
运行结果:
🎋增(Insert)
我们采用@Inset注解实现,具体实现如下:
返回Integer是为了知道对该数据库更改了多少行。
这里由于传递参数过多,我们使用对象进行传递,对对象相应参数进行赋值即可。
我们使用测试单元进行测试,测试代码如下:
启动测试代码,我们可以看到相应的日志:
再查询相应的数据库时我们就可以看到,添加成功的数据
如果设置了 @Param 属性,#{...}需要使⽤参数.属性来获取
代码:
运行结果:
🚩返回主键
Insert 语句默认返回的是受影响的⾏数
但有些情况下,数据插⼊之后,还需要有后续的关联操作,需要获取到新插⼊数据的id
⽐如订单系统
当我们下完订单之后,需要通知物流系统,库存系统,结算系统等,这时候就需要拿到订单ID
如果想要拿到⾃增id,需要在Mapper接⼝的⽅法上添加⼀个Options的注解
代码:
useGeneratedKeys:这会令MyBatis使⽤JDBC的getGeneratedKeys⽅法来取出由数据库内部⽣成的主键(⽐如:像MySQL和SQL Server这样的关系型数据库管理系统的⾃动递增字段),默认值:false.
keyProperty:指定能够唯⼀识别对象的属性,MyBatis会使⽤getGeneratedKeys的返回值或insert语句的selectKey⼦元素设置它的值,默认值:未设置(unset)
也就是说把自增id放到了"id"属性当做,现在可以通过获取id属性来打印自增id
测试:
运行结果:
🎄删(Delete)
删除代码如下:
测试单元代码如下:
运行结果如下:
查询数据库如下:
🌲改(Update)
将id为5的密码改为000000,接口代码如下:
更新代码如下:
测试单元代码如下:
启动测试后,观察日志如下:
查询数据库如下:
🌳查(Select)
我们查询所有数据,并用日志打印出来,代码如下:
测试单元代码如下:
单元测试执行如下:
注意事项:
MyBatis会根据⽅法的返回结果进⾏赋值.
⽅法⽤对象UserInfo接收返回结果,MySQL查询出来数据为⼀条,就会⾃动赋值给对象.
⽅法⽤List接收返回结果,MySQL查询出来数据为⼀条或多条时,也会⾃动赋值给List.
但如果MySQL查询返回多条,但是⽅法使⽤UserInfo接收,MyBatis执⾏就会报错.
从运⾏结果上可以看到,我们SQL语句中,查询了delete_flag,create_time,update_time,但是这⼏个属性却没有赋值.
这是什么原因呢“
当⾃动映射查询结果时,MyBatis会获取结果中返回的列名并在Java类中查找相同名字的属性(忽略⼤⼩写)。这意味着如果发现了ID列和id属性,MyBatis会将列ID的值赋给id属性
但是由于数据库与java命名规则不同,数据库的蛇形将转换成驼峰,所以无法识别。
解决方法有以下三种:
- 起别名
- 结果映射
- 开启驼峰命名
🚩起别名
在SQL语句中,给列名起别名,保持别名和实体类属性名⼀样
再次运行查看
就可以看到对应属性已经有值了
但是这种方式一般不推荐,因为相当于将这个工作交给数据库来做了。会降低效率,且不可控
🚩结果映射
使用注解,以及相关操作如下:
测试结果:
如果其他SQL,也希望可以复⽤这个映射关系,可以给这个Results定义⼀个名称
@Results注解里面还有一个id属性,也就是给它起个名
此时就可以通过@ResultMap注解进行映射,也就是映射@Results中的id对应的value
🚩开启驼峰命名(推荐使用)
通常数据库列使⽤蛇形命名法进⾏命名(下划线分割各个单词),⽽Java属性⼀般遵循驼峰命名法约定.为了在这两种命名⽅式之间启⽤⾃动映射,需要将mapUnderscoreToCamelCase 设置为true。
application.yml配置如下:
仅限遵守两种命名规则的转换。
这时候我们直接使用查询即可
代码:
单元测试代码:
运行结果:
已经进行了自动映射,字段全部进⾏正确赋值
注意:在表结构的设计中,必须要有三个字段,这是企业规范,这几个字段哪怕业务不需要也要有,当前可能不用,防止后续要使用。数据库的修改是一个非常麻烦的过程!
- 1. 自增Id
- 2. 创建日期(create_time,created_time叫什么名字不重要)
- 3. 更新日期(update_time叫什么名字不重要)