Вопрос или проблема
Вопрос: Реализация MyBatis против MyBatis-Plus
У меня есть две реализации функции управления статьями с использованием MyBatis и MyBatis-Plus. Ниже приведены соответствующие фрагменты кода для каждого подхода.
- Код, написанный с использованием MyBatis.
@RestController
@RequestMapping("/article")
public class ArticleController {
@Autowired
private ArticleService articleService;
@PostMapping
public Result add(@RequestBody @Validated Article article) {
articleService.add(article);
return Result.success();
}
}
public interface ArticleService {
void add(Article article);
}
@Service
public class ArticleServiceImpl extends ServiceImpl<ArticleMapper, Article> implements ArticleService {
@Autowired
private ArticleMapper articleMapper;
@Override
public void add(Article article) {
article.setCreateTime(LocalDateTime.now());
article.setUpdateTime(LocalDateTime.now());
Map<String, Object> map = ThreadLocalUtil.get();
Integer userId = (Integer) map.get("id");
article.setCreateUser(userId);
articleMapper.add(article);
}
}
@Mapper
public interface ArticleMapper {
@Insert("insert into article(title,content,cover_img,state,category_id,create_user,create_time,update_time) " +
"values(#{title},#{content},#{coverImg},#{state},#{categoryId},#{createUser},#{createTime},#{updateTime})")
void add(Article article);
}
- Код, написанный с использованием MyBatis-Plus.
@RestController
@RequestMapping("/article")
public class ArticleController {
@Autowired
private ArticleService articleService;
@PostMapping
public Result add(@RequestBody @Validated Article article) {
article.setCreateTime(LocalDateTime.now());
article.setUpdateTime(LocalDateTime.now());
Map<String, Object> map = ThreadLocalUtil.get();
Integer userId = (Integer) map.get("id");
article.setCreateUser(userId);
articleService.save(article);
return Result.success();
}
}
public interface ArticleService extends IService<Article> {
}
@Service
public class ArticleServiceImpl extends ServiceImpl<ArticleMapper, Article> implements ArticleService {
}
@Mapper
public interface ArticleMapper extends BaseMapper<Article> {
}
Вопрос
Какая реализация лучше с точки зрения поддерживаемости кода, производительности и удобства использования? Есть ли какие-либо лучшие практики или рекомендации по улучшению использования MyBatis или MyBatis-Plus в этом контексте?
Ответ или решение
В реализации управления статьями с использованием MyBatis и MyBatis-Plus можно выделить несколько аспектов: поддерживаемость кода, производительность и удобство использования. Давайте рассмотрим каждую из этих категорий в контексте представленных кодов.
1. Поддерживаемость кода
MyBatis:
- Ваша реализация с использованием MyBatis требует более детального управления SQL-запросами и функционалом, что может привести к более сложному коду, особенно по мере роста приложения.
- Вам необходимо самостоятельно ручное написание SQL-запросов и их управление, что увеличивает вероятность ошибок при изменении структуры базы данных или когда изменения затрагивают несколько файлов.
MyBatis-Plus:
- MyBatis-Plus значительно упрощает поддержку кода за счет предоставления набора полезных функций, таких как автоматическое создание CRUD операций и использование базовых методов
BaseMapper
. - Ваш код становится более чистым и легким для понимания, так как он требует меньше явных SQL-запросов и позволяет использовать удобные методы.
2. Производительность
MyBatis:
- В зависимости от сложности запросов может потребоваться больше времени на оптимизацию SQL-запросов и кода. Ваш код написан вручную и вы контролируете производительность, но это также означает, что ошибки могут привести к значительным затратам времени на выполнение запросов.
MyBatis-Plus:
- Использование MyBatis-Plus обычно обеспечивает хорошую производительность благодаря оптимизированным SQL-запросам, которые генерируются автоматически. Библиотека учитывает множество лучших практик, что может положительно сказаться на производительности.
- Однако важно отметить, что с точки зрения производительности все еще необходимо следить за сложностью запросов и структурой данных.
3. Удобство использования
MyBatis:
- Использование MyBatis требует большего внимания к написанию SQL, что может создавать дополнительные сложности для новых разработчиков. Необходимо больше времени на обучение.
MyBatis-Plus:
- MyBatis-Plus предлагает богатый набор функций «из коробки», что упрощает процесс разработки. Разработчики могут быстрее писать код и сосредоточиться на бизнес-логике, а не на рутинном создании SQL-запросов.
- В дополнение, MyBatis-Plus предлагает удобные аннотации и методы для работы с сущностями, что заметно улучшает разработку.
Рекомендации по улучшению использования MyBatis и MyBatis-Plus
-
Используйте автоматическое заполнение полей:
В MyBatis-Plus можно настроить автоматическое заполнение полей, таких какcreateTime
,updateTime
, что значительно упростит код и снизит вероятность ошибок. -
Искористуем расширенные возможности MyBatis-Plus:
Обратите внимание на возможности таких функций, как условные запросы, пагинация, и обработка временных меток. Это может сэкономить много времени и усилий. -
Тесты и документация:
Разрабатывайте как можно больше тестов для вашего кода, как для MyBatis, так и для MyBatis-Plus. Это поможет избежать ошибок из-за изменений в коде. Хорошая документация и комментарии сделают ваш код более доступным для новых разработчиков. -
Соблюдение принципов SOLID:
Следуйте принципам разработки, таким как SOLID, чтобы обеспечить более высокую поддерживаемость вашего кода.
Заключение
В общем, использование MyBatis-Plus предоставляет больше преимуществ в области поддерживаемости, производительности и удобства использования по сравнению с чистым MyBatis. Однако, как и в любом фреймворке, важно избегать чрезмерного упрощения и продолжать уделять внимание структуре кода и оптимизации запросов.