Mybatis查询数据的项目实现

 更新时间:2023年09月08日 10:40:28   作者:Mointor  
MyBatis通过XML配置文件或注解,把Java对象映射到对应的数据库表中,实现对象关系和数据关系的互相转换,从而使得Java应用程序能够更简单的操作和读取数据库,本文就详细的介绍一下如何实现,感兴趣的可以了解一下

上一篇我们介绍了在pom文件中引入mybatis依赖,配置了mybatis配置文件,通过读取配置文件创建了会话工厂,使用会话工厂创建会话获取连接对象读取到了数据库的基本信息。

如果您需要对上面的内容进行了解,可以参考Mybatis引入与使用

 本篇我们在上一篇的基础上了解如果使用mybatis查询数据:

一、准备数据

这里我们直接使用脚本初始化数据库中的数据

-- 如果数据库不存在则创建数据库
CREATE DATABASE IF NOT EXISTS demo DEFAULT CHARSET utf8;
-- 切换数据库
USE demo;
-- 创建用户表
CREATE TABLE IF NOT EXISTS T_USER(
  ID INT PRIMARY KEY,
  USERNAME VARCHAR(32) NOT NULL,
  AGE INT NOT NULL 
);
-- 插入用户数据
INSERT INTO T_USER(ID, USERNAME, AGE)
VALUES(1, '张三', 20),(2, '李四', 22),(3, '王五', 24);

创建了一个名称为demo的数据库;并在库里创建了名称为T_USER的用户表并向表中插入了数据

二、创建用户实体类

在cn.horse.demo2包下创建UserInfo实体类,为了方便打印用户的信息这里重写了ToString()方法

package cn.horse.demo2;
public class UserInfo {
    private int id;
    private String username;
    private int age;
    @Override
    public String toString() {
        StringBuilder result = new StringBuilder();
        result.append('[');
        result.append("id: " + this.id);
        result.append(", ");
        result.append("username: " + this.username);
        result.append(", ");
        result.append("age: " + this.age);
        result.append(']');
        return result.toString();
    }
}

三、配置Mapper文件

这里我在resources下创建了一个demo2的目录,并在目录下创建了一个UserInfoMapper.xml的配置文件。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="UserInfoMapper">
    <select id="findById" resultType="cn.horse.demo2.UserInfo">
        SELECT *
        FROM T_USER
        WHERE ID = #{id}
    </select>
    <select id="findAll" resultType="cn.horse.demo2.UserInfo">
        SELECT *
        FROM T_USER
    </select>
</mapper>
  • namespace代表的是名称空间;如果有多个Mapper配置文件,名称空间不允许重复
  • select查询标签;
    • id代表的是编号,同一个名称空间下编号不允许重复;
    • resultType代表的是结果类型,指将数据库查询出来的数据转换成结果类型对象,转换的前提是结果类型需要提供无参数的构造方法(用于创建结果类型对象),数据库中的列需要与结果类型中的字段一一对应(使用反射的方式进行对象中字段的赋值),否则无法创建结果类型对象或者无法将数据绑定到结果类型对象的字段上。
    • 标签内容是SQL语句,代表使用ID查询用户信息,其中#{id}是参数;在执行当前查询语句时需要携带此参数。

四、引入Mapper配置

Mapper配置完成后,并没有生效;需要在mybatis-config.xml文件中配置完成后才能生效;

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="jdbc:mysql://${ip}:${port}/${database}?useUnicode=true&amp;useSSL=false&amp;characterEncoding=utf8"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="demo2/UserInfoMapper.xml" />
    </mappers>
</configuration>

其中mapper标签是我们引入的配置,resource用于指向Mapper配置文件的位置。

五、查询一条数据

// 读取mybatis配置文件
InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml");
// 根据配置创建SqlSession工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
        .build(inputStream);
SqlSession sqlSession = null;
try {
    // 创建SqlSession
    sqlSession = sqlSessionFactory.openSession();
    // 根据用户编号查询一条用户信息
    UserInfo userInfo = sqlSession.selectOne("UserInfoMapper.findById", 2);
    System.out.println(userInfo);
} finally {
    // 关闭会话
    if(Objects.nonNull(sqlSession)) {
        sqlSession.close();
    }
}

代码中我们使用selectOne查询一条数据:

第一个参数代表的是语句,其实就是【名称空间.编号】,根据名称空间和编号可以找到我们在Mapper配置文件中配置的SQL语句

第二个参数代表的是参数值,用于解析SQL语句中的参数

测试:

执行上面代码的结果如下:

 查询的结果与我们库中的数据一致。

六、查询数据列表

// 读取mybatis配置文件
InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml");
// 根据配置创建SqlSession工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
        .build(inputStream);
SqlSession sqlSession = null;
try {
    // 创建SqlSession
    sqlSession = sqlSessionFactory.openSession();
    // 查询数据列表
    List<UserInfo> userInfoList = sqlSession.selectList("UserInfoMapper.findAll");
    for (UserInfo userInfo: userInfoList) {
        System.out.println(userInfo);
    }
} finally {
    // 关闭会话
    if(Objects.nonNull(sqlSession)) {
        sqlSession.close();
    }
}

代码中我们使用selectList查询数据列表,由于没有使用到参数,所以没有传递任何参数

测试:

执行上面代码的结果如下:

查询的结果与我们库中的数据一致。

七、查询数据Map

// 读取mybatis配置文件
InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml");
// 根据配置创建SqlSession工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
        .build(inputStream);
SqlSession sqlSession = null;
try {
    // 创建SqlSession
    sqlSession = sqlSessionFactory.openSession();
    // 查询数据列表
    Map<Integer, UserInfo> userInfoMap = sqlSession.selectMap("UserInfoMapper.findAll", "id");
    for (Map.Entry<Integer, UserInfo> entry: userInfoMap.entrySet()) {
        System.out.println(entry.getKey() + " -> " + entry.getValue());
    }
} finally {
    // 关闭会话
    if(Objects.nonNull(sqlSession)) {
        sqlSession.close();
    }
}

代码中我们使用selectMap查询数据Map,这里需要指定哪个字段作为Map的Key,这里我是用id字段作为Map的Key;这样可以直接得到用户编号到用户对象的Map集合。

需要注意的是Map的Key字段来源于返回类型中的字段而不是数据库中表的列字段

测试:

执行上面代码的结果如下:

查询的结果与我们库中的数据一致。

八、使用结果处理器查询数据

// 读取mybatis配置文件
InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml");
// 根据配置创建SqlSession工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
        .build(inputStream);
SqlSession sqlSession = null;
try {
    // 创建SqlSession
    sqlSession = sqlSessionFactory.openSession();
    // 查询数据列表
    sqlSession.select("UserInfoMapper.findAll", new ResultHandler<UserInfo>() {
        @Override
        public void handleResult(ResultContext<? extends UserInfo> resultContext) {
            System.out.println(resultContext.getResultObject());
        }
    });
} finally {
    // 关闭会话
    if(Objects.nonNull(sqlSession)) {
        sqlSession.close();
    }
}

代码中我们使用select查询数据,此方法没有返回值,而是使用ResultHandler匿名内部类直接对每条数据进行处理

测试:

执行上面代码的结果如下:

查询的结果与我们库中的数据一致。

九、使用游标查询数据

// 读取mybatis配置文件
InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml");
// 根据配置创建SqlSession工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
        .build(inputStream);
SqlSession sqlSession = null;
Cursor<UserInfo> cursor = null;
try {
    // 创建SqlSession
    sqlSession = sqlSessionFactory.openSession();
    // 查询数据列表
    cursor = sqlSession.selectCursor("UserInfoMapper.findAll");
    for (Iterator<UserInfo> it = cursor.iterator(); it.hasNext();) {
        System.out.println(it.next());
    }
} finally {
    // 关闭游标
    if(Objects.nonNull(cursor)) {
        try {
            cursor.close();
        } catch (IOException e) { }
    }
    // 关闭会话
    if(Objects.nonNull(sqlSession)) {
        sqlSession.close();
    }
}

代码中我们使用selectCursor查询数据,此方法返回一个游标对象,使用迭代器获取数据列表。

需要注意的是游标对象需要关闭

测试:

执行上面代码的结果如下:

查询的结果与我们库中的数据一致。

到此这篇关于Mybatis查询数据的项目实践的文章就介绍到这了,更多相关Mybatis查询数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅析Java 对象引用和对象本身

    浅析Java 对象引用和对象本身

    这篇文章主要介绍了Java 对象引用和对象本身的相关资料,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-08-08
  • Sentinel结合Nacos实现数据持久化过程详解

    Sentinel结合Nacos实现数据持久化过程详解

    这篇文章主要介绍了Sentinel结合Nacos实现数据持久化过程,要持久化的原因是因为每次启动Sentinel都会使之前配置的规则就清空了,这样每次都要再去设定规则显得非常的麻烦,感兴趣想要详细了解可以参考下文
    2023-05-05
  • 一篇文章带你入门Java数据类型

    一篇文章带你入门Java数据类型

    下面小编就为大家带来一篇Java的基本数据类型)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-08-08
  • SpringBoot整合Mybatis-plus实现多级评论功能

    SpringBoot整合Mybatis-plus实现多级评论功能

    本文介绍了如何使用SpringBoot整合Mybatis-plus实现多级评论功能,同时提供了数据库的设计和详细的后端代码,前端界面使用的Vue2,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-05-05
  • SpringBoot使用Sa-Token实现权限认证

    SpringBoot使用Sa-Token实现权限认证

    本文主要介绍了SpringBoot使用Sa-Token实现权限认证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Struts2返回json格式数据代码实例

    Struts2返回json格式数据代码实例

    这篇文章主要介绍了Struts2返回json格式数据代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Spring boot基于ScheduledFuture实现定时任务

    Spring boot基于ScheduledFuture实现定时任务

    这篇文章主要介绍了Spring boot基于ScheduledFuture实现定时任务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 基于spring+quartz的分布式定时任务框架实现

    基于spring+quartz的分布式定时任务框架实现

    在Spring中的定时任务功能,最好的办法当然是使用Quartz来实现。这篇文章主要介绍了基于spring+quartz的分布式定时任务框架实现,有兴趣的可以了解一下。
    2017-01-01
  • 一文详解Lombok中@ToString()的使用技巧

    一文详解Lombok中@ToString()的使用技巧

    在平时我们工作的时候,我们经常会使用toString() 方法来输出一个对象的一些属性信息。Lombok 给我们提供了一个自动生成 toString()代码的注解,可以减少代码行数,本文就来和大家详细聊聊吧
    2023-02-02
  • Spring之SseEmitter实现让你的进度条实时更新

    Spring之SseEmitter实现让你的进度条实时更新

    Spring SseEmitter是一种实现服务器端推送事件(SSE)的机制,支持单向通信,适用于实时数据传输需求,通过代码示例和应用场景分析,展示了如何在服务端和客户端使用SseEmitter进行实时数据推送
    2025-02-02

最新评论