springboot+h2+mybatis实现查询
时间: 2025-05-04 09:03:45 浏览: 33
<think>嗯,用户现在想用Spring Boot结合H2数据库和MyBatis实现查询功能。我需要先回顾之前的对话,确保回答的一致性。用户之前问过关于Spring Boot和H2的集成,但当时用的是JPA,现在换成MyBatis了。所以这次需要调整配置,尤其是MyBatis相关的部分。
首先,用户引用了几个资料,其中提到了MyBatis和MyBatis-Plus的集成,还有分页配置和拦截器。不过用户的具体需求是实现查询功能,所以可能不需要太复杂的内容,但需要涵盖基本的配置和查询步骤。
接下来,我需要整理实现步骤。应该从添加依赖开始,包括Spring Boot、MyBatis、H2的依赖。然后配置数据源,和之前类似,但需要加上MyBatis的配置,比如mapper-locations。然后创建实体类,但MyBatis不需要JPA注解,所以可能需要不同的方式,比如使用@Alias或者XML映射。
然后,创建Mapper接口,这里要用MyBatis的@Mapper或者@MapperScan注解。用户可能需要XML映射文件或者注解方式,比如@Select。还需要初始化数据,可以用data.sql,或者通过MyBatis的脚本。
服务层和控制器层和之前类似,但需要调用MyBatis的Mapper接口。测试部分也要提到如何访问H2控制台和调用API。
可能的问题包括依赖配置错误、MyBatis的mapper路径设置不正确、H2连接问题等。需要提醒用户检查这些点。
另外,用户提到的引用中有提到分页配置和拦截器,虽然用户当前需求可能不需要,但可以作为相关问题推荐,比如如何实现分页查询或者整合MyBatis-Plus。
需要确保所有步骤清晰,代码示例正确,特别是MyBatis的配置部分,比如在application.properties中添加mybatis.mapper-locations,并创建对应的XML文件。同时,示例查询可以使用注解和XML两种方式,方便用户选择。
最后,相关问题部分可以引导用户深入,比如H2持久化、多数据源配置、MyBatis性能优化等,参考之前的引用和常见问题。</think>### Spring Boot + H2 + MyBatis 查询实现完整流程
#### 1. 项目依赖配置
```xml
<!-- pom.xml核心依赖 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
</dependencies>
```
#### 2. 数据库配置
`application.properties`关键配置:
```properties
# H2内存数据库配置
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
# MyBatis配置
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.model
# 启用H2控制台
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
```
#### 3. 实体类定义
```java
// 使用MyBatis无需JPA注解
public class User {
private Long id;
private String name;
private String email;
// Getter/Setter省略
}
```
#### 4. Mapper接口开发
```java
@Mapper
public interface UserMapper {
// 注解方式查询
@Select("SELECT * FROM users WHERE id = #{id}")
User findById(Long id);
// XML映射查询
List<User> findByName(String name);
}
```
#### 5. SQL映射文件
`src/main/resources/mapper/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.mapper.UserMapper">
<select id="findByName" resultType="User">
SELECT * FROM users WHERE name LIKE CONCAT('%', #{name}, '%')
</select>
</mapper>
```
#### 6. 数据初始化
`src/main/resources/schema.sql`:
```sql
CREATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
email VARCHAR(100)
);
```
`src/main/resources/data.sql`:
```sql
INSERT INTO users(name, email) VALUES('张三', '[email protected]');
INSERT INTO users(name, email) VALUES('李四', '[email protected]');
```
#### 7. 服务层实现
```java
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User getById(Long id) {
return userMapper.findById(id);
}
public List<User> searchByName(String name) {
return userMapper.findByName(name);
}
}
```
#### 8. REST控制器
```java
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public ResponseEntity<User> getById(@PathVariable Long id) {
return ResponseEntity.ok(userService.getById(id));
}
@GetMapping("/search")
public ResponseEntity<List<User>> search(@RequestParam String name) {
return ResponseEntity.ok(userService.searchByName(name));
}
}
```
#### 验证流程
1. 访问`http://localhost:8080/h2-console`验证表结构
2. 测试接口:
```bash
# 查询单个用户
curl http://localhost:8080/api/users/1
# 模糊搜索
curl http://localhost:8080/api/users/search?name=张
```
### 常见问题解决方案
1. **Mapper未找到**:检查`@MapperScan(basePackages = "com.example.mapper")`是否在启动类添加
2. **SQL语法错误**:在H2控制台直接执行SQL验证语句正确性[^1]
3. **字段映射失败**:确保实体类字段名与数据库列名一致(H2默认大写转小写)
阅读全文
相关推荐


















