#{}的困惑 - Mybatis中的参数传递

Mybatis的初学者一定对sql映射文件中许多的#{}符号感到陌生。其实我们都知道,它可以理解为一个占位符,把传递过来的数据放到sql语句中,但有些时候它又我觉得困惑,最后大致了解了一下,下面说一下我所学到的知识。

#{}符号大致有以下三种用途:

1. 获取传递来的原始类型参数

我们经常将操作方法定义在一个接口里面。当我们在接口里定义诸如

User getUser(Integer id);

的方法时,我们需要向Mybatis传递一个整型参数 id,这时候,许多教程上的映射文件就是这么写的:

<select id="getUser" resultType="com.User">    
	select * from user where id = #{id}
</select>

那我们就会情不自禁地想了:#{id}就是代指我传递过来的参数呗,也就是说,参数名是啥#{}就填啥呗,但事实是不论你写#{name}#{gender}#{fuck}程序都能正确运行。这是因为,当只有一个参数传递时,Mybatis不会对其作特殊处理,不管你大括号里写的什么,它都会用参数替换。 它真的就只是一个占位置的。

那么多个参数呢?

User getUser(Integer id, String name);

如果你这么写:

<select id="getUser" resultType="com.User">    
	select * from user where id = #{id} and name = #{name}
</select>

就会发现刺眼的报错信息了。实际上,当有多个参数(不止是原始类型)传递时,Mybatis会对它们做特殊处理——封装成Map,其中键是param1, param2, param3…类推,键才是传递过来的参数,我们在#{}中写的需是键,也就是#{param1},#{param2},或是它们的下标#{0},#{1}。但这样也未免太麻烦,所以现在主要采用写 命名参数 的方法:

在声明接口时用注解命名参数,就相当于自己命名参数的键名:

User getUser(@Param("id")Integer id, @Param("name")String name);

这样一来上面的报错信息就消失了。
另外,如果传入的是一个Collection或数组类型的参数,Mybatis也会把它封装成Map,这时候如果不自己命名的话键是固定的:“collection"或"list"或"array”。

2. 获取对象中的属性值

这个就好理解了,当参数只有一个并且是个JavaBean对象POJO时,#{}里面就写这个对象的属性名,Mybatis就能把它取出来。例如:
JavaBean

public class User {
	Integer userid;
	String username;
	Character gender;
	//...
}

接口

User getUser(User user);

sql

<select id="getUser" resultType="com.User">    
	select * from user where id = #{userid} and name = #{username}
</select>
3. 获取Map中的值

当我们传入一个Map后,#{}里写键,那么Mybatis就会取出值来。

不得不说,Mybatis真的是既简便又强大!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis-Plus 是一个基于 MyBatis 的增强工具,提供了一些额外的功能和便利的配置。下面是一些常见的 MyBatis-Plus 配置: 1. 添加依赖:在项目的 `pom.xml` 文件添加 MyBatis-Plus 的依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>latest-version</version> </dependency> ``` 2. 配置数据源:在 Spring Boot 的配置文件(`application.properties` 或 `application.yml`)配置数据源信息,例如: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/my_database username: root password: my_password driver-class-name: com.mysql.cj.jdbc.Driver ``` 3. 配置 MyBatis-Plus:创建一个配置类,用于配置 MyBatis-Plus 相关的配置项,例如: ```java @Configuration @MapperScan("com.example.mapper") // 指定 Mapper 类所在的包路径 public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } } ``` 4. 创建实体类和 Mapper 接口:创建与数据库表对应的实体类和对应的 Mapper 接口,使用 MyBatis-Plus 的注解进行配置。例如: ```java @Data @TableName("user") public class UserEntity { @TableId(type = IdType.AUTO) private Long id; private String username; private Integer age; // 省略 getter 和 setter } ``` ```java public interface UserMapper extends BaseMapper<UserEntity> { // 可以直接使用 MyBatis-Plus 提供的方法,也可以自定义 SQL 方法 } ``` 这些是 MyBatis-Plus 的基本配置,你还可以根据需求进行一些高级配置,例如分页插件、逻辑删除、多租户等。具体的配置和使用方法可以参考 MyBatis-Plus 的官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值