MyBatis如何实现从数据库中查询指定表的数据?

MyBatis 是一款优秀的持久层框架,它简化了 Java 应用程序与数据库之间的交互过程,通过 MyBatis,开发者可以更高效地执行数据库查询操作,尤其是针对数据库表的查询,本文将详细介绍如何使用 MyBatis 查询数据库中的表,涵盖核心配置、映射文件编写、SQL 语句构建以及结果集处理等关键环节。

MyBatis如何实现从数据库中查询指定表的数据?

MyBatis 核心组件

在使用 MyBatis 进行数据库表查询前,需先理解其核心组件的作用:

  1. SqlSessionFactory:负责创建 SqlSession 实例,是 MyBatis 操作的入口点。
  2. SqlSession:代表一次数据库会话,用于执行 SQL 语句、管理事务等。
  3. Mapper 接口:定义数据访问方法,无需实现类,MyBatis 会自动生成代理对象。
  4. XML 映射文件:包含 SQL 语句、参数映射和结果集映射规则。

环境准备与基础配置

引入依赖

在 Maven 项目中添加 MyBatis 和数据库驱动依赖(以 MySQL 为例):

<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.10</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.28</version>
    </dependency>
</dependencies>

配置 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="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test_db?useSSL=false&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!-- 扫描 Mapper 接口或 XML 文件 -->
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

编写 Mapper 接口与映射文件

定义 Mapper 接口

创建接口 UserMapper.java,声明查询方法:

package com.example.mapper;
public interface UserMapper {
    List<User> selectAllUsers();
}

编写 XML 映射文件

在 resources 目录下创建对应路径的 XML 文件 UserMapper.xml,编写 SQL 语句:

MyBatis如何实现从数据库中查询指定表的数据?

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
    <!-- 查询所有用户 -->
    <select id="selectAllUsers" resultType="com.example.entity.User">
        SELECT id, username, email FROM user_table
    </select>
</mapper>
  • namespace:必须与 Mapper 接口全限定名一致。
  • id:与方法名对应,唯一标识该 SQL 语句。
  • resultType:指定返回结果的 POJO 类全限定名。

执行查询操作

构建 SqlSessionFactory

通过 SqlSessionFactoryBuilder 加载配置文件,获取工厂实例:

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

获取 SqlSession 并调用方法

try (SqlSession session = sqlSessionFactory.openSession()) {
    UserMapper mapper = session.getMapper(UserMapper.class);
    List<User> users = mapper.selectAllUsers();
    for (User user : users) {
        System.out.println(user.getUsername());
    }
}

高级查询场景示例

条件查询(动态 SQL)

当需要根据条件筛选数据时,可使用 <if> 标签动态拼接 SQL:

<select id="selectUsersByCondition" parameterType="map" resultType="User">
    SELECT * FROM user_table WHERE 1=1
    <if test="username != null and username != ''">
        AND username LIKE CONCAT('%', #{username}, '%')
    </if>
    <if test="email != null and email != ''">
        AND email = #{email}
    </if>
</select>

调用时传入参数 Map:

Map<String, Object> params = new HashMap<>();
params.put("username", "admin");
List<User> users = mapper.selectUsersByCondition(params);

分页查询

结合 RowBounds 或插件(如 PageHelper)实现分页:

// 使用 RowBounds(内存分页,不推荐大数据量)
RowBounds rowBounds = new RowBounds(0, 10); // 起始位置,每页数量
List<User> users = session.selectList("com.example.mapper.UserMapper.selectAllUsers", null, rowBounds);
// 使用 PageHelper 插件(物理分页)
PageHelper.startPage(1, 10);
List<User> users = mapper.selectAllUsers();

结果集映射细节

若表字段与实体类属性名不一致,可通过 <result> 手动映射:

MyBatis如何实现从数据库中查询指定表的数据?

<select id="selectUserById" parameterType="int" resultMap="userResultMap">
    SELECT id, user_name AS username, email FROM user_table WHERE id = #{id}
</select>
<resultMap id="userResultMap" type="User">
    <id column="id" property="id"/>
    <result column="user_name" property="username"/>
    <result column="email" property="email"/>
</resultMap>

相关问答 FAQs

Q1:为什么执行查询时报错“Mapped Statements collection does not contain value for …”?
A:通常是因为 Mapper 接口与 XML 文件的 namespace 不匹配,或 XML 文件未正确注册到 mybatis-config.xml 的 <mappers> 中,请检查 namespace 是否与接口全限定名一致,且 XML 文件路径是否正确配置。

Q2:如何优化大数据量查询的性能?
A:1. 避免使用 SELECT *,仅查询必要字段;2. 对查询条件列建立索引;3. 使用分页技术(如 PageHelper)减少单次查询数据量;4. 考虑缓存机制(如 MyBatis 一级/二级缓存);5. 对于复杂查询,可拆分为多个简单查询或使用关联查询优化。

【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!

(0)
热舞的头像热舞
上一篇 2025-10-22 00:21
下一篇 2025-10-22 00:27

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

广告合作

QQ:14239236

在线咨询: QQ交谈

邮件:asy@cxas.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信