MyBatis 是一款优秀的持久层框架,它简化了 Java 应用程序与数据库之间的交互过程,通过 MyBatis,开发者可以更高效地执行数据库查询操作,尤其是针对数据库表的查询,本文将详细介绍如何使用 MyBatis 查询数据库中的表,涵盖核心配置、映射文件编写、SQL 语句构建以及结果集处理等关键环节。
MyBatis 核心组件
在使用 MyBatis 进行数据库表查询前,需先理解其核心组件的作用:
- SqlSessionFactory:负责创建 SqlSession 实例,是 MyBatis 操作的入口点。
- SqlSession:代表一次数据库会话,用于执行 SQL 语句、管理事务等。
- Mapper 接口:定义数据访问方法,无需实现类,MyBatis 会自动生成代理对象。
- 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&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 语句:
<?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>
手动映射:
<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. 对于复杂查询,可拆分为多个简单查询或使用关联查询优化。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复