Mybatis查询数据

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

如果您需要对上面的内容进行了解,可以参考Mybatis引入与使用https://blog.csdn.net/m1729339749/article/details/132457971

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

一、准备数据

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

sql 复制代码
-- 如果数据库不存在则创建数据库
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()方法

java 复制代码
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 复制代码
<?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文件中配置完成后才能生效;

bash 复制代码
<?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配置文件的位置。

五、查询一条数据

java 复制代码
// 读取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语句中的参数

测试:

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

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

六、查询数据列表

java 复制代码
// 读取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查询数据列表,由于没有使用到参数,所以没有传递任何参数

测试:

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

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

相关推荐
弹简特26 分钟前
【Java项目-企悦抽】11-用户与认证模块-实现用户登录03(结束登录功能)-完成测试+对接前端+登录拦截器
java·开发语言
大模型丫丫1 小时前
Loop Engineering:从强化学习视角看 Agent 循环的本质
java·人工智能·学习
数电发票API1 小时前
税局接口,需要的来~~
java
骇客野人1 小时前
IntelliJ IDEA 使用技巧
java·ide·intellij-idea
Jul1en_2 小时前
【Java 脚手架】封装通用工具类-1
java·spring boot·分布式·spring·spring cloud
我命由我123452 小时前
Java 开发 - List subList 方法
java·windows·操作系统·list·intellij-idea·idea·intellij idea
关于不上作者榜就原神启动那件事2 小时前
从 MDC 到 Agent:我手搓的文档路由协议,在 Spring AI Alibaba 里找到了正式实现
java·人工智能·spring·ai·agent
亦暖筑序2 小时前
重新认识 AgentScope-Java 2.0:ReActAgent 负责推理,HarnessAgent 负责运行
java·后端·agent
木井巳3 小时前
【DFS解决floodfill算法】岛屿的最大面积
java·算法·leetcode·深度优先
运维大师3 小时前
【K8S 运维实战】34-多集群管理Karmada
java·运维·kubernetes