开发者

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.ymlapplication.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)!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜