hello,大家好,我是徐先生!
今天我就和大家来谈谈关于使用mybatis的一些感悟。
- 对mybatis是否了解?
mybatis是一个持久层ORM框架。 - mybatis和jdbc的区别?
a. mybatis是持久层框架,底层是对jdbc的封装,jdbc是Java操作数据库的API。
b. 使用JDBC时需要连接数据库,注册驱动和数据库信息,工作量大,每次都要去创建、获取、关闭JDBC编程时所发生的异常,并进行捕获处理。并正确关闭资源对象关闭映射(ORM)。具体是操作Connection,打开Statement对象,通过Statement执行SQL到ResultSet中,然后通过代码转化为具体的POJO对象,关闭数据库的相关资源。Mybatis使用已有的连接池管理,避免资源浪费,提高了程序的可靠性。
c. Mybatis提供了DAO层自动生成工具mybatis-generator,提高了编码效率和准确性。
d. Mybatis提供了一级缓存和二级缓存,提高了性能。
e.Mybatis提供了动态SQL语句编写,提高了维护性和防止SQL注入。
f. Mybatis提供映射标签,对数据库操作结果映射到POJO对象或Map中,支持对象和数据库的ORM映射关系。
g. Mybatis将SQL语句写入到XML中,便于SQL语句的管理和优化,解决了SQL和程序代码之间的耦合。
h. JDBC向SQL语句传参数麻烦,因为SQL语句的where条件不一定,可能多也可能少,占位符和参数需要一一对应。mybatis会自动将Java对象映射到SQL语句中(比如,当查询的时候,用户输入了什么参数,就是用什么作为条件,没输入的参数就应当过滤掉等)。 - Mybatis和Hibernate的区别。
- Mybatis中#{}和KaTeX parse error: Expected 'EOF', got '#' at position 25: …都在SQL中动态的传入值,能用#̲{}就不要用{}。
①#{}解析之后会将String类型的数据自动加上引号,其他数据类型不会。常用于where条件。例如,#{name}解析之后可能就会成为#{‘abc’}。而 解 析 之 后 是 什 么 就 是 什 么 , 它 不 会 当 做 字 符 串 处 理 , 一 般 用 于 传 入 数 据 库 对 象 , 常 用 于 传 入 表 名 和 o r d e r b y 条 件 , 例 如 , {}解析之后是什么就是什么,它不会当做字符串处理,一般用于传入数据库对象,常用于传入表名和order by条件,例如, 解析之后是什么就是什么,它不会当做字符串处理,一般用于传入数据库对象,常用于传入表名和orderby条件,例如,{column}解析之后就是order by id。
②#{}解析为一个JDBC预编译语句(prepared Statement)的参数标记符,一个#{}被解析为一个参数占位符“?”,而KaTeX parse error: Expected 'EOF', got '#' at position 45: …将会进行变量替换。 ③基于②,#̲{}很大程度上可以防止SQL注…{}主要用于SQL拼接的时候,有很大的SQL注入隐患。 - 谈谈Mybatis的一级,二级缓存。
① Mybatis的一级缓存是基于sqlSession级别的。当Session flush后close之后,该Session中的所有Cache就会被清空。默认一级缓存是打开的,与有没有配置无关,只要sqlSession存在,Mybatis的一级缓存就会存在。
②一级缓存失效的原因:⑴是否在同一个sqlSession连接中。⑵如果进行了增删改查操作,程序会clear缓存。⑶手动清空缓存数据,调用sqlSession.clearCache()。⑷执行语句的参数不同,缓存中也不存在数据。因为map中的key是根据mapperStatement