芋道 Spring Boot MyBatis 入门(二)之 MyBatis + 注解

摘要: 原创出处 http://www.iocoder.cn/Spring-Boot/MyBatis/ 「芋道源码」欢迎转载,保留摘要,谢谢!

  • 1. 概述
  • 2. MyBatis + XML
    • 2.1 引入依赖
    • 2.2 Application
    • 2.3 应用配置文件
    • 2.4 MyBatis 配置文件
    • 2.5 UserDO
    • 2.6 UserMapper
    • 2.7 简单测试
  • 3. MyBatis + 注解
    • 3.1 差异部分
    • 3.2 UserMapper
    • 3.3 简单测试
  • 4. MyBatis-Plus
    • 4.1 引入依赖
    • 4.2 Application
    • 4.3 应用配置文件
    • 4.4 UserDO
    • 4.5 UserMapper
    • 4.6 简单测试
  • 5. tkmybatis
    • 5.1 引入依赖
    • 5.2 Application
    • 5.3 应用配置文件
    • 5.4 MyBatis 配置文件
    • 5.5 UserDO
    • 5.6 UserMapper
    • 5.7 简单测试
  • 666. 彩蛋

3. MyBatis + 注解

大多数情况下,艿艿并不推荐使用注解的方式编写 SQL 。一方面,SQL 无法很好的排版。另一方面,会导致 Mapper 接口很长很乱。

并且,在 MyBatis 的官方文档中,对注解的评价如下:

FROM https://mybatis.org/mybatis-3/zh/java-api.html 因为最初设计时,MyBatis 是一个 XML 驱动的框架。配置信息是基于 XML 的,而且映射语句也是定义在 XML 中的。而到了 MyBatis 3,就有新选择了。MyBatis 3 构建在全面且强大的基于 Java 语言的配置 API 之上。这个配置 API 是基于 XML 的 MyBatis 配置的基础,也是新的基于注解配置的基础。注解提供了一种简单的方式来实现简单映射语句,而不会引入大量的开销。 不幸的是,Java 注解的的表达力和灵活性十分有限。尽管很多时间都花在调查、设计和试验上,最强大的 MyBatis 映射并不能用注解来构建——并不是在开玩笑,的确是这样。比方说,C#属性就没有这些限制,因此 MyBatis.NET 将会比 XML 有更丰富的选择。也就是说,基于 Java 注解的配置离不开它的特性。

  • 间接表述不是很推荐使用 MyBatis 注解的方式。

同时,在艿艿的工作经历之间,和询问一些好朋友,没有发现使用注解的情况。

因此,真的不推荐使用 MyBatis + 注解。哈哈哈哈,不过这个章节,我还是想写一写。

示例代码对应仓库:lab-12-mybatis-annotation 。

3.1 差异部分

考虑到胖友已经看过 「2. MyBatis + XML」 小节的内容,我们在这个小节主要说下差异的地方。

1、application.yaml

application.yaml 配置文件中,我们可以删除 mapper-locations 配置项。

当然,如果胖友想 XML 和注解一起使用,可以保留该配置项。

2、UserMapper.xml

可以删除 UserMapper.xml 配置文件。不过需要在 UserMapper 接口上,通过注解声明 SQL 操作。具体见 「3.2 UserMapper」 。

3.2 UserMapper

cn.iocoder.springboot.lab12.mybatis.mapper 包路径下,创建 UserMapper 接口。代码如下:

// UserMapper.java

@Repository
public interface UserMapper {

    @Insert("INSERT INTO users(username, password, create_time) VALUES(#{username}, #{password}, #{createTime})")
    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
    int insert(UserDO user);

    @Update(value = {
            "<script>",
            "UPDATE users",
            "<set>",
            "<if test='username != null'>, username = #{username}</if>",
            "<if test='password != null'>, password = #{password}</if>",
            "</set>",
            "</script>"
    })
    int updateById(UserDO user);

    @Insert("DELETE FROM users WHERE id = #{id}")
    int deleteById(@Param("id") Integer id); // 生产请使用标记删除,除非有点想不开,嘿嘿。

    @Select("SELECT username, password, create_time FROM users WHERE id = #{id}")
    UserDO selectById(@Param("id") Integer id);

    @Select("SELECT username, password, create_time FROM users WHERE username = #{username}")
    UserDO selectByUsername(@Param("username") String username);

    @Select(value = {
            "<script>",
            "SELECT username, password, create_time FROM users",
            "WHERE id IN",
            "<foreach item='id' collection='ids' separator=',' open='(' close=')' index=''>",
            "#{id}",
            "</foreach>",
            "</script>"
    })
    List<UserDO> selectByIds(@Param("ids") Collection<Integer> ids);

}
  • 是不是发现整个 Mapper 接口看起来乱乱的,并且 SQL 的排版也不尽如人意。
  • 对于使用 OGNL 编写动态 SQL ,也特别难受。具体怎么用,胖友可以看看 《MyBatis 在注解上使用动态 SQL》 文章。反正艿艿不是想写第二遍了。

3.3 简单测试

具体的测试,还是使用 UserMapperTest 测试类,直接运行每个测试方法即可。


本文分享自微信公众号 - 芋道源码(javayuanma)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Crossin的编程教室

【Python 第75课】可迭代对象和迭代器

for 循环是我们在 Python 里非常常用的一个语法,但你有没有思考过 for 循环是怎样实现的?

10520
来自专栏业余草

面试再问ThreadLocal,别说你不会

以前面试的时候问到ThreadLocal总是一脸懵逼,只知道有这个哥们,不了解他是用来做什么的,更不清楚他的原理了。表面上看他是和多线程,线程同步有关的一个工具...

6810
来自专栏北京宏哥

Java自动化测试框架-04 - TestNG之Test Method篇 - 道法自然,法力无边(详细教程)

测试方法是可以带有参数的。每个测试方法都可以带有任意数量的参数,并且可以通过使用TestNG的@Parameters向方法传递正确的参数。

12920
来自专栏芋道源码1024

一个 Java 对象到底有多大?

编写Java代码的时候,大多数情况下,我们很少关注一个Java对象究竟有多大(占据多少内存),更多的是关注业务与逻辑。但是殊不知,在我们不经意间,大量的内存被无...

10310
来自专栏Java3y

慌了!面试官又拿JVM开怼!

对于Java人来说,JVM无疑是进阶时必须迈过的坎。不管初入职场还是跳槽升职,JVM更是面试时的必考题。如果不懂JVM的话,薪酬会非常吃亏(近70%的面试者挂在...

8440
来自专栏丑胖侠

面试官,Java8 JVM内存结构变了,永久代到元空间

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

10460
来自专栏搜云库技术团队

常问的15个顶级Java多线程面试题

在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得更多职位,那么你应该准备很多关于多线程的问题。

10530
来自专栏JAVA杂谈

Java日志Log4j或者Logback的NDC和MDC功能

Java中使用的日志的实现框架有很多种,常用的log4j和logback以及java.util.logging,而log4j是apache实现的一个开源日志组件...

14920
来自专栏码洞

每个阿里程序员都必须搞懂的Maven基础知识

以前我们写代码时,jar包都默认放在一个叫 /lib 的目录下,然后把该目录设置为classpath可以读取到的目录,如下图所示:

9320
来自专栏Java识堂

帮你少写一大半参数校验代码的小技巧

几乎每个web网站都会对用户提交的参数进行校验,前端要做,后端也要做。防止用户直接通过接口调用的方式来请求或保存数据,从而导致产生脏数据等其他严重的后果。

10420

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励