Loading... ### Spring 和 MyBatis 的各种查询 Spring 和 MyBatis 是 Java 开发中广泛使用的两个框架。Spring 提供了全面的基础设施支持,而 MyBatis 是一个优秀的持久层框架,两者结合能够简化数据访问层的开发。本文将详细介绍如何在 Spring 中使用 MyBatis 进行各种查询操作,包括简单查询、条件查询、分页查询、联合查询和动态 SQL 查询。 ![](https://www.8kiz.cn/usr/uploads/2024/06/2016252108.png) ### 一、环境配置 #### 1. Maven 依赖 在 `pom.xml` 文件中添加 Spring 和 MyBatis 的相关依赖: ```xml <dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Spring Boot Starter MyBatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> <!-- MySQL Connector --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies> ``` #### 2. 配置文件 在 `application.yml` 中配置数据库连接和 MyBatis 设置: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/your_database username: your_username password: your_password driver-class-name: com.mysql.cj.jdbc.Driver mybatis: mapper-locations: classpath:mappers/*.xml type-aliases-package: com.example.demo.model ``` ### 二、实体类和 Mapper 接口 #### 1. 实体类 创建一个简单的实体类 `User`: ```java package com.example.demo.model; public class User { private Long id; private String name; private String email; // Getters and setters } ``` #### 2. Mapper 接口 定义 `UserMapper` 接口: ```java package com.example.demo.mapper; import com.example.demo.model.User; import org.apache.ibatis.annotations.*; import java.util.List; @Mapper public interface UserMapper { @Select("SELECT * FROM users WHERE id = #{id}") User findById(Long id); @Select("SELECT * FROM users") List<User> findAll(); @Select("SELECT * FROM users WHERE name = #{name}") List<User> findByName(String name); @Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})") @Options(useGeneratedKeys = true, keyProperty = "id") void insert(User user); @Update("UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}") void update(User user); @Delete("DELETE FROM users WHERE id = #{id}") void delete(Long id); } ``` ### 三、各种查询操作 #### 1. 简单查询 通过主键 ID 查询用户: ```java User user = userMapper.findById(1L); System.out.println(user.getName()); ``` #### 2. 条件查询 根据用户名查询用户列表: ```java List<User> users = userMapper.findByName("John"); users.forEach(user -> System.out.println(user.getEmail())); ``` #### 3. 分页查询 分页查询可以通过 SQL 语句中的 `LIMIT` 关键字实现。首先在 Mapper 接口中添加分页查询方法: ```java @Select("SELECT * FROM users LIMIT #{offset}, #{limit}") List<User> findByPage(@Param("offset") int offset, @Param("limit") int limit); ``` 然后在业务代码中调用分页查询方法: ```java int page = 1; int pageSize = 10; int offset = (page - 1) * pageSize; List<User> users = userMapper.findByPage(offset, pageSize); users.forEach(user -> System.out.println(user.getName())); ``` #### 4. 联合查询 假设有另一个表 `orders`,我们需要查询用户及其订单信息。首先创建 `Order` 实体类: ```java package com.example.demo.model; public class Order { private Long id; private Long userId; private String product; private int quantity; // Getters and setters } ``` 然后在 `UserMapper` 中添加联合查询方法: ```java @Select("SELECT u.*, o.* FROM users u JOIN orders o ON u.id = o.user_id WHERE u.id = #{userId}") @Results({ @Result(property = "id", column = "id"), @Result(property = "name", column = "name"), @Result(property = "email", column = "email"), @Result(property = "orders", column = "user_id", many = @Many(select = "com.example.demo.mapper.OrderMapper.findByUserId")) }) User findUserWithOrders(Long userId); ``` 在 `OrderMapper` 中添加 `findByUserId` 方法: ```java package com.example.demo.mapper; import com.example.demo.model.Order; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import java.util.List; @Mapper public interface OrderMapper { @Select("SELECT * FROM orders WHERE user_id = #{userId}") List<Order> findByUserId(Long userId); } ``` 调用联合查询方法: ```java User user = userMapper.findUserWithOrders(1L); System.out.println(user.getName()); user.getOrders().forEach(order -> System.out.println(order.getProduct())); ``` #### 5. 动态 SQL 查询 动态 SQL 查询使用 MyBatis 的 `<if>` 和 `<choose>` 等标签。首先创建 XML 映射文件 `UserMapper.xml`: ```xml <?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.demo.mapper.UserMapper"> <select id="findUsersByCriteria" parameterType="map" resultType="com.example.demo.model.User"> SELECT * FROM users <where> <if test="name != null"> AND name = #{name} </if> <if test="email != null"> AND email = #{email} </if> </where> </select> </mapper> ``` 在 `UserMapper` 接口中声明方法: ```java List<User> findUsersByCriteria(@Param("name") String name, @Param("email") String email); ``` 调用动态查询方法: ```java Map<String, Object> params = new HashMap<>(); params.put("name", "John"); params.put("email", null); List<User> users = userMapper.findUsersByCriteria(params); users.forEach(user -> System.out.println(user.getEmail())); ``` ### 四、总结 Spring 和 MyBatis 的结合使得数据访问层的开发变得更加简洁和高效。通过以上各种查询操作的详细讲解,我们可以看到 MyBatis 在处理简单查询、条件查询、分页查询、联合查询和动态 SQL 查询方面的强大功能。熟练掌握这些操作,可以极大提升开发效率和代码质量。 --- **思维导图:Spring 和 MyBatis 的各种查询** ```mermaid graph TD; A[Spring 和 MyBatis 的各种查询] --> B[环境配置] B --> B1[Maven 依赖] B --> B2[配置文件] A --> C[实体类和 Mapper 接口] C --> C1[实体类] C --> C2[Mapper 接口] A --> D[各种查询操作] D --> D1[简单查询] D --> D2[条件查询] D --> D3[分页查询] D --> D4[联合查询] D --> D5[动态 SQL 查询] A --> E[总结] ``` 通过本文和思维导图的详细解析,开发者可以全面了解如何在 Spring 中使用 MyBatis 进行各种查询操作,提升数据访问层的开发效率和代码质量。 最后修改:2024 年 06 月 17 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏