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