【JavaEE进阶】 MyBatis使用注解实现增删改查

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 【JavaEE进阶】 MyBatis使用注解实现增删改查


🍃前言

首先我们准备相应的表如下:

application.yml配置文件内容如下:

spring:
 datasource:
  url: jdbc:mysql://127.0.0.1:3306/mybatis_test?
   characterEncoding=utf8&useSSL=false
  username: 用户名
  password: 密码
  driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
 configuration: # 配置打印 MyBatis⽇志
  log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

UserInfo类代码如下:

@Data
public class UserInfo {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private Integer gender;
    private String phone;
    private Integer deleteFlag;
    private Date createTime;
    private Date updateTime;
}

以下所有操作都是在该接口进行操作

@Mapper
public interface UserInfoMapper {
}

所有测试单元代码都是在如下代码里面完成的:

@Slf4j
@SpringBootTest
class UserInfoMapperTest {
    @Autowired
    private UserInfoMapper userInfoMapper;
}

如以下演示有看不懂的地方,可以先看一下博主写的 【JavaEE进阶】MyBatis⼊⻔

🌴传递参数

我们在实现增删改查的时候,我们不希望将他写死,所以我们需要进行传递参数。

我们使⽤ #{} 的⽅式获取⽅法中的参数。

比如我们需要以id来查询数据,书写就可以如下:

public interface UserInfoMapper {
    @Select("select * from userinfo where id=#{id}")
    public List<UserInfo> selectAll(Integer id);
}

具体传参使用参考后续用例

如果mapper接⼝⽅法形参只有⼀个普通类型的参数,#{…}⾥⾯的属性名可以随便写,如:#{id}、#{value}。建议和参数名保持⼀致

如果有多个参数,属性名一定要与参数名保持一致,当然也可以进行修改,具体方法后面会详细讲解

🎋增(Insert)

我们采用@Inset注解实现,具体实现如下:

@Insert("insert into userinfo (id,username, `password`, age, gender, phone) " +
            "values (#{id},#{username},#{password},#{age},#{gender},#{phone})")
    Integer insert(UserInfo userInfo);

返回Integer是为了知道对该数据库更改了多少行。

这里由于传递参数过多,我们使用对象进行传递,对对象相应参数进行赋值即可。

我们使用测试单元进行测试,测试代码如下:

@Test
    void insert() {
        UserInfo userInfo = new UserInfo();
        userInfo.setId(5);
        userInfo.setPassword("66666");
        userInfo.setUsername("遇事问春风乄");
        userInfo.setAge(21);
        userInfo.setGender(1);
        userInfo.setPhone("15353921091");
        userInfoMapper.insert(userInfo);
    }

启动测试代码,我们可以看到相应的日志

再查询相应的数据库时我们就可以看到,添加成功的数据

🚩返回主键

有时候增加后,我们想知道该数据的主键id,我们既可以使用@Options的注解

具体使用如下:

@Options(useGeneratedKeys = true,keyProperty = "id")
    @Insert("insert into userinfo (username, `password`, age, gender, phone) " +
            "values (#{username},#{password},#{age},#{gender},#{phone})")
    Integer insert(UserInfo userInfo);
  • useGeneratedKeys:这会令MyBatis使⽤JDBC的getGeneratedKeys⽅法来取出由数据库内部⽣成的主键(⽐如:像MySQL和SQL Server这样的关系型数据库管理系统的⾃动递增字段),默认值:false.
  • keyProperty:指定能够唯⼀识别对象的属性,MyBatis会使⽤getGeneratedKeys的返回值或insert语句的selectKey⼦元素设置它的值,默认值:未设置(unset)

测试代码如下:

@Test
void insert() {
    UserInfo userInfo = new UserInfo();
    userInfo.setPassword("66666");
    userInfo.setUsername("遇事问春风乄");
    userInfo.setAge(21);
    userInfo.setGender(1);
    userInfo.setPhone("15353921091");
    int count = userInfoMapper.insert(userInfo);
    System.out.println("改变数据条数为:"+count +"自增主键为:"+userInfo.getId());
}

启动测试代码如下:

查询数据库如下:

🎄删(Delete)

删除代码如下:

@Delete("delete from userinfo where id=#{id}")
Integer delete(Integer id);

测试单元代码如下:

@Test
void delete() {
    int count = userInfoMapper.delete(7);
    log.info("改变数据行数为"+count);
}

运行结果如下:

查询数据库如下:

id为7的数据已被删除

🌲改(Update)

将id为5的密码改为000000,接口代码如下:

@Update("update userinfo set password=#{password} where id=#{id} ")
Integer update(UserInfo userInfo);

测试单元代码如下:

@Test
void update() {
    UserInfo userInfo = new UserInfo();
    userInfo.setId(5);
    userInfo.setPassword("000000");
    int cound = userInfoMapper.update(userInfo);
    log.info("改变行数为:"+cound);
}

启动测试后,观察日志如下:

查询数据库如下:

已更改完成

🌳查(Select)

我们查询所有数据,并用日志打印出来,代码如下:

@Select("select * from userinfo")
List<UserInfo> select2();

测试单元代码如下:

@Test
void select2() {
    List<UserInfo> list = userInfoMapper.select2();
    System.out.println(list);
}

单元测试执行如下:

注意事项:

  • MyBatis会根据⽅法的返回结果进⾏赋值.
  • ⽅法⽤对象UserInfo接收返回结果,MySQL查询出来数据为⼀条,就会⾃动赋值给对象.
  • ⽅法⽤List接收返回结果,MySQL查询出来数据为⼀条或多条时,也会⾃动赋值给List.
  • 但如果MySQL查询返回多条,但是⽅法使⽤UserInfo接收,MyBatis执⾏就会报错.

从运⾏结果上可以看到,我们SQL语句中,查询了delete_flag,create_time,update_time,但是这⼏个属性却没有赋值.

这是什么原因呢“

当⾃动映射查询结果时,MyBatis会获取结果中返回的列名并在Java类中查找相同名字的属性(忽略⼤⼩写)。这意味着如果发现了ID列和id属性,MyBatis会将列ID的值赋给id属性

但是由于数据库与java命名规则不同,数据库的蛇形将转换成驼峰,所以无法识别。

解决方法有以下三种:

  1. 起别名
  2. 结果映射
  3. 开启驼峰命名

🚩起别名

在SQL语句中,给列名起别名,保持别名和实体类属性名⼀样

@Select("select id, username, `password`, age, gender, phone, delete_flag as deleteFlag, " +
        "create_time as createTime, update_time as updateTime from userinfo")
List<UserInfo> select3();

再次运行查看

就可以看到对应属性已经有值了

但是这种方式一般不推荐,因为相当于将这个工作交给数据库来做了。会降低效率,且不可控

🚩结果映射

使用注解,以及相关操作如下:

@Results({
        @Result(column = "delete_flag",property = "deleteFlag"),
        @Result(column = "create_time",property = "createTime"),
        @Result(column = "update_time",property = "updateTime")
})
@Select("select * from userinfo")
List<UserInfo> select4();

如果其他SQL,也希望可以复⽤这个映射关系,可以给这个Results定义⼀个名称

@Results(id = "resultMap",value = {
        @Result(column = "delete_flag",property = "deleteFlag"),
        @Result(column = "create_time",property = "createTime"),
        @Result(column = "update_time",property = "updateTime")
})
@Select("select * from userinfo")
List<UserInfo> select4();

后续代码使用相应的@ResultMap进行调用即可

🚩开启驼峰命名(推荐使用)

通常数据库列使⽤蛇形命名法进⾏命名(下划线分割各个单词),⽽Java属性⼀般遵循驼峰命名法约定.为了在这两种命名⽅式之间启⽤⾃动映射,需要将mapUnderscoreToCamelCase 设置为true。

application.yml配置如下:

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

仅限遵守两种命名规则的转换。

这时候我们直接使用查询即可

@Test
void select2() {
    List<UserInfo> list = userInfoMapper.select2();
    System.out.println(list);
}

查询后发现

已经进行了自动映射,字段全部进⾏正确赋值

⭕总结

关于《【JavaEE进阶】 MyBatis使用注解实现增删改查》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
SQL JavaScript Java
springboot+springm vc+mybatis实现增删改查案例!
springboot+springm vc+mybatis实现增删改查案例!
26 0
|
18天前
|
SQL XML Java
【mybatis】第二篇:@Select注解中加入字段判断
【mybatis】第二篇:@Select注解中加入字段判断
|
18天前
|
存储 关系型数据库 MySQL
【mybatis-plus】Springboot+AOP+自定义注解实现多数据源操作(数据源信息存在数据库)
【mybatis-plus】Springboot+AOP+自定义注解实现多数据源操作(数据源信息存在数据库)
|
29天前
|
Java 数据库连接 mybatis
mybatis plus字段为null或空字符串把原来的数据也更新了,只需要注解
mybatis plus字段为null或空字符串把原来的数据也更新了,只需要注解
19 0
|
1月前
|
Java 数据库连接 网络安全
mybatis使用全注解的方式案例(包含一对多关系映射)
mybatis使用全注解的方式案例(包含一对多关系映射)
12 0
|
1月前
|
关系型数据库 Java 数据库连接
如何利用Mybatis-Plus自动生成代码(超详细注解)
如何利用Mybatis-Plus自动生成代码(超详细注解)
26 1
|
2月前
|
SQL XML Java
【JavaEE进阶】 MyBatis之动态SQL
【JavaEE进阶】 MyBatis之动态SQL
|
1月前
|
SQL Java 数据库连接
挺详细的spring+springmvc+mybatis配置整合|含源代码
挺详细的spring+springmvc+mybatis配置整合|含源代码
42 1
|
1月前
|
druid Java 数据库连接
Spring Boot3整合MyBatis Plus
Spring Boot3整合MyBatis Plus
45 1
|
3月前
|
Java 数据库连接 Maven
SSM框架整合:掌握Spring+Spring MVC+MyBatis的完美结合!
SSM框架整合:掌握Spring+Spring MVC+MyBatis的完美结合!