Mybatis注解的基础操作——02

写mybatis代码的方法有两种:

  1. 注解
  2. xml方式

本篇就介绍注解的方式

mybatis的操作主要有增删改查,下面进行一一讲解。

目录

一、参数传递

二、增(Insert)

三、删(Delete)

四、改(Update)

五、查(Select)

1.起别名

2.结果映射

3.开启驼峰命名(推荐)


一、参数传递

需求:查找id=4的用户,对应的sql就是: select * from user_info where id=4

java 复制代码
@Select("select username, `password`, age, gender, phone from user_info where 
id= 4 ")
UserInfo queryById();

结果集返回一条记录该记录与与UserInfo构成映射返回UserInfo类型的一个对象。

只能查找id=4的数据,这样代码写死了,需要变为动态的数值。

这时可以通过在queryById方法中添加一个参数{id},将方法中的参数,传给sql语句,使用#{}的方式获取方法中的参数。

java 复制代码
@Select("select username, `password`, age, gender, phone from user_info where 
id= #{id} ")
UserInfo queryById(Integer id);

注意:如果mapper接口方法形参++只有一个++普通类型的参数,#{...}里面的属性名可以随便写,如:#{id}、#{value},形参会与#{}里面的参数进行绑定,但是建议和参数名一致。

添加测试用例:

java 复制代码
@Test
void queryById() {
     UserInfo userInfo = userInfoMapper.queryById(4);
     System.out.println(userInfo);
}

运行测试用例:

当然也可以通过@Param 设置参数别名,如果使用@Param设置别名 ,#{}里面参数的名字要和@Param设置的参数名一致。

java 复制代码
@Select("select username, `password`, age, gender, phone from user_info where 
id= #{userid} ")
UserInfo queryById(@Param("userid") Integer id);

二、增(Insert)

SQL语句:

sql 复制代码
insert into user_info (username, `password`, age, gender, phone) values
("zhaoliu","zhaoliu",19,1,"18700001234");
  • 把sql中的常量替换成动态的参数

Mapper接口:

sql 复制代码
@Insert("insert into user_info (username, `password`, age, gender, phone) 
values (#{username},#{password},#{age},#{gender},#{phone})")
Integer insert(UserInfo userInfo);
  • 这里可以用UserInfo对象来获取参数

测试代码:

java 复制代码
@Test
void insert() {
   UserInfo userInfo = new UserInfo();
   userInfo.setUsername("zhaoliu");
   userInfo.setPassword("zhaoliu");
   userInfo.setGender(2);
   userInfo.setAge(21);
   userInfo.setPhone("18612340005");
   userInfoMapper.insert(userInfo);
}

运行之后,观察数据库执行结果

  • 如果设置了@Param 属性 ,#{}需要使用 参数.属性 来获取。
java 复制代码
 @Insert("insert into user_info (username,password,age,gender,phone)"+
"values (#{UI.username},#{UI.password},#{UI.age},#{UI.gender},#{UI.phone})")
   Integer insert(@Param("UI") UserInfo userInfo);

运行后观察结果:

  • 返回主键

Insert语句默认返回的是 受影响的行数。

但有些情况下,数据插入之后,还需要有后续的关联操作,需要获取到新插入数据的id。

比如订单系统。

当我们下完订单之后,需要通知物流系统,库存系统,结算系统,这时候就需要拿到订单的id。

如果想要拿到自增id,需要在Mapper接口的方法上添加一个Options的注解,。

java 复制代码
 //获取自动生成的id,并设置返回的id
    @Options(useGeneratedKeys = true,keyProperty = "id")
    @Insert("insert into user_info (username,password,age,gender,phone)"+
                "values (#{UI.username},#{UI.password},#{UI.age},#{UI.gender},#{UI.phone})")
    Integer insert(@Param("UI") UserInfo userInfo);

useGeneratedKeys:这会令Mybatis使用JDBC的getGenerateKeys方法来取出由数据库内部生成的主键(自增主键),默认值:false

keyProperty:指定能够唯一识别的对象的属性,Mybatis会使用getGenerateKeys的返回值或insert语句的selectKey 子元素设置 keyProperty的值,默认值:未设置。

测试代码:

java 复制代码
 @Test
    void insert() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("zhao77");
        userInfo.setPassword("zhao");
        userInfo.setGender(1);
        userInfo.setAge(100);
        userInfo.setPhone("18612344705");
        Integer result = userInfoMapper.insert(userInfo);
        log.info("测试结果"+result+"自增ID"+userInfo.getId());
    }

运行结果:

注意:如果没有Options注解,即使测试方法创建完对象之后,使用getId方法也是不能够获取到自增id的。


三、删(Delete)

sql语句:

sql 复制代码
delete from user_info where id=6
  • 把sql中的常量替换为动态的参数。

Mapper接口

java 复制代码
@Delete("delete from user_info where id = #{id}")
void delete(Integer id);

四、改(Update)

sql语句:

sql 复制代码
update user_info set username="zhaoliu" where id=5
  • 把sql中的常量替换为动态的参数

Mapper接口

sql 复制代码
@Update("update user_info set username=#{username} where id=#{id}")
void update(UserInfo userInfo);

五、查(Select)

上面的参数传递中讲述了查询的例子,但是如果实体类的属性名和数据库字段名不一致时,可以采取下面的措施:

1.起别名

2.结果映射

3.利用驼峰命名,配置驼峰命名配置

1.起别名

在sql语句中,给列名起别名,保持别名和 实体类属性名一样。

java 复制代码
@Select("select id, username, `password`, age, gender, phone, delete_flag as 
deleteFlag, " +
 "create_time as createTime, update_time as updateTime from user_info")
public List<UserInfo> queryAllUser();

sql语句太长时,可以使用加号 +进行字符串拼接。

2.结果映射

使用@Result注解'

java 复制代码
  //这里的映射要与对象的属性一致,不然会报错,找不到
    @Results(id = "BaseMap",value = {
            @Result(column = "delete_flag",property = "deleteFlag"),
            @Result(column = "create_time",property = "createTime"),
            @Result(column = "update_time",property = "updateTime")
    })
    @Select("select * from user_info")
    List<UserInfo> selectAll2();

如果有其他sql复用这种映射关系,我们可以给Result定义一个id,然后再搭配@ResultMap注解使用。

java 复制代码
@Results(id = "BaseMap",value = {
            @Result(column = "delete_flag",property = "deleteFlag"),
            @Result(column = "create_time",property = "createTime"),
            @Result(column = "update_time",property = "updateTime")
    })
    @Select("select * from user_info")
    List<UserInfo> selectAll2();

//复用映射关系
  @ResultMap(value = "BaseMap")
    @Select("select *from user_info where id=4")
    UserInfo selectById();

3.开启驼峰命名(推荐)

这种方式要满足下面的条件:

  • 配置驼峰命名规则

.properties

java 复制代码
#配置驼峰转换
mybatis.configuration.map-underscore-to-camel-case=true

.yml

java 复制代码
mybatis:
  configuration:
    map-underscore-to-camel-case: true  #配置驼峰自动转换
  • 类中属性名为驼峰格式(createTime);表中字段名为蛇形格式(create_time)

其中Java代码中不做任何处理:

java 复制代码
@Select("select id, username, `password`, age, gender, phone, delete_flag, " +
 "create_time, update_time from user_info")
public List<UserInfo> queryAllUser();
相关推荐
虾球xz14 分钟前
游戏引擎学习第175天
java·学习·游戏引擎
坚持学习永不言弃1 小时前
【IDEA】热部署SpringBoot项目
java·ide·intellij-idea
XU磊2601 小时前
Java 集合框架:从数据结构到性能优化,全面解析集合类
java·哈希
潘多编程2 小时前
实战指南:使用 OpenRewrite 将 Spring Boot 项目从 JDK 8 升级到 JDK
java·spring boot·elasticsearch
QQ828929QQ2 小时前
Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实战指南
java·spring boot·后端
suuijbd2 小时前
Java实习生面试题(2025.3.23 be)
spring·面试·vue·mybatis
isllxiao3 小时前
常见中间件漏洞(tomcat)
java·tomcat
述雾学java3 小时前
JavaWeb,Tomcat基本思想,手写Tomcat
java·tomcat·java核心基础
李白的粉3 小时前
基于springboot的地方美食分享网站(全套)
java·spring boot·毕业设计·课程设计·美食·源代码
捡田螺的小男孩4 小时前
腾讯一面:40亿QQ号,不超过1G内存,如何去重?
java·后端·面试