Mybatis_SQL映射文件_参数的各种取值

这篇博客详细介绍了Mybatis在处理SQL映射文件时,针对不同情况下的参数取值方式。包括单个参数的基本类型取值、多个参数的处理,如使用索引或命名参数,以及@Param注解的使用。同时,文章讲解了传入JavaBean和Map对象时的参数映射规则。

1、单个参数:

  • 若为基本类型:取值:#{随便写}
  • 传入pojo:后面第4点讨论

2、多个参数:
public Employee getEmpByIdAndEmpName(Integer id,String empName)
此时取值:#{参数名}是无效了;
可用:0,1(参数的索引)或者param1,param2(第几个参数paramN)
原因:只要传入了多个参数;mybatis会自动的将这些参数封装在一个map中;

封装时使用的key就是参数的索引和参数的第几个表示
			Map<String,Object> map = new HashMap<>();
			map.put("1",传入的值);map.put("2","传入的值");
		 #{key}就是从这个map中取值;

3、@Param:为参数指定key;命名参数;我们以后也推荐这么做;
我们可以告诉mybatis,封装参数map的时候别乱来,使用我们指定的key

  <select id="getEmpByIdAndEmpName" resultType="com.czl.bean.Employee">
        select * from t_employee where id=#{id} and empname=#{empName}
    </select>

若没有使用0,1或者param1 param2则会报错

<!--   Caused by: org.apache.ibatis.binding.BindingException: 
			Parameter 'id' not found. 
			Available parameters are [0, 1, param1, param2]
	-->
 //@Param:为参数指定key;命名参数
 public Employee getEmpByIdAndEmpName(
 @Param("id") Integer id,@Param("empName") String empname);

4、传入了pojo(javaBean)
取值:#{pojo的属性名}

5、传入了map:将多个要使用的参数封装起来(使用场景:当需要传入几个参数,但是又不希望为这几个参数建立一个javabean的时候,可以把这些参数封装在一个map中)
取值:#{key}

6、扩展:多个参数:自动封装map;

  method01(@Param("id")Integer id,String empName,Employee employee);
	Integer id -> #{id}
	String empName -> #{param2}
	Employee employee(取出这个里面的email)-->#{param3.email}
	
### MyBatis 中 `databaseId` 的取值规则与配置方法 MyBatis 的 `databaseId` 是用于支持多数据库厂商的特性,通过它可以在不同的数据库之间切换 SQL 语句。以下是关于 `databaseId` 的取值规则和配置方法的详细说明。 #### 1. `databaseId` 的取值规则 MyBatis 的 `databaseId` 取值主要依赖于 `DatabaseIdProvider` 的实现。默认情况下,MyBatis 提供了 `VendorDatabaseIdProvider` 来解析数据库厂商标识[^1]。 - **默认规则**:`VendorDatabaseIdProvider` 根据 JDBC URL 自动识别数据库类型,并返回相应的厂商标识。例如: - MySQL 返回 `MySQL` - Oracle 返回 `Oracle` - SQL Server 返回 `SQL Server` - PostgreSQL 返回 `PostgreSQL` - **自定义规则**:可以通过实现 `DatabaseIdProvider` 接口来自定义 `databaseId` 的解析逻辑[^1]。用户可以根据需要扩展或修改识别逻辑。 #### 2. `databaseId` 的配置方法 `databaseId` 的配置主要包括以下两种方式: ##### (1) 使用默认的 `VendorDatabaseIdProvider` 在 MyBatis 的全局配置文件中,可以通过 `<databaseIdProvider>` 标签启用默认的 `VendorDatabaseIdProvider`。例如: ```xml <databaseIdProvider type="VENDOR"> <property name="MySQL" value="mysql"/> <property name="Oracle" value="oracle"/> </databaseIdProvider> ``` 上述配置中,`name` 表示数据库厂商标识,`value` 是为其设置的别名。这些别名可以被 SQL 映射文件中的 `databaseId` 属性引用[^1]。 ##### (2) 实现自定义的 `DatabaseIdProvider` 如果默认的 `VendorDatabaseIdProvider` 无法满足需求,可以实现 `DatabaseIdProvider` 接口来定义自己的逻辑。例如: ```java public class CustomDatabaseIdProvider implements DatabaseIdProvider { @Override public void setProperties(Properties p) { // 设置自定义属性 } @Override public String getDatabaseId(DataSource dataSource) throws SQLException { try (Connection connection = dataSource.getConnection()) { String productName = connection.getMetaData().getDatabaseProductName(); if (productName.contains("MySQL")) { return "custom_mysql"; } else if (productName.contains("Oracle")) { return "custom_oracle"; } return null; } } } ``` 然后在配置文件中指定自定义的 `DatabaseIdProvider`: ```xml <databaseIdProvider type="com.example.CustomDatabaseIdProvider"> <!-- 配置自定义属性 --> </databaseIdProvider> ``` #### 3. SQL 映射文件中的使用 在 SQL 映射文件中,可以通过 `databaseId` 属性指定特定数据库的 SQL 语句。例如: ```xml <select id="selectUsers" resultType="User" databaseId="mysql"> SELECT * FROM users WHERE status = #{status} </select> <select id="selectUsers" resultType="User" databaseId="oracle"> SELECT * FROM users WHERE status = #{status, jdbcType=VARCHAR} </select> ``` 当 MyBatis 执行查询时,会根据当前数据库的 `databaseId` 加载匹配的 SQL 语句。如果没有匹配的 `databaseId`,则加载不带 `databaseId` 属性的 SQL 语句[^2]。 #### 4. 注意事项 - 如果同时存在带有 `databaseId` 和不带 `databaseId` 的相同 SQL 语句,则后者会被舍弃[^2]。 - 在某些情况下(如 Oracle),可能需要为 `null` 值显式指定 `jdbcType`,以避免 JDBC 类型映射问题[^3]。 ```python # 示例代码:为 null 值指定 jdbcType def query_user(email): sql = "SELECT * FROM users WHERE email = #{email,jdbcType=NULL}" return session.selectOne(sql, {"email": email}) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值