Spring Boot 整合 MyBatis 连接数据库及常见问题
目录
- 一、基本配置
- 1. 添加依赖
- 2. 配置数据库连接
- 二、项目结构
- 三、核心组件实现(示例)
- 1. 实体类
- 2. Mapper 接口
- 3. Mapper XML 文件
- 4. Service 层
- 5. Controller 编程层:
- 四、高级特性
- 1. 动态SQL
- 2. 分页查询
- 3. 多数据源配置
- 五、常见问题解决
MyBATis 是一个优秀的持久层框架,支持定制化 SQL、存储过程以及高级映射。下面详细介绍如何在 Spring Boot 项目中整合 MyBatis 并连接数据库。
一、基本配置
1. 添加依赖
在pom.xml中添加以下依赖:
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis Spring Boot Starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version> <!-- 使用最新版本 -->
</dependency>
<!-- 数据库驱动,根据你的数据库选择 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-Java</artifactId>javascript;
<scope>runtime</scope>
</dependency>
<!-- 其他可能需要的依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version> <!-- Druid 连接池 -->
</dependency>
2. 配置数据库连接
在application.yml或application.properties中配置数据库连接:
# application.yml 配置示例
spring:
datasource:
url: jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
username: your_username
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource # 使用Druid连接池
# MyBatis 配置
mybatis:
mapper-locations: classpath:mapper/*.xml # mapper.xml文件位置
type-aliases-package: com.example.model # 实体类所在包
configuration:
map-underscore-to-camel-case: true # 开启驼峰命名转换
二、项目结构
典型的项目结构如下:
src/main/java
└── com.example.demo
├── DemoApplication.java # 启动类
├── config
│ └── MyBatisConfig.java # MyBatis配置类(可选)
├── controller
│ └── UserController.java # 控制器
├── service
│ ├── UserService.java # 服务接口
│ └── impl
│ └── UserServiceImpl.java # 服务实现
├── mapper
│ └── UserMapper.java # Mapper接口
└── model
└── User.java # 实体类
src/main/resources
├── application.yml # 配置文件
└── mapper
└── UserMapper.xml # SQL映射文件
三、核心组件实现(示例)
1. 实体类
package com.example.model;
public class User {
private Long id;
private String username;
private String password;
private String email;
// getters and setters
// toString()
}
2. Mapper 接口
package com.example.mapper;
import com.example.model.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper // 重要:标识这是一个MyBatis的Mapper接口
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User findById(Long id);
@Insert("INSERT INTO user(username, password, email) VALUES(#{username}, #{password}, #{email})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insert(User user);
@Update("UPDATE user SET username=#{username}, password=#{password}, email=#{email} WHERE id=#{id}")
int update(User user);
@Delete("DELETE FROM user WHERE id=#{id}")
int delete(Long id);
// XML配置方式
List<User> findAll();
}
3. Mapper XML 文件
src/main/resources/mapper/UserMapper.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">
<resultMap id="userResultMap" type="User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<result property="email" column="email"/>
</resultMap>
<select id="findAll" resultMap="userResultMap">
SELECT * FROM user
</select>
</mapper>
4. Service 层
package com.example.service;
import com.example.model.Usjser;
import java.util.List;
public interface UserService {
User findById(Long id)android;
List<User> findAll();
int save(User user);
int update(User user);
int delete(Long id);
}
service层实现类:
package com.example.service.impl;
import com.example.mapper.UserMapper;
import com.example.model.User;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User findById(Long id) {
return userMapper.findById(id);
}
@Override
public List<User> findAll() {
return userMapper.findAll();
}
@Override
public int save(User user) {
return userMapper.insert(user);
}
@Override
public int update(User user) {
return userMapper.update(user);
}
@Override
public int delete(Long id) {
return userMapper.delete(id);
}
}
5. Controller 层:
package com.example.controller;
import com.example.model.User;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
@GetMapping
public List<User> getAllUsers() {
return userService.findAll();
}
@PostMapping
public int createUser(@RequestBody User user) {
return userService.save(user);
}
@PutMapping
public int updateUser(@RequestBody User user) {
return userService.update(user);
}
@DeleteMapping("/{id}")
public int deleteUser(@PathVariable Long id) {
return userService.delete(id);
}
}
四、高级特性
1. 动态SQL
在XML中使用动态SQL:
<select id="findByCondition" parameterType="map" resultMap="userResultMap">
SELECT * FROM user
<where>
<if test="username != null and username != ''">
AND username LIKE CONCAT('%', #{username}, '%')
</if>
<if test="email != null and email != ''">
AND email = #{email}
</if>
</where>
</select>
2. 分页查询
使用PageHelper插件:
添加依赖:
<select id="findByCondition" parameterType="map" resultMap="userResultMap">
SELECT * FROM user
<where>
<if test="username != null and username != ''">
AND username LIKE CONCAT('%', #{username}, '%')
</if>
<if test="email != null and email != ''">
AND email = #{email}
</if>
</where>
</select>
使用示例:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.1</version>
</dependency>
3. 多数据源配置
配置多个数据源:
spring:
datasource:
primary:
url: jdbc:mysql://localhost:3306/db1
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
secondary:
url: jdbc:mysql://localhost:3306/DB2
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
创建配置类:
@Configuration
@MapperScan(basePackages = "com.example.mapper.primary", sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryDataSourceConfig {
@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "primarySqlSessionFactory")
public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperlocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/primary/*.xml"));
return bean.getObject();
}
@Bean(name = "primaryTransactionManager")
public DataSourceTransactionManager primaryTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
// 类似地创建SecondaryDataSourceConfig
五、常www.devze.com见问题解决
Mapper接口无法注入:
- 确保启动类上有
@MapperScan("com.example.mapper")注解 - 或者每个Mapper接口上有
@Mapper注解
XML文件找不到:
- 检查
mybatis.mapper-locations配置是否正确 - 确保XML文件在resources目录下正确位置
驼峰命名不生效:
- 确认配置
mybatis.configuration.map-underscore-to-camel-case=true
连接池配置:
- 推荐使用Druid连接池,并配置合理的连接参数
事务管理:
- 在Service方法上添加
@Transactional注解
到此这篇关于Spring Boot 整合 MyBatis 连接数据库及常见问题的文章就介绍到这了,更多相关Spring Boot MyBatis 连接数据库内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
加载中,请稍侯......
精彩评论