1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/GiteeOS-springboot-guide

Клонировать/Скачать
springboot-mybatis.md 14 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 04.06.2025 10:20 f496caa

Интеграция SpringBoot с Mybatis имеет два распространенных подхода: полностью аннотированный подход и подход с использованием XML. По моему мнению, ни один из этих подходов не превосходит другой. В случае, если SQL-запросы не слишком длинные, я считаю, что полностью аннотированный подход будет более ясным и простым. Однако, сложные SQL-запросы действительно не подходят для написания вместе с кодом.## 1 Подготовка к разработке

1.1 Параметры окружения

  • Разработка: IDEA
  • Базовые инструменты: Maven+JDK8
  • Используемые технологии: SpringBoot+Mybatis
  • База данных: MySQL
  • Версия SpringBoot: 2.1.0

1.2 Создание проекта

Создайте базовый проект SpringBoot. Здесь я не буду подробно останавливаться на этом вопросе, подробнее можно посмотреть в предыдущих статьях.

1.3 Создание базы данных и таблицы пользователей

Наша таблица пользователей очень простая, содержит только 4 поля: идентификатор пользователя, имя, возраст, баланс. См. рисунок ниже:

Таблица данных

Добавление поля "баланс" (money) было сделано для демонстрации простого подхода к управлению транзакциями.

Запрос на создание таблицы:

CREATE TABLE `user` (
  `id` int(13) NOT NULL AUTO_INCREMENT COMMENT 'Основной ключ',
  `name` varchar(33) DEFAULT NULL COMMENT 'Имя',
  `age` int(3) DEFAULT NULL COMMENT 'Возраст',
  `money` double DEFAULT NULL COMMENT 'Баланс',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8

1.4 Настройка зависимостей в файле pom

1.5 Настройка application.properties

1.6 Создание бина класса пользователя

Для интеграции Spring Boot и Mybatis были добавлены зависимости с artifactId mybatis-spring-boot-starter и mysql-connector-java, так как используется база данных MySQL.```xml org.springframework.boot spring-boot-starter-web org.mybatis.spring.boot mybatis-spring-boot-starter 1.3.2 mysql mysql-connector-java runtime org.springframework.boot spring-boot-starter-test test


Так как используется более новый драйвер подключения к MySQL, конфигурационный файл может отличаться от предыдущего.

```properties
server.port=8333
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/erp?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

Внимание: мы используем mysql-connector-java версии 8+, поэтому для подключения JDBC к версиям mysql-connector-java 6+ и выше необходимо указать часовой пояс serverTimezone=GMT%2B8. Ранее для настройки подключения к MySQL использовалось указание driver-class-name=com.mysql.jdbc.Driver, но теперь это необходимо заменить на com.mysql.cj.jdbc.Driver, иначе в консоли появится следующая ошибка:

Загрузка класса `com.mysql.jdbc.Driver'. Это устаревший класс. Новый класс драйвера `com.mysql.cj.jdbc.Driver'. Драйвер автоматически регистрируется через SPI, и ручная загрузка класса обычно не требуется.

Эта ошибка означает, что com.mysql.jdbc.Driver устарел. Новый класс драйвера — com.mysql.cj.jdbc.Driver. Драйвер автоматически регистрируется через SPI, и ручная загрузка класса обычно не требуется.

Если вы все же хотите использовать com.mysql.jdbc.Driver, замените его на com.mysql.cj.jdbc.Driver.### 1.6 Создание класса пользователя Bean

User.java

public class User {
    private int id;
    private String name;
    private int age;
    private double money;
    ...
    Здесь пропущены getter, setter и метод toString
}
```## 2 Полностью аннотированный подход

Сначала рассмотрим полностью аннотированный подход. Основное отличие этого подхода от подхода с использованием XML заключается в том, что SQL-запросы записываются в Java-коде, а не в XML-файле. Преобразование из полностью аннотированного подхода в XML-подход требует лишь небольших изменений, которые я упомяну позже.

**Структура проекта:**

![Структура проекта для полностью аннотированного подхода](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-11-29/1909910.jpg)

### 2.1 Разработка слоя DAO

UserDao.java

```java
@Mapper
public interface UserDao {
    /**
     * Поиск информации о пользователе по имени
     */
    @Select("SELECT * FROM user WHERE name = #{name}")
    User findUserByName(@Param("name") String name);

    /**
     * Поиск всех пользователей
     */
    @Select("SELECT * FROM user")
    List<User> findAllUser();

    /**
     * Вставка информации о пользователе
     */
    @Insert("INSERT INTO user(name, age, money) VALUES(#{name}, #{age}, #{money})")
    void insertUser(@Param("name") String name, @Param("age") Integer age, @Param("money") Double money);

    /**
     * Обновление информации о пользователе по ID
     */
    @Update("UPDATE user SET name = #{name}, age = #{age}, money = #{money} WHERE id = #{id}")
    void updateUser(@Param("name") String name, @Param("age") Integer age, @Param("money") Double money,
                    @Param("id") int id);

    /**
     * Удаление информации о пользователе по ID
     */
    @Delete("DELETE FROM user WHERE id = #{id}")
    void deleteUser(@Param("id") int id);
}

2.2 Разработка слоя сервиса

@Service
public class UserService {
    @Autowired
    private UserDao userDao;
``````java
/**
 * Поиск пользователя по имени
 */
public User selectUserByName(String name) {
    return userDao.findUserByName(name);
}

/**
 * Поиск всех пользователей
 */
public List<User> selectAllUser() {
    return userDao.findAllUser();
}

/**
 * Вставка двух пользователей
 */
public void insertService() {
    userDao.insertUser("SnailClimb", 22, 3000.0);
    userDao.insertUser("Daisy", 19, 3000.0);
}

/**
 * Удаление пользователя по его id
 */
public void deleteService(int id) {
    userDao.deleteUser(id);
}

/**
 * Моделирование транзакции. Благодаря аннотации @Transactional, если во время транзакции произойдет ошибка, деньги у SnailClimb и Daisy не изменятся.
 */
@Transactional
public void changemoney() {
    userDao.updateUser("SnailClimb", 22, 2000.0, 3);
    // Моделирование возможных ошибок во время транзакции
    int temp = 1 / 0;
    userDao.updateUser("Daisy", 19, 4000.0, 4);
}

2.3 Контроллерный слой

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/query")
    public User testQuery() {
        return userService.selectUserByName("Daisy");
    }

    @RequestMapping("/insert")
    public List<User> testInsert() {
        userService.insertService();
        return userService.selectAllUser();
    }

    @RequestMapping("/changemoney")
    public List<User> testchangemoney() {
        userService.changemoney();
        return userService.selectAllUser();
    }

    @RequestMapping("/delete")
    public String testDelete() {
        userService.deleteService(3);
        return "OK";
    }
}

2.4 Запуск приложения

// Аннотация, указывающая на класс запуска SpringBoot
@SpringBootApplication
// Аннотация, указывающая на пакет, содержащий интерфейсы DAO
@MapperScan("top.snailclimb.dao")
public class MainApplication {

2.5 Примеры использования

// Пример использования метода selectUserByName
User user = userService.selectUserByName("SnailClimb");

// Пример использования метода selectAllUser
List<User> allUsers = userService.selectAllUser();

// Пример использования метода insertService
userService.insertService();

// Пример использования метода deleteService
userService.deleteService(3);

// Пример использования метода changemoney
userService.changemoney();
```    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }

}

2.5 Простое тестирование

Приведенный выше код успешно прошел тестирование. Ниже приведен результат тестирования поиска по имени.

Результат тестирования поиска по имени

3 XML-способ

Структура проекта: Структура проекта

В отличие от способа с использованием аннотаций, здесь есть несколько изменений, которые легко реализовать.

3.1 Слой DAO

Вот пример метода поиска пользователя по имени.

UserDao.java

@Mapper
public interface UserDao {
    /**
     * Поиск информации о пользователе по имени
     */
    User findUserByName(String name);

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="top.snailclimb.dao.UserDao">

    <select id="findUserByName" parameterType="String" resultType="top.snailclimb.bean.User">
        SELECT * FROM user WHERE name = #{name}
    </select>
</mapper>

3.2 Изменения в конфигурационных файлах

В конфигурационные файлы добавьте следующую строку:

mybatis.mapper-locations=classpath:mapper/*.xml

Адрес кода: https://github.com/Snailclimb/springboot-guide/tree/master/source-code/basis/springboot-mybatis

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/GiteeOS-springboot-guide.git
git@api.gitlife.ru:oschina-mirror/GiteeOS-springboot-guide.git
oschina-mirror
GiteeOS-springboot-guide
GiteeOS-springboot-guide
master