持久层框架Mybatis的一些事儿

hello,大家好,我是徐先生!
今天我就和大家来谈谈关于使用mybatis的一些感悟。

  1. 对mybatis是否了解?
    mybatis是一个持久层ORM框架。
  2. 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语句中(比如,当查询的时候,用户输入了什么参数,就是用什么作为条件,没输入的参数就应当过滤掉等)。
  3. Mybatis和Hibernate的区别。
  4. 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注入隐患。
  5. 谈谈Mybatis的一级,二级缓存。
    ① Mybatis的一级缓存是基于sqlSession级别的。当Session flush后close之后,该Session中的所有Cache就会被清空。默认一级缓存是打开的,与有没有配置无关,只要sqlSession存在,Mybatis的一级缓存就会存在。
    ②一级缓存失效的原因:⑴是否在同一个sqlSession连接中。⑵如果进行了增删改查操作,程序会clear缓存。⑶手动清空缓存数据,调用sqlSession.clearCache()。⑷执行语句的参数不同,缓存中也不存在数据。因为map中的key是根据mapperStatement

你可能感兴趣的:(笔记)