本文主要是介绍Spring Boot 整合 MyBatis 连接数据库及常见问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《SpringBoot整合MyBatis连接数据库及常见问题》MyBatis是一个优秀的持久层框架,支持定制化SQL、存储过程以及高级映射,下面详细介绍如何在SpringBoot项目中整合My...
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.chinasem.cn见问题解决
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 连接数据库内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!
这篇关于Spring Boot 整合 MyBatis 连接数据库及常见问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!