当前位置: 首页 > news >正文

spring和Mybatis的各种查询

Spring 和 MyBatis 是 Java 开发中广泛使用的两个框架。Spring 提供了全面的基础设施支持,而 MyBatis 是一个优秀的持久层框架,两者结合能够简化数据访问层的开发。本文将详细介绍如何在 Spring 中使用 MyBatis 进行各种查询操作,包括简单查询、条件查询、分页查询、联合查询和动态 SQL 查询。

一、环境配置

1. Maven 依赖

在 pom.xml 文件中添加 Spring 和 MyBatis 的相关依赖:

<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 设置:

spring:datasource:url: jdbc:mysql://localhost:3306/your_databaseusername: your_usernamepassword: your_passworddriver-class-name: com.mysql.cj.jdbc.Drivermybatis:mapper-locations: classpath:mappers/*.xmltype-aliases-package: com.example.demo.model
​

二、实体类和 Mapper 接口

1. 实体类

创建一个简单的实体类 User

package com.example.demo.model;public class User {private Long id;private String name;private String email;// Getters and setters
}
​
2. Mapper 接口

定义 UserMapper 接口:

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 查询用户:

User user = userMapper.findById(1L);
System.out.println(user.getName());
​
2. 条件查询

根据用户名查询用户列表:

List<User> users = userMapper.findByName("John");
users.forEach(user -> System.out.println(user.getEmail()));
​
3. 分页查询

分页查询可以通过 SQL 语句中的 LIMIT 关键字实现。首先在 Mapper 接口中添加分页查询方法:

@Select("SELECT * FROM users LIMIT #{offset}, #{limit}")
List<User> findByPage(@Param("offset") int offset, @Param("limit") int limit);
​

然后在业务代码中调用分页查询方法:

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 实体类:

package com.example.demo.model;public class Order {private Long id;private Long userId;private String product;private int quantity;// Getters and setters
}
​

然后在 UserMapper 中添加联合查询方法:

@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 方法:

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);
}
​

调用联合查询方法:

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 version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//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 接口中声明方法:

List<User> findUsersByCriteria(@Param("name") String name, @Param("email") String email);
​

调用动态查询方法:

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 的结合使得数据访问层的开发变得更加简洁和高效。

相关文章:

  • YOLO-UniOW概述 论文
  • 华为OD最新机试真题-反转每对括号间的子串-OD统一考试(B卷)
  • 小猴子摆玩具
  • python--=的用法
  • 用python制作一个打地鼠游戏
  • Condition源码解读(二)
  • 基于物理约束的稀疏IMU运动捕捉系统
  • Spring AI 集成多个大语言模型
  • canal高可用配置
  • Linux中的Shell脚本基础
  • 2025年5月通信科技领域周报(5.19-5.25):太赫兹通信规模商用启动 空天地一体化网络加速落地
  • 亚古数据:查询BVI(英属维尔京群岛)公司可以获取到什么信息和文件?
  • Cesium实现标注动画
  • get_rga_thread线程和low_camera_venc_thread线程获取低分辨率VENC码流数据
  • WES(二)——数据预处理
  • 美颜SDK功能模块化设计实战:滤镜、贴纸与人脸识别的协同实现
  • YOLOv8 区域计数系统:基于计算机视觉的智能物体计数方案
  • 各类效果名称收集
  • Nacos 服务注册发现案例:nacos-spring-cloud-example 详解
  • Django实现文件上传
  • 建设工程质量安全管理协会网站/农产品网络营销推广方案
  • 阿里云域名注册服务网站/有什么公司要做推广的
  • 济南一哥网站建设公司/推广策略可以分为哪三种
  • 做网上卖酒的网站有几家/长春网络优化哪个公司在做
  • wordpress分类链接失效/网站关键词优化排名外包
  • 网上开店如何找货源/惠州百度seo找谁