2. Mybatis Select

本文深入探讨了MyBatis框架中select元素的使用方法,包括如何配置简单查询,使用预处理语句参数,以及如何返回HashMap类型的对象。同时,文章提供了详细的XML配置示例和对应的Java测试代码。

mybatis select是mybatis 中最常用的元素之一。

对简单的查询,select 元素的配置是相当简单的:

<?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="com.accp.mybatis.model.Blog">  
      
    <!--可重用的SQL代码段-->  
    <sql id="blog_column">id,title,author_id as authorId</sql>  
      
    <select id="selectBlog_as_map" parameterType="int" resultType="hashmap">  
        select <include refid="blog_column"/> from Blog where id = #{id}  
    </select>  
      
</mapper>  

 这个语句被称作selectBlog_as_map,使用一个int (或Integer)类型的参数,并返回一个HashMap类型的对象。

#{id}告诉mybatis创建了一个PreparedStatement(预处理语句)参数。

在JDBC中,类似的代码如下:

String selectBlog_as_map = “select * from Blog where id =?”;   
PreparedStatement ps = conn.prepareStatement(selectBlog_as_map);   
ps.setInt(1,id);

测试代码:

public static void selectBlogAsMap(int id) {  
    SqlSession session = sqlMapper.openSession();  
    Map<String, Object> map = session.selectOne("selectBlog_as_map",id);  
    System.out.println(map);  
    session.close();  
}  

SELECT的属性还有很多的属性可以配置,具体的如下:

 参考:https://www.cnblogs.com/duanxz/p/4742168.html

转载于:https://www.cnblogs.com/shix0909/p/11149165.html

<think>我们正在处理一个警告:Unchecked cast: 'org.mybatis.dynamic.sql.select.render.SelectStatementProvider' to 'org.mybatis.dynamic.sql.util.Buildable<org.mybatis.dynamic.sql.select.SelectModel>' 这个警告是因为我们尝试将一个`SelectStatementProvider`对象强制转换为`Buildable<SelectModel>`类型,而编译器无法保证这种转换的安全性。 在MyBatis Dynamic SQL中,`SelectStatementProvider`通常是构建过程的最终产物(已经是一个可渲染的语句),而`Buildable`是一个中间构建状态。实际上,`insertInto`的`withSelectStatement`方法期望的是一个`SelectStatementProvider`,而不是`Buildable<SelectModel>`。 因此,正确的做法是:我们不应该强制转换,而是应该直接传入一个`SelectStatementProvider`类型的对象。同时,我们需要检查`selectStatement`的类型,确保它是一个`SelectStatementProvider`。 修正步骤: 1. 移除对`.withSelectStatement`的强制转换,因为该方法实际接受的是`SelectStatementProvider`类型。 2. 确保`selectStatement`变量已经是`SelectStatementProvider`类型(通常通过`select`语句的`build()`和`render()`得到)。 以下是修改后的代码示例: ```java // 假设selectStatement是通过如下方式构建的(正确示例): // SelectStatementProvider selectStatement = select(...).from(...).where(...).build().render(RenderingStrategies.MYBATIS3); // 然后插入语句改为: InsertSelectStatementProvider insertStatement = SqlBuilder.insertInto(zeroFxchangeOrderHist) .set(targetColumns) // 注意:之前已经纠正过,这里用set而不是withColumnList .withSelectStatement(selectStatement) // 直接传入,无需强制转换 .build() .render(RenderingStrategies.MYBATIS3); ``` 如果`selectStatement`不是`SelectStatementProvider`类型,那么你需要调整它的构建方式。通常情况下,构建一个查询语句的步骤是: a. 使用`SqlBuilder.select(...)`构建一个选择模型。 b. 调用`.build()`得到一个`Buildable<SelectModel>`(但这不是最终可渲染的语句)。 c. 调用`.render(...)`方法得到`SelectStatementProvider`。 所以,请确保你的`selectStatement`是通过`.render()`方法得到的,这样它才是`SelectStatementProvider`类型。 总结:去掉强制转换,并确保传入的对象类型正确。 §§相关问题§§ 1. 如何正确构建 MyBatis Dynamic SQL 的 SELECT 语句以用于 INSERT INTO SELECT2.MyBatis Dynamic SQL 中,`Buildable` 和 `SelectStatementProvider` 有什么区别? 3. 如何避免 Java 中的 unchecked cast 警告? 4. 在 INSERT INTO SELECT 语句中,如何设置插入的目标列和查询语句的映射? </think>在 MyBatis Dynamic SQL 中,`.withSelectStatement()` 方法需要接收一个 `SelectStatementProvider` 类型的参数,而不是 `Buildable<SelectModel>`。您收到的 "unchecked cast" 警告是因为强制类型转换不安全,且可能导致运行时错误。以下是修正方案: ### 问题原因 1. `selectStatement` 变量应为 `SelectStatementProvider` 类型(通过 `select(...).build().render()` 创建) 2. 强制转换为 `Buildable<SelectModel>` 类型不匹配 3. MyBatis 期望直接传入渲染完成的查询语句 ### 修正代码 ```java // 确保selectStatement是SelectStatementProvider类型(正确构建方式) SelectStatementProvider selectStatement = select(...) .from(...) .where(...) .build() .render(RenderingStrategies.MYBATIS3); // INSERT INTO SELECT(移除强制转换) InsertSelectStatementProvider insertStatement = SqlBuilder.insertInto(zeroFxchangeOrderHist) .set(targetColumns) // 使用set()而非withColumnList .withSelectStatement(selectStatement) // 直接传入SelectStatementProvider .build() .render(RenderingStrategies.MYBATIS3); ``` ### 关键修改 1. 移除所有强制类型转换 `(Buildable<SelectModel>)` 2. 确保 `selectStatement` 通过 `build().render()` 创建 3. 使用 `.set()` 方法代替废弃的 `.withColumnList()`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值