【MyBatis】学习笔记06:各种查询所返回数据的数据类型

简介: 【MyBatis】学习笔记06:各种查询所返回数据的数据类型

【总结】

1.查询出的数据只有一条:

(1)可以通过实体类对象接收

(2)可以通过List集合接收(Eg1)

(3)可以通过map接收(Eg4)

2.若查询的数据有多条:

(1)可以通过List集合接收(Eg2)

(2)可以通过map类型的List集合接收(Eg5(1))

(3)可以在mapper接口的方法上添加@MapKey注解,此时就可以将每条数据转为map集合作为值,以某个字段的值作为键,放在同一个map集合里面。(Eg5(2))

(注意)|(一定不能通过实体类对象接收,否则会抛出异常TooManyResultsException)

准备


(1)创建接口

q3.png

(2)创建对应的映射文件

q2.png

q1.png

查询一个实体类对象

//SelectMapper 接口
public interface SelectMapper {
    /**
     * 查询用户信息
     * @param id 用户id
     * @return 用户对象
     */
    User getUserById(Integer id);
}
<!--    User getUserById(Integer id);-->
    <select id="getUserById" resultType="User">
        select * from  t_users where id= #{id}
    </select>
@Test
    public void getUserById(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        User result  = mapper.getUserById(4);
        System.out.println(result);
    }

cc.mllt.sky.utils.SqlSessionUtils.java

package cc.mllt.sky.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class SqlSessionUtils {
    public  static SqlSession getSqlSession(){
        SqlSession sqlSession = null;
        try{
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory sqlSessionFactory  = new SqlSessionFactoryBuilder().build(is);
            sqlSession  = sqlSessionFactory.openSession(true);
        }catch (IOException e){
            e.printStackTrace();
        }
        return sqlSession;
    }
}

查询返回一个List集合

Eg1:查询出的数据只有一条

//SelectMapper 接口
public interface SelectMapper {
    /**
     * 查询用户信息
     * @param id 用户id
     * @return 用户对象
     */
    List<User> getUserById(Integer id);
}
<!--    User getUserById(Integer id);-->
    <select id="getUserById" resultType="User">
        select * from  t_users where id= #{id}
    </select>
@Test
    public void getUserById(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        List<User> result  = mapper.getUserById(4);
        System.out.println(result);
    }

Eg2:查询出的数据有多条

//SelectMapper 接口
    /**
     * 查询所有用户
     * @return List<User>
     */
    List<User> getUsers();
<!--    List<User> getUsers();-->
    <select id="getUsers" resultType="User">
        select * from  t_users
    </select>
@Test
    public void getUsers(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        List<User> result  = mapper.getUsers();
        System.out.println(result);
    }

其他返回数据类型(补充:MyBatis类型别名)

Eg3:返回数据为一行一列

//SelectMapper 接口
    /**
     * 查询用户表行数
     * @return Integer
     */
    Integer getCount();
<!--    Integer getCount();-->
    <select id="getCount" resultType="java.lang.Integer">
        select count(*) from t_users
    </select>

resultType中填写IntegerintegerintInt_int都不会报错

原因在 官方手册Configuration XML > typeAliases(类型别名)

因为MyBatis中设置默认的类型别名

Alias Mapped Type
_int int
int Integer
integer Integer

Alias:别名

Mapped Type:映射地址


java.lang.Integer --> int , Integer

int --> _int , _integer

Map --> map

String --> string

@Test
    public void getCount(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        Integer result  = mapper.getCount();
        System.out.println(result);
    }

Eg4:返回一条数据 返回数据类型为Map集合

//SelectMapper 接口
    /**
     * 根据用户id获取Map类型的信息
     * @param id 用户id
     * @return Map类型用户信息 Map<String,Object>
     */
    Map<String,Object> getUserByIdToMap(@Param("id") Integer id);
<!--    Map<String,Object> getUserByIdToMap(@Param("id") Integer id);-->
    <select id="getUserByIdToMap" resultType="map">
        select * from t_users where userId= #{id}
    </select>
@Test
   public void getUserByIdToMap(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        Map<String, Object> result  = mapper.getUserByIdToMap(4);
        System.out.println(result);
    }

获得的map集合结果以字段为键

输出结果如下

{userPassword=123456改了密码, userCount=test001, userGrade=1, userRegDate=2022-03-01T00:00, userName=测试用户改了名, userId=4, userBlance=0}

Eg5:返回多条数据 返回数据类型为map集合

(1)方式1: 将多个Map放在List中

//SelectMapper 接口
    /**
     * 获取所有用户信息
     * @return Map类型用户信息 Map<String,Object>
     */
    List<Map<String,Object>> getusersToMap();
}
<!--    Map<String,Object> getusersToMap();-->
    <select id="getusersToMap" resultType="map">
        select * from t_users
    </select>
@Test
    public void getUsersToMap(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        List<Map<String, Object>> result  = mapper.getusersToMap();
        System.out.println(result);
    }

(2)方式2: @MapKey()注解

//SelectMapper 接口
    /**
     * 获取所有用户信息
     * @return Map类型用户信息 Map<String,Object>
     */
    @MapKey("userId")//MySQl中字段名,最好为key
    Map<String,Object> getusersToMap();
<!--    Map<String,Object> getusersToMap();-->
    <select id="getusersToMap" resultType="map">
        select * from t_users
    </select>
@Test
    public void getUsersToMap(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
//        List<Map<String, Object>> result  = mapper.getusersToMap();
        Map<String, Object> result  = mapper.getusersToMap();
        System.out.println(result);
    }

输出结果如下

{1={userPassword=qq2686485465, userCount=mllt9920, userGrade=999, userRegDate=2022-03-20T00:00, userName=萌狼蓝天, userId=1, userBlance=100000000}, 2={userPassword=134679852, userCount=xrilang, userGrade=888, userRegDate=2022-03-25T00:00, userName=向日狼, userId=2, userBlance=10240000}, 4={userPassword=123456改了密码, userCount=test001, userGrade=1, userRegDate=2022-03-01T00:00, userName=测试用户改了名, userId=4, userBlance=0}, 5={userPassword=123, userCount=mllt@xrilang.com, userGrade=0, userName=张三, userId=5, userBlance=0}}
相关文章
|
8天前
|
Java 数据库连接 数据库
mybatis查询数据,返回的对象少了一个字段
mybatis查询数据,返回的对象少了一个字段
36 8
|
9天前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
2月前
|
Java 数据库连接 测试技术
SpringBoot 3.3.2 + ShardingSphere 5.5 + Mybatis-plus:轻松搞定数据加解密,支持字段级!
【8月更文挑战第30天】在数据驱动的时代,数据的安全性显得尤为重要。特别是在涉及用户隐私或敏感信息的应用中,如何确保数据在存储和传输过程中的安全性成为了开发者必须面对的问题。今天,我们将围绕SpringBoot 3.3.2、ShardingSphere 5.5以及Mybatis-plus的组合,探讨如何轻松实现数据的字段级加解密,为数据安全保驾护航。
94 1
|
2月前
|
SQL 关系型数据库 MySQL
解决:Mybatis-plus向数据库插入数据的时候 报You have an error in your SQL syntax
该博客文章讨论了在使用Mybatis-Plus向数据库插入数据时遇到的一个常见问题:SQL语法错误。作者发现错误是由于数据库字段中使用了MySQL的关键字,导致SQL语句执行失败。解决方法是将这些关键字替换为其他字段名称,以避免语法错误。文章通过截图展示了具体的操作步骤。
|
2月前
|
SQL Java 关系型数据库
MyBatis-Plus 分页魅力绽放!紧跟技术热点,带你领略数据分页的高效与便捷
【8月更文挑战第29天】在 Java 开发中,数据处理至关重要,尤其在大量数据查询与展示时,分页功能尤为重要。MyBatis-Plus 作为一款强大的持久层框架,提供了便捷高效的分页解决方案。通过封装数据库分页查询语句,开发者能轻松实现分页功能。在实际应用中,只需创建 `Page` 对象并设置页码和每页条数,再通过 `QueryWrapper` 构建查询条件,调用 `selectPage` 方法即可完成分页查询。MyBatis-Plus 不仅生成分页 SQL 语句,还自动处理参数合法性检查,并支持条件查询和排序等功能,极大地提升了系统性能和稳定性。
38 0
|
2月前
|
存储 SQL Java
MyBatis batchInsert 批量插入数据
MyBatis batchInsert 批量插入数据
48 0
|
2月前
|
前端开发 JavaScript Java
解决springboot+vue+mybatis中,将后台数据分页显示在前台,并且根据页码自动跳转对应页码信息
该博客文章讲述了如何在Spring Boot + Vue + MyBatis的项目中实现后台数据的分页查询,并在前端进行显示和页码跳转,包括后端的分页查询实现、前端与后端的交互以及使用Element UI进行分页展示的方法。
|
3月前
|
Java 数据库连接 mybatis
Mybatis查询传递单个参数和传递多个参数用法
Mybatis查询传递单个参数和传递多个参数用法
53 11
MyBatisPlus如何根据id批量查询?Required request parameter ‘id‘ for method 解决方法是看青戈大佬MybatisPlus的教程
MyBatisPlus如何根据id批量查询?Required request parameter ‘id‘ for method 解决方法是看青戈大佬MybatisPlus的教程
|
22天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)