欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > Mybatis注解的基础操作——02

Mybatis注解的基础操作——02

2025/3/28 23:19:45 来源:https://blog.csdn.net/2302_76435884/article/details/146440108  浏览:    关键词:Mybatis注解的基础操作——02

写mybatis代码的方法有两种:

  1. 注解
  2. xml方式

本篇就介绍注解的方式

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

目录

 一、参数传递

二、增(Insert)

三、删(Delete)

四、改(Update)

五、查(Select)

1.起别名

2.结果映射

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


 一、参数传递

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

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

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

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

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

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

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

添加测试用例:

@Test
void queryById() {UserInfo userInfo = userInfoMapper.queryById(4);System.out.println(userInfo);
}

运行测试用例:

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

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

二、增(Insert)

SQL语句:

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

Mapper接口:

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

测试代码:

@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 属性 ,#{}需要使用 参数.属性 来获取。
 @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的注解,。

 //获取自动生成的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的值,默认值:未设置。

 

测试代码:

 @Testvoid 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语句:

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

Mapper接口

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

四、改(Update)

sql语句:

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

Mapper接口

@Update("update user_info set username=#{username} where id=#{id}")
void update(UserInfo userInfo);

五、查(Select)

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

1.起别名

2.结果映射

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

1.起别名

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

@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注解‘

  //这里的映射要与对象的属性一致,不然会报错,找不到@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注解使用。

@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

#配置驼峰转换
mybatis.configuration.map-underscore-to-camel-case=true

.yml 

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

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

@Select("select id, username, `password`, age, gender, phone, delete_flag, " +"create_time, update_time from user_info")
public List<UserInfo> queryAllUser();

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词