前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >mybatis返回结果处理

mybatis返回结果处理

作者头像
一个风轻云淡
发布于 2023-10-15 03:13:33
发布于 2023-10-15 03:13:33
24400
代码可运行
举报
文章被收录于专栏:java学习javajava学习java
运行总次数:0
代码可运行
准备工作

本文以实体类为Car对象进行统一分析处理,其对应的数据库中的表如下

 java中的Car对象如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @author 风轻云淡
 */
@Data
public class Car {
    /**
     * 包装类防止null问题
     */
    private Long id;

    private String carNum;

    private String brand;

    private Double guidePrice;

    private String produceTime;

    private String carType;

 
}
返回对象为pojo实体类(Car)

对应的接口 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    /**
     * 根据id查询
     * @param id
     * @return Car对象
     */
    Car selectById(Long id);

 对应的xml文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <select id="selectById" resultType="pojo.Car">
        select
               id as  id ,
               car_num as  carNum,
               brand as brand,
               guide_price as  guidePrice,
               car_type as  carType,
               produce_time as produceTime
        from t_car where id=#{id}
    </select>

 resultType我个人的理解就是我们查询sql语句返回的结构集的行的玩意,也就是一个记录

对应的测试代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @Test
    public void test01(){
        SqlSession session = SqlSessionUtil.openSession();
        CarMapper mapper = session.getMapper(CarMapper.class);
        Car car = mapper.selectById(3L);
        System.out.println(car);
    }
返回集合对象(List<Car>)

当查询的记录条数是多条的时候,必须使用集合接收。如果使用单个实体类接收会出现异常。如果返回的是一条记录可以用集合接收

 对应的接口 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    /**
     * 查询所有car
     * @return
     */
    List<Car> selectAll();

对应的xml文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <select id="selectAll" resultType="pojo.Car">
        select
                 id as  id ,
               car_num as  carNum,
               brand as brand,
               guide_price as  guidePrice,
               car_type as  carType,
               produce_time as produceTime
        from t_car
    </select>

 对应的测试代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @Test
    public void test02(){
        SqlSession session = SqlSessionUtil.openSession();
        CarMapper mapper = session.getMapper(CarMapper.class);
        List<Car> cars = mapper.selectAll();
        System.out.println(cars);
    }
返回Map

 当返回的数据,没有合适的实体类对应的话,可以采用Map集合接收。字段名做key,字段值做value。查询如果可以保证只有一条数据,则返回一个Map集合即可。

 对应的接口 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    /**
     * 通过id查询一条记录,返回Map集合
     * @param id
     * @return
     */
    Map<String, Object> selectByIdRetMap(Long id);

对应的xml文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <select id="selectByIdRetMap" resultType="map">
        select id,car_num carNum,brand,guide_price guidePrice,produce_time produceTime,car_type carType from t_car where id = #{id}
    </select>

resultMap="map",这是因为mybatis内置了很多别名。【参见mybatis开发手册】

 对应的测试代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @Test
    public void test03(){
        SqlSession session = SqlSessionUtil.openSession();
        CarMapper mapper = session.getMapper(CarMapper.class);
        Map<String, Object> map = mapper.selectByIdRetMap(3L);
        System.out.println(map);
    }

当然,如果返回一个Map集合,可以将Map集合放到List集合中吗?当然可以,这里就不再测试了。

反过来,如果返回的不是一条记录,是多条记录的话,只采用单个Map集合接收,这样同样会出现之前的异常:TooManyResultsException

返回List<Map>

查询结果条数大于等于1条数据,则可以返回一个存储Map集合的List集合。List<Map>等同于List<Car>

 对应的接口 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    /**
     * 查询所有的Car,返回一个List集合。List集合中存储的是Map集合。
     * @return
     */
    List<Map<String,Object>> selectAllRetListMap();

对应的xml文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <select id="selectAllRetListMap" resultType="map">
        select 
            id,car_num 
            carNum,brand,
            guide_price 
            guidePrice,
            produce_time 
            produceTime,car_type carType 
        from t_car
    </select>

 对应的测试代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @Test
    public void test04(){
        SqlSession session = SqlSessionUtil.openSession();
        CarMapper mapper = session.getMapper(CarMapper.class);
        List<Map<String, Object>> list = mapper.selectAllRetListMap();
        System.out.println(list);
    }

返回Map<String,Map> 

拿Car的id做key,以后取出对应的Map集合时更方便。

  对应的接口 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
     * 获取所有的Car,返回一个Map集合。
     * Map集合的key是Car的id。
     * Map集合的value是对应Car。
     * @return
     */
@MapKey("id")
Map<Long,Map<String,Object>> selectAllRetMap();

@MapKey("id")指定一个字段作为返回Map中的key,一般使用唯一键来做key 

对应的xml文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <select id="selectAllRetMap" resultType="map">
        select 
               id,
               car_num carNum,
               brand,
               guide_price guidePrice,
               produce_time produceTime,
               car_type carType 
        from t_car
    </select>

 对应的测试代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @Test
    public void test05(){
        SqlSession session = SqlSessionUtil.openSession();
        CarMapper mapper = session.getMapper(CarMapper.class);
        Map<Long, Map<String, Object>> map = mapper.selectAllRetMap();
        System.out.println(map);
    }
返回总记录条数

需求:查询总记录条数

  对应的接口 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
     * 获取总记录条数
     * @return
     */
Long selectTotal();

对应的xml文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--long是别名,可参考mybatis开发手册。-->
<select id="selectTotal" resultType="long">
  select count(*) from t_car
</select>

 对应的测试代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
public void testSelectTotal(){
    CarMapper carMapper = SqlSessionUtil.openSession().getMapper(CarMapper.class);
    Long total = carMapper.selectTotal();
    System.out.println(total);
}
要点 
  • (1)resultType 属性可以指定结果集的类型,它支持基本类型和实体类类型。我们在前面的 CRUD 案例中已经对此属性进行过应用了。
  • (2)需要注意的是,它和 parameterType 一样,如果注册过类型别名的,可以直接使用别名。没有注册过的必须使用全限定类名。例如:我们的实体类此时必须是全限定类名
  • (3)同时,当是实体类名称是,还有一个要求,实体类中的属性名称必须和查询语句中的列名保持一致,否则无法实现封装。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-09-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
3. 使用Mybatis完成CRUD
‍ 补充知识:什么是CRUD C: Create增 R: Retrieve查(检索) U: Update改 D: Delete删
捞月亮的小北
2024/06/12
930
3. 使用Mybatis完成CRUD
9. Mybatis 小技巧
如果一个包下的类太多,每个类都要起别名,会导致typeAlias标签配置较多,所以mybatis用提供package的配置方式,只需要指定包名,该包下的所有类都自动起别名,别名就是简类名。并且别名不区分大小写。
捞月亮的小北
2024/06/24
750
9. Mybatis 小技巧
MyBatis详解
在mybatis-config.xml文件中,可以通过以下配置进行MyBatis事务管理:<transactionManager type="JDBC/MANAGED" />
CODER-V
2023/03/04
2K0
MyBatis详解
一文解惑mybatis中的#{}和${}
#{}:先编译sql语句,再给占位符传值,底层是PreparedStatement实现。可以防止sql注入,比较常用。
一个风轻云淡
2023/10/15
8930
一文解惑mybatis中的#{}和${}
硬核手写简易mybatis框架
搭建这个简易的框架是为了加深对mybatis的理解,功能不是全部实现的(也没有能力),所以这个简易的框架的功能只支持表字段都为varchar,pojo为String类型的,而且本框架只支持JDBC事务管理器,只支持非池化,功能的话只实现了插入,查询(单个数据不支持多个)。
一个风轻云淡
2023/09/24
2400
一文带你打通mybatis缓存
缓存的作用:通过减少IO的方式,来提高程序的执行效率。MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。缓存可以极大的提升查询效率。
一个风轻云淡
2023/10/15
2710
一文带你打通mybatis缓存
手把手搭建mybatis入门程序
  创建Project:建议创建Empty Project,设置Java版本以及编译版本等。
一个风轻云淡
2023/10/15
1450
手把手搭建mybatis入门程序
2. Mybatis 入门程序
创建Maven项目并配置Maven , 根据以下步骤开始创建入门程序 其中 ,resource目录:放在这个目录当中的,一般都是资源文件,配置文件。直接放到resources目录下的资源,等同于放到了类的根路径下。
捞月亮的小北
2024/06/11
830
2. Mybatis 入门程序
mybatis多对一和一对多查询数据处理解读
MyBatis 的一对多、多对一,主要就是 resultMapresultMapresultMap 两个属性的使用,而一对多和多对一都是相互的,只是站的角度不同:
一个风轻云淡
2023/10/15
6790
mybatis多对一和一对多查询数据处理解读
4. MyBatis核心配置文件详解
如果类的根路径下有一个包叫做test,CarMapper.xml如果放在test包下的话,这个配置应该是这样写:
捞月亮的小北
2024/06/22
1030
4. MyBatis核心配置文件详解
JavaWeb-MyBatis(下)
之前介绍了MyBatis的快速入门以及Mapper代理开发,作为一款优秀的持久层框架,就不得不探讨一下MyBatis实现的增删改查功能了,而这也是我们学习的重点和核心所在。这次通过b站黑马的品牌数据增删改查案例,来学习MyBatis实现的增删改查功能,内容如下。
reload
2024/03/09
2490
JavaWeb-MyBatis(下)
8. Mybatis 接口代理机制及使用
基于以上原因,在编写测试类或实际应用中的DAO层代码时,推荐的做法是每次执行CRUD操作时,在方法内部创建SqlSession​对象,执行完必要的操作后,立即将其关闭。例如: public void testInsert(User user) { try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); mapper.insert(user); session.commit(); } catch (Exception e) { // 处理异常,可能需要回滚事务 } } 上述代码展示了在方法内部获取并使用SqlSession​的最佳实践,这样可以确保每次操作都独立于其他操作,避免了资源管理和并发问题。
捞月亮的小北
2024/06/24
1060
8. Mybatis 接口代理机制及使用
MyBatis 详细教程
MyBatis 目录树 [c2a2a099f5bc4982851a21b14b713195.png] tb_user.sql ```sql create database mybatis; use mybatis; drop table if exists tb_user; create table tb_user( id int primary key auto_increment, username varchar(20), password varchar(20), gender cha
ruochen
2022/03/08
2.3K0
MyBatis 详细教程
Java从入门到精通二十一(Mybatis框架)
框架就是一个软件的半成品,许多实现的细节都已经实现。主要的功能就是可以帮助我们减少繁琐重复的操作。 Mybatis就是用来简化JDBC的开发,简化一些繁琐的操作。
兰舟千帆
2022/07/16
4570
Java从入门到精通二十一(Mybatis框架)
MyBatis —— 参数处理
指定参数名,多个参数还是封装一个map,但是此时key 使用的是@Param注解指定的值通过#{指定的key} 从map中获取指定的参数值
桑鱼
2020/03/18
6620
10. Mybatis 参数处理
其中sql语句中的javaType,jdbcType,以及select标签中的parameterType属性,都是用来帮助mybatis进行类型确定的。不过这些配置多数是可以省略的。因为mybatis它有强大的自动类型推断机制。
捞月亮的小北
2024/06/25
930
10. Mybatis 参数处理
Mybatis | Mybatis学习笔记(下)
思考:我们在测试SQL的时候,要是能够在控制台输出 SQL 的话,是不是就能够有更快的排错效率?
啵啵鱼
2022/11/23
7160
Mybatis | Mybatis学习笔记(下)
MyBatis 学习笔记(2) 增删改查
实际开发中,我们经常遇到“ 插入自增列的主键后,还想要获得主键的值”,我们可以使用 useGeneratedKeys="true" keyProperty="id" 来实现。
张云飞Vir
2021/07/08
2770
MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射
在上一章中我们学习了《MyBatis学习总结(一)——ORM概要与MyBatis快速起步》,这一章主要是介绍MyBatis核心配置文件、使用接口+XML实现完整数据访问、输入参数映射与输出结果映射等内容。
张果
2018/10/09
1.4K0
MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射
Mybatis(三)增删改查
在前面写到的一些数据库操作中,所有的 参数都是已知的,但是在实际情况中,这些id等信息都是未知的,所以说用别的符号代替它,使用的时候直接换成id即可。在获取参数时有两个方法,分别是${}和#{} ,它们的区别如下:
麻辣醉虾
2022/04/04
6560
Mybatis(三)增删改查
相关推荐
3. 使用Mybatis完成CRUD
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文