mybatis_select_标签

本文详细介绍了 MyBatis 中 select 语句的使用方法,包括输入参数、输出结果的配置选项,如 parameterClass、resultClass 等,并通过实例展示了如何使用 # 和 $ 占位符以及 resultMap 的配置。

mybatis select的输入和输出

例如 select id,name,age from user where name like '%王%' and age>20

这里既有输入也有输出

select的属性
id,parameterClass,resultClass,parameterMap,resultMap,cacheModel
resultSetType,fetchSize,xmlResultName,remapResults,timeout
输入 parameterClass,ParameterMap
resultSetTYpe为结果集类型,主要是说游标,具有方向性,可以取
forward_only,scoll_insensitive,scoll_sensitive,具体情况具体配置

fetchSize 预取回数据量的大小

xmlResultName,返回result为xml的名称

如果返回的结果可以修改则吧remapResults设为true,否则设为false

输入,用参数带进来
可以是#,$做为占位符

不同占位符使用


Xml代码
<SPAN style="FONT-SIZE: small"><select id="getAllUsers1" resultClass="com.mypackage.User"
parameterClass="string">
SELECT * FROM USER WHERE DEPARTMENT=#department#
</select>
<select id="getAllUsers1" resultClass="com.mypackage.User"
parameterClass="string">
SELECT * FROM USER WHERE DEPARTMENT like '$department$'
</select>
</SPAN>
Xml代码
<SPAN style="FONT-SIZE: small"><SPAN style="FONT-SIZE: x-small"><select id="getAllUsers1" resultClass="com.mypackage.User"
parameterClass="string">
SELECT * FROM USER WHERE DEPARTMENT=#department#
</select>
<select id="getAllUsers1" resultClass="com.mypackage.User"
parameterClass="string">
SELECT * FROM USER WHERE DEPARTMENT like '$department$'
</select>
</SPAN></SPAN>

#不能放在‘’之内

resultMap



Xml代码
<SPAN style="FONT-SIZE: small"><!-- 无映射 -->
<select id="getAllUsers1" resultClass="User"
parameterClass="string">
SELECT * FROM USER WHERE DEPARTMENT=#department#
</select>

<!-- 内联映射->实体类 -->
<select id="getAllUsers2" resultClass="User"
parameterClass="string">
SELECT USERID as userid, USERNAME as username, PASSWORD as
password, DEPARTMENT as department FROM USER WHERE
DEPARTMENT=#department#
</select>

<!-- 内联映射->MAP类 -->
<select id="getAllUsers3" resultClass="hashmap"
parameterClass="string">
SELECT * FROM USER WHERE DEPARTMENT=#department#
</select>

<!-- 显示映射->实体类 -->
<resultMap id="accoutResult" class="User">
<result property="userid" column="USERID" />
<result property="username" column="USERNAME" />
<result property="password" column="PASSWORD" />
<result property="department" column="DEPARTMENT" />
</resultMap>
<select id="getAllUsers4" resultMap="accoutResult"
parameterClass="string">
SELECT * FROM USER WHERE DEPARTMENT=#department#
</select>

<!-- 显示映射->MAP类 -->
<resultMap id="mapResult" class="hashmap">
<result property="userid" column="USERID" />
<result property="username" column="USERNAME" />
<result property="password" column="PASSWORD" />
<result property="department" column="DEPARTMENT" />
</resultMap>
<select id="getAllUsers5" resultMap="mapResult"
parameterClass="string">
SELECT * FROM USER WHERE DEPARTMENT=#department#
</select>

</SPAN>
Xml代码
<SPAN style="FONT-SIZE: small"><SPAN style="FONT-SIZE: x-small"><!-- 无映射 -->
<select id="getAllUsers1" resultClass="User"
parameterClass="string">
SELECT * FROM USER WHERE DEPARTMENT=#department#
</select>

<!-- 内联映射->实体类 -->
<select id="getAllUsers2" resultClass="User"
parameterClass="string">
SELECT USERID as userid, USERNAME as username, PASSWORD as
password, DEPARTMENT as department FROM USER WHERE
DEPARTMENT=#department#
</select>

<!-- 内联映射->MAP类 -->
<select id="getAllUsers3" resultClass="hashmap"
parameterClass="string">
SELECT * FROM USER WHERE DEPARTMENT=#department#
</select>

<!-- 显示映射->实体类 -->
<resultMap id="accoutResult" class="User">
<result property="userid" column="USERID" />
<result property="username" column="USERNAME" />
<result property="password" column="PASSWORD" />
<result property="department" column="DEPARTMENT" />
</resultMap>
<select id="getAllUsers4" resultMap="accoutResult"
parameterClass="string">
SELECT * FROM USER WHERE DEPARTMENT=#department#
</select>

<!-- 显示映射->MAP类 -->
<resultMap id="mapResult" class="hashmap">
<result property="userid" column="USERID" />
<result property="username" column="USERNAME" />
<result property="password" column="PASSWORD" />
<result property="department" column="DEPARTMENT" />
</resultMap>
<select id="getAllUsers5" resultMap="mapResult"
parameterClass="string">
SELECT * FROM USER WHERE DEPARTMENT=#department#
</select>

</SPAN></SPAN>



map映射 ,返回的list里的每一项都是一个map然后有键值对

xml映射


Xml代码
<SPAN style="FONT-SIZE: small"><!-- XML -->
<select id="selectXML" parameterClass="string" resultClass="xml"
xmlResultName="log">
SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName#
</select>
</SPAN>
Xml代码
<SPAN style="FONT-SIZE: small"><SPAN style="FONT-SIZE: x-small"><!-- XML -->
<select id="selectXML" parameterClass="string" resultClass="xml"
xmlResultName="log">
SELECT * FROM USER_ACCOUNT WHERE GROUPNAME=#groupName#
</select>
</SPAN></SPAN>

resultClass="xml"这个xml也是预定义好的类
在测试类里调用后返回的是xml格式的字符串,指定的xmlResultName相当于xml的
根元素



返回结果有三类,1 返回直接指定的类 2 返回map类型 3 返回xml

### MyBatis 中 `databaseId` 的用法及配置示例 #### 一、`databaseId` 属性的作用 MyBatis 提供了 `databaseId` 属性来支持多数据库厂商的 SQL 执行需求。通过该属性,可以针对不同类型的数据库定义不同的 SQL 语句[^1]。当 MyBatis 加载映射文件时,它会选择与当前数据库匹配的 SQL 语句执行。 如果某个 `<select>` 或其他动态 SQL 节点未指定 `databaseId` 属性,则这些节点会被视为默认选项,在找不到特定于当前数据库的 SQL 定义时被选用[^3]。 --- #### 二、`databaseIdProvider` 配置方法 为了启用 `databaseId` 功能,需要在 MyBatis 的全局配置文件 `mybatis-config.xml` 中声明一个 `databaseIdProvider` 元素。以下是标准的配置方式: ```xml <configuration> <!-- 数据库 ID 提供者 --> <databaseIdProvider type="DB_VENDOR"> <property name="MySQL" value="mysql"/> <property name="Oracle" value="oracle"/> <property name="SQL Server" value="sqlserver"/> </databaseIdProvider> <!-- 映射器引入 --> <mappers> <mapper resource="cn/edu/tju/mapper/UserMapper.xml"/> </mappers> </configuration> ``` 在此配置中: - `type="DB_VENDOR"` 表明使用内置的数据库识别逻辑。 - 每个 `<property>` 子标签用于绑定具体的数据库名称到对应的 `value` 值(即 `databaseId`)。例如,“MySQL” 对应的 `databaseId` 是 “mysql”。 注意:实际运行时,MyBatis 将根据 JDBC 连接元数据自动判断当前使用的数据库类型,并将其转换为相应的 `databaseId`[^2]。 --- #### 三、Mapper XML 文件中的 `databaseId` 使用 在 Mapper XML 文件中可以通过 `databaseId` 属性区分同一操作的不同实现版本。以下是一个完整的例子: ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.edu.tju.mapper.UserMapper"> <!-- MySQL 版本查询 --> <select id="selectUserById" resultType="cn.edu.tju.domain.User" databaseId="mysql"> SELECT * FROM users WHERE id = #{userId} </select> <!-- Oracle 版本查询 --> <select id="selectUserById" resultType="cn.edu.tju.domain.User" databaseId="oracle"> SELECT * FROM users WHERE id = #{userId} AND ROWNUM <= 1 </select> <!-- 默认查询(无 databaseId),适用于未匹配的情况 --> <select id="selectUserById" resultType="cn.edu.tju.domain.User"> SELECT * FROM users WHERE id = #{userId} </select> </mapper> ``` 在这个例子中: - 当前数据库为 MySQL 时,第一个 `<select>` 被选中; - 当前数据库为 Oracle 时,第二个 `<select>` 被选中; - 若无法匹配任何已知的 `databaseId`,则最后一个通用版 `<select>` 生效[^5]。 --- #### 四、常见问题排查 1. **`databaseIdProvider` 配置无效** 如果发现即使设置了 `databaseIdProvider`,仍然没有生效,可能是因为 Spring Boot 环境下未正确初始化 `SqlSessionFactoryBean`。需确认其内部变量 `this.databaseIdProvider` 是否已被赋值。具体可参考源码片段[^4]: ```java if (this.databaseIdProvider != null) { try { configuration.setDatabaseId(this.databaseIdProvider.getDatabaseId(this.dataSource)); } catch (SQLException e) { throw new RuntimeException("Failed to set Database Id", e); } } ``` 2. **JDBC URL 不匹配** 确保应用连接的数据库驱动程序能够返回正确的数据库产品名(Vendor Name),以便与 `databaseIdProvider` 中的 `<property>` 名称一致。 --- #### 五、总结 通过对 `databaseId` 和 `databaseIdProvider` 的合理配置,可以在同一个项目中轻松适配多种数据库环境下的 SQL 差异化需求。这不仅提高了代码复用率,还减少了因切换数据库而导致的维护成本。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值