Интеграция SpringBoot с Mybatis имеет два распространенных подхода: полностью аннотированный подход и подход с использованием XML. По моему мнению, ни один из этих подходов не превосходит другой. В случае, если SQL-запросы не слишком длинные, я считаю, что полностью аннотированный подход будет более ясным и простым. Однако, сложные SQL-запросы действительно не подходят для написания вместе с кодом.## 1 Подготовка к разработке
Создайте базовый проект SpringBoot. Здесь я не буду подробно останавливаться на этом вопросе, подробнее можно посмотреть в предыдущих статьях.
Наша таблица пользователей очень простая, содержит только 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
Для интеграции 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-подход требует лишь небольших изменений, которые я упомяну позже.
**Структура проекта:**

### 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);
}
@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);
}
@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";
}
}
// Аннотация, указывающая на класс запуска SpringBoot
@SpringBootApplication
// Аннотация, указывающая на пакет, содержащий интерфейсы DAO
@MapperScan("top.snailclimb.dao")
public class MainApplication {
// Пример использования метода 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);
}
}
Приведенный выше код успешно прошел тестирование. Ниже приведен результат тестирования поиска по имени.
Структура проекта:
В отличие от способа с использованием аннотаций, здесь есть несколько изменений, которые легко реализовать.
Вот пример метода поиска пользователя по имени.
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>
В конфигурационные файлы добавьте следующую строку:
mybatis.mapper-locations=classpath:mapper/*.xml
Адрес кода: https://github.com/Snailclimb/springboot-guide/tree/master/source-code/basis/springboot-mybatis
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )