2、SqlNode和SqlSource
MyBatis 是一个优秀的基于 Java 的持久层框架,它使用 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。
在 MyBatis 中,SqlNode 和 SqlSource 是核心处理层的两个重要组件。
-
SqlNode:SqlNode 是 MyBatis 中用来表示一个 SQL 语句片段的接口。它可以是静态的 SQL 语句,也可以是动态的 SQL 语句。在 MyBatis 中,SqlNode 通常是由 XML 解析器创建的。SqlNode 的实现类有 StaticTextSqlNode、IfSqlNode、MixedSqlNode 等,它们分别表示静态 SQL 文本、动态 SQL 的 if 条件判断、混合 SQL 等。
-
SqlSource:SqlSource 是一个生成 SQL 语句的接口。在 MyBatis 中,每个映射器方法(Mapper Method)都会对应一个 SqlSource 对象。SqlSource 的实现类有 RawSqlSource、DynamicSqlSource 等。RawSqlSource 表示静态 SQL,DynamicSqlSource 表示动态 SQL。动态 SQL 是指在运行时根据不同的条件拼接出不同的 SQL 语句。
在 MyBatis 的执行流程中,首先会根据映射器方法创建一个 SqlSource 对象,然后调用 SqlSource 的 getBoundSql 方法来生成一个 BoundSql 对象。BoundSql 对象包含了完整的 SQL 语句和参数信息。接下来,MyBatis 会根据 BoundSql 对象生成一个 Statement 对象,最后执行 Statement 对象,完成对数据库的操作。
接下来,我会通过一个简单的例子来说明 SqlNode 和 SqlSource 在 MyBatis 中的使用。
首先,我们需要定义一个映射器接口:
|
|
在这个例子中,我们定义了一个 UserMapper 接口,其中有一个 findById 方法,用于根据 ID 查找用户信息。
接下来,我们需要创建一个 UserMapper 的实现类:
|
|
在这个实现类中,我们通过构造函数注入了一个 SqlSession 对象,然后在 findById 方法中调用了 SqlSession 的 selectOne 方法,完成了对数据库的查询操作。
接下来,我们需要创建一个 MyBatis 的配置文件:
|
|
在这个配置文件中,我们配置了数据库的连接信息和映射器接口的位置。
最后,我们需要创建一个测试类,来测试我们的映射器接口:
|
|
在这个测试类中,我们通过 MyBatisSqlSessionFactory 创建了一个 SqlSession 对象,然后创建了一个 UserMapper 的实例,最后调用了 findById 方法,完成了对数据库的查询操作。
在这个例子中,我们并没有显式地使用 SqlNode 和 SqlSource,但是在 MyBatis 的内部,它们是核心处理层的两个重要组件。当我们调用 SqlSession 的 selectOne 方法时,MyBatis 会根据映射器方法创建一个 SqlSource 对象,然后调用 SqlSource 的 getBoundSql 方法来生成一个 BoundSql 对象。BoundSql 对象包含了完整的 SQL 语句和参数信息。接下来,MyBatis 会根据 BoundSql 对象生成一个 Statement 对象,最后执行 Statement 对象,完成对数据库的操作。
在这个例子中,由于我们使用了注解来定义映射器接口,因此 MyBatis 会自动创建一个 DynamicSqlSource 对象,来表示动态 SQL。如果我们使用 XML 来定义映射器接口,那么 MyBatis 会根据 XML 文件创建一个 SqlNode 树,然后根据 SqlNode 树来创建一个 SqlSource 对象。
- 原文作者:知识铺
- 原文链接:https://geek.zshipu.com/post/code/docs/Mybatis/%E6%A0%B8%E5%BF%83%E5%A4%84%E7%90%86%E5%B1%82/2SqlNode%E5%92%8CSqlSource/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com