MyBatis是一个一流的持久化框架,支持自定义SQL、存储过程和高级映射。
MyBatis几乎消除了所有的JDBC代码,手动设置参数和检索结果的步骤。
MyBatis可以使用简单的XML或注解进行配置,将基本类型、Map接口和Java POJO(普通的Java对象)映射到数据库记录。
MyBatis是一个一流的持久化框架,支持自定义SQL、存储过程和高级映射。
MyBatis几乎消除了所有的JDBC代码,手动设置参数和检索结果的步骤。
MyBatis可以使用简单的XML或注解进行配置,将基本类型、Map接口和Java POJO(普通的Java对象)映射到数据库记录。
要使用MyBatis,您只需要将mybatis-x.x.x.jar文件包含在类路径中。
如果您正在使用Maven,只需将以下依赖项添加到您的pom.xml文件中:
org.mybatis
mybatis
x.x.x
这些是可外部化的、可替换的属性,可以在典型的 Java Properties 文件实例中配置,或通过 properties 元素的子元素传入。
例如:
动态 SQL 是 MyBatis 的强大特性之一。
如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。
利用动态 SQL,可以彻底摆脱这种痛苦。
使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。
如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。
在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。
既然你已经知道如何配置 MyBatis 以及如何创建映射,是时候来尝点甜头了。
MyBatis 的 Java API 就是这个甜头。
稍后你将看到,和 JDBC 相比,MyBatis 大幅简化你的代码并力图保持其简洁、容易理解和维护。为了使得 SQL 映射更加优秀,MyBatis 3 引入了许多重要的改进。
在我们深入 Java API 之前,理解关于目录结构的最佳实践是很重要的。
MyBatis 非常灵活,你可以随意安排你的文件。但和其它框架一样,目录结构有一种最佳实践。
让我们看一下典型的应用目录结构:
Java 程序员面对的最痛苦的事情之一就是在 Java 代码中嵌入 SQL 语句。
这通常是因为需要动态生成 SQL 语句,不然我们可以将它们放到外部文件或者存储过程中。
如你所见,MyBatis 在 XML 映射中具备强大的 SQL 动态生成能力。
但有时,我们还是需要在 Java 代码里构建 SQL 语句。
此时,MyBatis 有另外一个特性可以帮到你,让你从处理典型问题中解放出来,比如加号、引号、换行、格式化问题、嵌入条件的逗号管理及 AND 连接。
确实,在 Java 代码中动态生成 SQL 代码真的就是一场噩梦。
insert into user ( user_name )
values (#{user#userName})
SELECT LAST_INSERT_ID()
本来 springboot 配置 mysql 配置正常,后来新加入了其他数据源,发现报错:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。
由于它的异常强大,映射器的 XML 文件就显得相对简单。
如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。
MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。
SQL 映射文件只有很少的几个顶级元素(按照应被定义的顺序列出):
cache – 该命名空间的缓存配置。
cache-ref – 引用其它命名空间的缓存配置。
resultMap – 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
parameterMap – 老式风格的参数映射。此元素已被废弃,并可能在将来被移除!请使用行内参数映射。文档中不会介绍此元素。
sql – 可被其它语句引用的可重用语句块。
insert – 映射插入语句。
update – 映射更新语句。
delete – 映射删除语句。
select – 映射查询语句。
今天使用 mybatis 查询列表,结果查出的是一个有 size 的列表,但是内容都是 null
。
最先想到的是 sql 有问题,执行了一遍发现结果是有值的。
网上还有一种说法,说是使用了继承。
导致反射可能没有值,看了下代码,model 类是没有继承的。
后来看了一遍文章,
只有当数据库表中的字段名称与实体类中的属性名称完全相同,才能直接使用 resultType
返回类型,后面跟上该实体类的名称。