3

MyBatis的使用四(查询详解) - zwGitOne

 1 year ago
source link: https://www.cnblogs.com/zwgitOne123/p/17089580.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

本文主要讲述如何在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}}

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK