首页 > 其他分享 >MyBatis使用四(查询详解)

MyBatis使用四(查询详解)

时间:2023-02-03 16:13:56浏览次数:64  
标签:username SelectUser 20 age 查询 详解 MyBatis password id

本文主要讲述如何在mybatis中进行查询操作【详解】

一. 查询User对象

  1.查询单个对象User

  SelectUser接口声明如下

// 主要条件是使用id
public interface SelectUser {

    // 查询单行数据,返回对象User
    User getUserSingleByID(@Param("id") int id);
}

  SelectUser.xml文件声明如下

<mapper namespace="com.hspedu.mapper.SelectUser">
<!--User getUserSingleByID(@Param("id") int id)--> <select id="getUserSingleByID" resultType="User"> select * from t_user where id = #{id}; </select> </mapper>

  2. 查询多个对象User

  SelectUser接口声明如下

// 主要条件是使用id
public interface SelectUser {

    // 查询多行数据,返回User类的集合【查询 >= id 的数据】
    List<User> getUserListByID(@Param("id") int id);
}

  SelectUser.xml文件声明如下

<mapper namespace="com.hspedu.mapper.SelectUser">

    <!--List<User> getUserListByID(@Param("id") int id)-->
    <select id="getUserListByID" resultType="User">
        select * from t_user where id >= #{id}
    </select>
</mapper>

  问题:当查询单个对象时,是否可以用List<User>作为返回类型?

  SelectUser接口声明如下

// 主要条件是使用id
public interface SelectUser {

    // 查询单行数据,返回对象User
    List<User> getUserSingleByID(@Param("id") int id);
}

  SelectUser.xml文件声明如下

<mapper namespace="com.hspedu.mapper.SelectUser">
    <!--User getUserSingleByID(@Param("id") int id)-->
    <select id="getUserSingleByID" resultType="User">
        select * from t_user where id = #{id};
    </select>
</mapper>

  测试test

    @Test
    // 使用id查询单个数据User
    public void selectUserByID(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectUser mapper = sqlSession.getMapper(SelectUser.class);
        List<User> user = mapper.getUserSingleByID(12);
        System.out.println(user);
        sqlSession.close();
    }

  测试结果如下

vip

   运行结果正常

  总结:当返回的数据对象不清楚有几个的情况,建议使用List<User>

二. 查询字段

  1.查询单个字段【单行】

  SelectUser接口声明如下

// 主要条件是使用id
public interface SelectUser {
    // 查询单个字段【单行】
    // 返回类型根据字段的类型而定,具体问题具体分析
    String getNameByID(@Param("id") int id);
}

  SelectUser.xml文件声明如下

<mapper namespace="com.hspedu.mapper.SelectUser">

    <!--String getNameByID(@Param("id") int id)-->
    <select id="getNameByID" resultType="string">
        select username from t_user where id = #{id}
    </select>
</mapper>

  注意:在SelectUser接口定义的方法 getNameByID() 的返回类型需要根据字段的类型来指明,或者直接使用Object。

  2. 查询单个字段【多行】

  SelectUser接口声明如下

public interface SelectUser {
    // 查询单个字段【多行】
    List<String> getNameRowsByID(@Param("id") int id);
}
    

  SelectUser.xml文件声明如下

<mapper namespace="com.hspedu.mapper.SelectUser">

    <!--List<String> getNameRowsByID(@Param("id") int id);-->
    <select id="getNameRowsByID" resultType="string">
        select username from t_user where id >= #{id}
    </select>
</mapper>

  与 一中查询多行数据类似,返回类型是List<字段类型或者Object>

  3. 查询多个字段【单行】

  SelectUser接口声明如下

// 主要条件是使用id
public interface SelectUser {

    // 查询多个字段【单行】
    // Map<String,Object> 中 key是字段名,value是属性值
    Map<String,Object> getColsByID(@Param("id") int id);
}

  SelectUser.xml文件声明如下

<mapper namespace="com.hspedu.mapper.SelectUser">

    <!--Map<String,Object> getColsByID(@Param("id") int id)-->
    <select id = "getColsByID" resultType="map">
        select username,password,age from t_user where id = #{id}
    </select>
</mapper>

  在SelectUser接口定义的方法返回类型是Map<String,Object>类型,

  Map<String,Object>的key是字段名,value是属性值,这里的Object用的巧妙

  4. 查询多个字段【多行】

  SelectUser接口声明如下

public interface SelectUser {
    // 查询多个字段【多行】
    // 此时不能使用 Map<String,Object> 作为返回类型,数据不止一条
    // 方式1:使用List<Map<>>
    List<Map<String,Object>> getClosRowsByID(@Param("id") int id);
    // 方式2:使用@MapKey("字段名") 查出的结果 Map<Map<>>
    //      @MapKey("字段名"),key是字段名【唯一标志该行数据】value是该行数据
    //      此时在xml文件,查询字段必须要包含唯一标识id
    @MapKey("id")
    // Map<String,Object> getMapsByID(@Param("id") int id);
    Map<Integer,Object> getMapsByID(@Param("id") int id);
}

  SelectUser.xml文件声明如下

<mapper namespace="com.hspedu.mapper.SelectUser">
  <!--方式1:使用List<Map<>> -->
    <!--Map<String,Object> getClosRowsByID(@Param("id") int id);-->
    <select id="getClosRowsByID" resultType="map">
        select username,password,age from t_user where id >= #{id}
    </select>

  <!--方式2:使用@MapKey注解 -->
    <!--@MapKey("id")
    Map<String,Object> getMapsByID(@Param("id") int id);-->
    <select id="getMapsByID" resultType="map">
        select id,username,password,age from t_user where id >= #{id}
    </select>

</mapper>

  方式1:测试test

    @Test
    // 根据id查询多个字段【多行】方式一:
    public void selectColsRowsByID(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectUser mapper = sqlSession.getMapper(SelectUser.class);
        List<Map<String, Object>> mapList = mapper.getClosRowsByID(6);
        // 遍历集合
        for (Map<String, Object> map : mapList) {
            System.out.println(map);
        }
        sqlSession.close();
    }

  测试结果如下

{password=tom123, age=20, username=Tom}
{password=tom123, age=20, username=Tom}
{password=tom123, age=20, username=Tom}
{password=tom12345, age=20, username=jack}
{password=hsp12345, age=25, username=hsp}
{password=tom123, age=20, username=Tom}
{password=tom123, age=20, username=Tom}
{password=tom123, age=20, username=Tom}
{password=hsp12345, age=25, username=hsp}

  方式2:测试test

    @Test
    // 根据id查询多个字段【多行】方式二:
    public void selectMapsByID(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectUser mapper = sqlSession.getMapper(SelectUser.class);
        Map<Integer, Object> maps = mapper.getMapsByID(6);
        // 遍历map,注意此时map的结构 Map<id=Map,id=Map...>
        Set<Integer> keySet = maps.keySet();
        //  java.lang.Integer cannot be cast to java.lang.String
        // [16, 6, 9, 10, 11, 12, 13, 14, 15]
        // id的字段类型: class java.lang.Integer.
        // 因此需要将Map<String,Object> 变成Map<Integer,Object>
        for (Integer s : keySet) {
            System.out.println(maps.get(s));
        }
        sqlSession.close();
    }

  测试结果如下

{password=hsp12345, id=16, age=25, username=hsp}
{password=tom123, id=6, age=20, username=Tom}
{password=tom123, id=9, age=20, username=Tom}
{password=tom123, id=10, age=20, username=Tom}
{password=tom12345, id=11, age=20, username=jack}
{password=hsp12345, id=12, age=25, username=hsp}
{password=tom123, id=13, age=20, username=Tom}
{password=tom123, id=14, age=20, username=Tom}
{password=tom123, id=15, age=20, username=Tom}

  注意方式1和方式2的区别

  方式1的返回类型是List<Map>,即 将查询到的每行结果 --存放-->Map<String,Object> ---封装--> List<Map<String,Object>>。

    List<Map<>>的结构如下

[{password=tom123, age=20, username=Tom},{password=tom123, age=20, username=Tom}, 
{password=tom123, age=20, username=Tom}, 
{password=tom12345, age=20, username=jack}, 
{password=hsp12345, age=25, username=hsp}, 
{password=tom123, age=20, username=Tom}, 
{password=tom123, age=20, username=Tom}, 
{password=tom123, age=20, username=Tom}, 
{password=hsp12345, age=25, username=hsp}]

  方式2是通过注解@MapKey("字段名"),注意这里的字段名是作为每行数据value的key【因此应该选择能够唯一标识某一行数据的字段名作为每行数据的key】。

    Map< " 字段名的值 " = Map<>>的结构如下

{16={password=hsp12345, id=16, age=25, username=hsp},
 6={password=tom123, id=6, age=20, username=Tom}, 
9={password=tom123, id=9, age=20, username=Tom}, 
10={password=tom123, id=10, age=20, username=Tom},
 11={password=tom12345, id=11, age=20, username=jack},
 12={password=hsp12345, id=12, age=25, username=hsp},
 13={password=tom123, id=13, age=20, username=Tom}, 
14={password=tom123, id=14, age=20, username=Tom}, 
15={password=tom123, id=15, age=20, username=Tom}}

 

标签:username,SelectUser,20,age,查询,详解,MyBatis,password,id
From: https://www.cnblogs.com/zwgitOne123/p/17089580.html

相关文章

  • 根据ip查询归属地工具类
    publicstaticStringgetAddrByIp(Stringip){if(StrUtil.isBlank(ip)){returnnull;}Stringurl="https://api01.aliyun.venuscn.com/ip?ip="+......
  • JavaScript函数详解:匿名函数、具名函数、函数传参、不定参、返回值、JS预解析机制
     JavaScript函数详解:匿名函数、具名函数、函数传参、不定参、返回值、JS预解析机制  1.具名函数 定义: 调用:方式1:方法名();可以多次调用  ......
  • linux查询磁盘是否做raid
    1、查看是否安装mdadm包rpm-qa|grepmdadm2、查看磁盘是否做了raidmdadm-E/dev/sd[bcde]1#可以忽略/dev/sda,一般都是用作系统盘mdadm:Nomdsuperblockdetectedon/d......
  • C++ 哈希表查询_进入哈希函数结界的世界
    1.前言哈希表或称为散列表,是一种常见的、使用频率非常高的数据存储方案。哈希表属于抽象数据结构,需要开发者按哈希表数据结构的存储要求进行API定制,对于大部分高级语言......
  • mybatis
    Mybatis练习Mybatis1、创建数据库、导入数据CREATEDATABASE`mybatis`;USE`mybatis`;DROPTABLEIFEXISTS`user`;CREATETABLE`user`(`id`int(20)NOTN......
  • 笔记:海量数据的查询方法
    概述:每年大约有几千万近一亿的业务数据量,如何提高查询性能。具体方案:在表结构初始化阶段时,需要添加查询条件的索引;并且可以使用uuid主键和数字主键的联合业务主键,根据......
  • Asp.net中GridView使用详解
     l         GridView无代码分页排序l         GridView选中,编辑,取消,删除l         GridView正反双向排序l         GridView和......
  • inline内联函数详解
    这几天看题解一直遇到inline所以学习总结一下1、C++inline内联函数(1)引入inline关键字的原因:在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入......
  • Oracle Business Intelligence Enterprise Edition(DataModel详解)
    数据模型编辑器数据模型编辑器使您能够将来自多个数据集的数据合并到单个XML数据结构中。来自多个数据源的数据集可以合并为顺序XML,也可以在行级别合并,以创建单个组......
  • springcloud:接口文档自动生成器swagger详解 上篇(十一)
    0.引言在微服务的开发工作中,前后端的协同开发是必不可少的,随着服务数与接口数的增加,手写接口文档成为了一个苦活累活,很多程序员对此也很抵触。同时我们也需要有一个地方来......