MyBatis 是一种优秀的持久层框架,它是一个基于 Java 的 半ORM(对象关系映射)
框架,可以使用简单的 XML 或注解配置来映射原始类型、Map 和 Java 对象(POJO)到数据库表中的记录。
MyBatis 支持自定义 SQL
、存储过程和高级映射,可以将复杂的 JDBC 代码封装起来,使开发者只需要关注 SQL
语句的编写和映射关系的配置,从而大大简化了数据库访问的开发工作。
MyBatis 的主要优点包括:易于使用、灵活性强、可以自定义 SQL
、支持多种数据库、性能优秀等。
缺点是:对于复杂的 SQL
还是需要自己手动编写,这就对码农的 SQL 功底有着较高的要求了,而且它的 SQL
语句非常依赖数据库,这就使得可能这个数据库可以用的 SQL
换一个数据库就不行了。
ORM
说白了就是建立数据库字段和 Java对象(POJO)
的一种映射关系技术,
而 Mybatis
由于建立这种映射需要我们手动编写 SQL
, 所以说它是半自动的。
因为 JDBC
有下面几个缺点:
SQL
写在代码里面不好维护。一句话就是,JDBC
使用起来麻烦,不如 Mybatis
方便。
在 MyBatis 中,$
和 #
是两种不同类型的占位符,用于在 SQL 语句中引用参数或表达式,但它们的行为有一些重要区别:
$
占位符(String Substitution):
$
用于字符串替换,直接将参数的值嵌入 SQL 语句中,不使用预编译机制。$
不提供参数安全性,可能会导致 SQL 注入风险。$
。select * from ${tableName}
中 ${tableName}
会被替换成实际的表名。#
占位符(Parameterized):
#
用于预编译参数,会将参数值传递给数据库的预编译语句,提供参数安全性。#
通常在查询条件、插入、更新或删除操作时使用。select * from table where column = #{value}
中 #{value}
会被替换成参数值,并使用预编译机制传递给数据库。Hibernate 和 MyBatis 都是 Java 中常用的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到数据库表中。
虽然它们都可以用于实现数据库访问,但是它们有一些区别:
综合来说:
还有很多其他的标签,
、
、
、
、
,
加上动态 sql 的 9 个标签,trim|where|set|foreach|if|choose|when|otherwise|bind
等,
为 sql 片段标签,通过
标签引入 sql 片段,
是不支持【自增的主键生成策略】标签。在最佳实践中,通常一个 xml
映射文件,都会写一个 Dao 接口与之对应。( xml
<–> Mapper
)
Dao 接口就是人们常说的 Mapper
接口。
namespace
的值,MappedStatement
的 id 值,Mapper
接口是没有实现类的,当调用接口方法时,【接口全限名 + 方法名】拼接字符串作为 key 值,可唯一定位一个 MappedStatement
,
举例:com.mybatis3.mappers.StudentDao.findStudentById
,可以唯一找到 namespace 为 com.mybatis3.mappers.StudentDao
下面 id = findStudentById
的 MappedStatement
。
在 MyBatis 中,每一个 、
、
、
标签,都会被解析为一个 MappedStatement
对象。
Dao 接口里的方法可以重载,但是 Mybatis 的 xml 里面的 ID 不允许重复。
还需要满足两个条件:
@Param
注解,或者使用 param1
这种。注意:Mybatis 的 Dao 接口可以有多个重载方法,但是多个接口对应的映射必须只有一个,否则启动会报错。
使用 MyBatis 而不直接使用 SQL 有以下几个优势:
综上所述,使用 MyBatis 可以简化数据库访问的过程,提高代码的可维护性和安全性,并提供更多功能和便利性,使得数据库操作更加优雅和高效。
MyBatis 提供了一级缓存和二级缓存来提高数据库访问性能和减少重复查询的次数。
需要注意的是,虽然缓存可以提高性能,但也会带来一致性的问题。当数据库中的数据发生变化时(比如更新、插入、删除操作),缓存中的数据可能会变得过时,这就需要考虑如何合理地处理缓存的刷新策略,以保证数据的一致性。
因此,在使用 MyBatis 的缓存时,需要根据具体的业务场景和需求,灵活地选择是否开启缓存,以及采用合适的缓存策略,以达到最佳的性能和数据一致性。
SqlSession
是 MyBatis 中的一个核心接口,它提供了对数据库的操作方法,允许应用程序与数据库进行交互。
SqlSession
是在 MyBatis 的配置文件中通过 SqlSessionFactory
创建的,每个线程通常会有一个独立的 SqlSession
实例,用于执行数据库操作。
SqlSession
接口中定义了许多方法,其中一些重要的方法包括:
SqlSession
实例。SqlSession
提供了对数据库的各种操作,通过执行 SQL 语句实现了数据的增删改查功能。在执行 SQL 语句时,SqlSession
会通过 Mapper
接口(或 XML 映射文件)找到对应的 SQL 语句,并将传入的参数映射到 SQL 中执行。
通常情况下,一个 SqlSession
实例对应一个数据库事务,事务的提交和回滚可以通过调用 commit()
和 rollback()
方法实现。一般情况下,我们会在一个业务逻辑方法中创建一个 SqlSession
实例,在该方法中执行数据库操作,然后提交或回滚事务,并最终关闭 SqlSession
。
注意:由于 SqlSession
是非线程安全的,因此应该避免将它作为类成员变量或共享变量使用,而是应该在需要的时候创建新的实例,并在使用完毕后及时关闭。
Mapper
是 MyBatis 中用于定义数据访问接口的一种机制。
它通过 Java 接口的方式来描述数据库操作,包含了对数据库的增删改查等操作方法的定义,但不包含具体的 SQL 语句。具体的 SQL 语句是在对应的 XML 映射文件中实现的。
mybatis中大于等于小于等于的写法_mybatis大于小于-CSDN博客
MyBatis常见面试题总结 | JavaGuide(Java面试 + 学习指南)