Mybatis学习笔记

1.什么是ORM?ORM的工作原理?

        ①ORM是对象关系映射,是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。

        ②

 

2.了解什么是ORM 半自动框架

  • ORM:Object Relational Mapping(对象关系映射),能在数据库和对象之间作映射处理
  • 使用JDBC操作数据库必须手动进行数据库和对象之间的转换,而ORM框架能自动进行对象和数据库数据的转换
  • ORM框架代替了JDBC技术

3.MyBatis工作原理?

        mybatis主要工作流程分为以下四个步骤:

                1.获取sqlSessionFactory对象
                2.获取sqlSession对象
                3.获取mapper接口的代理对象(MapperProxy)
                4.执行增删改查方法

                #mybatis架构分层图

在这里插入图片描述

 

#步骤一:获取sqlSessionFactory对象

根据配置文件创建SqlSessionFactory
#步骤二:获取sqlSession对象
在这里插入图片描述
#步骤3:获取mapper接口的代理对象(MapperProxy)
在这里插入图片描述
#步骤四:执行增删改查方法
在这里插入图片描述
#查询方法总结流程图
在这里插入图片描述

4. SQLSessionFactory 、 SQLSession 作用

         每一个线程都应该有一个自己的 SqlSession 实例,并且该实例是不能被共享的 同时, SqlSession 实例也是线程不安全的

        1.SQLSessionFactory      

                        1.SqlSessionFactory是MyBatis的关键对象,它是个单个数据库映射关系经过编译后的内存镜像。

                        2.SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象类获得,而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。

                        3.每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。

                        4.SqlSessionFactory是线程安全的,SqlSessionFactory一旦被创建,应该在应用执行期间都存在。在应用运行期间不要重复创建多次,建议使用单例模式。

                        5.SqlSessionFactory是创建SqlSession的工厂。

        2.SQLSession             

                1.SqlSession是MyBatis的关键对象,是执行持久化操作的独享,类似于JDBC中的Connection。

                2.它是应用程序与持久层之间执行交互操作的一个单线程对象,也是MyBatis执行持久化操作的关键对象。

                3.SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法,它的底层封装了JDBC连接,可以用SqlSession实例来直接执行被映射的SQL语句。

                4.每个线程都应该有它自己的SqlSession实例。

                5.SqlSession的实例不能被共享,同时SqlSession也是线程不安全的,绝对不能讲SqlSeesion实例的引用放在一个类的静态字段甚至是实例字段中。也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Servlet当中的HttpSession对象中。

                6.使用完SqlSeesion之后关闭Session很重要,应该确保使用finally块来关闭它。

5. MyBatis的映射文件的主要元素(insert、update、select、delete、cache、resultMap)

  • resultMap:SQL语句返回值结果集,被称为最强大的元素
  • sql:可以被其他语句引用的sql片段,一般使用标签
  • select:映射查询语句
  • insert:映射插入语句
  • update:映射更新语句
  • delete:映射删除语句
  • cache:该命名空间的缓存配置
  • cache-ref:引用其他命名空间的缓存配置

        示例

                <select id="selectById" parameterType="integer" resultType="com.evader.pojo.User">

                        select * from User where id = #{id}

                </select>

6. MyBatis的映射文件的四种引入方式

  • 1.用文件路径引入映射器
    • <mappers> <mapper resource="com/szd/mybatis/mapper/RoleMapper.xml"/> </mappers>
  • 2.用包名引入映射器
    • <mappers> <package name="com.szd.mybatis.mapper"/> </mappers>
  • 3.用类注册引入映射器
    • <mappers> <mapper class="com.szd.mybatis.RoleMapper"/> <mapper class="..."/> ... </mappers>
  • 4.用URL引入映射器
    • <mappers> <mapper url="file:///var/mappers/com/szd/mybatis/mapper/RoleMapper.xml" /> <mapper url="..." /> ... </mappers>

7. MyBatis的配置文件 mybatis-cfg.xml (数据库配置信息、 typeAlias)

 通过 typeAliases 别名来设置,简化复杂度

8.RequestMap 和 RequestType 的区别。

        RequestType是直接返回类型,而RequestMap是对外部RequestMap的引用,当有些复杂查询用RequestType,把参数当做一个对象没有办法完成时,可以用RequestMap来当做集合去完成。

9. ParameterType是做什么用的?

parameterType: 接口中方法参数的类型, 类型的完全限定名或别名。这个属性是可选的,因为 MyBatis可以推断出具体传入语句的参数,默认值为未设置(unset)。接口中方法的参数从 java 代码传入到mapper 文件的 sql 语句。

10. 中 keyProperties 、KeyColum、useGenaratedKeys 三个属性的含义

keyProperty(仅对insert和update有用)此属性的作用是将插入或更新操作时的返回值赋值给PO类的某个属性,通常会设置为主键对应的属性。如果需要设置联合主键,可以在多个值之间用逗号隔开。

useGeneratedKeys(仅对insert和update有用)此属性会使MyBatis使用JDBC的getGeneratedKeys()方法来获取由数据库内部生产的主键,如MySQL和SQLServer等自动递增的字段,其默认值为false。

当使用的数据库不支持主键自动增长(如Oracle),或者支持增长的数据库取消了主键自增的规则时,也可用MyBatis提供的另一种方式来自定义生成主键,具体配置实例如下。

<insert id="insertClass" parameterType="xx.xx.xx">
        <selectKey keyProperty="id" resultType="Integer" order="BEFORE">
            select if(max(id) is null, 1, max(id) +1) as newId from tableName
        </selectKey>
        insert into tableNme (id,attribute1,attribute2,attribute3)
        values(#{id},#{value1},#{value2},#{value3},)
</insert>
 

keyColumn(仅对insert和update有用)此属性用于设置第几列是主键,当主键不是表中的第一列时需要设置。在需要联合主键时,值可以用逗号隔开。

11. MyBatis使用传入参数的时候,#{}, ${}的区别是什么?

${ } 的变量的替换阶段是在动态 SQL 解析阶段,而 #{ }的变量的替换是在 DBMS 中。

#{}与${}的区别可以简单总结如下:

  • #{}将传入的参数当成一个字符串,会给传入的参数加一个双引号
  • ${}将传入的参数直接显示生成在sql中,不会添加引号
  • #{}能够很大程度上防止sql注入,${}无法防止sql注入

  ${}在预编译之前已经被变量替换了,这会存在sql注入的风险。

  • ${}一般用于传输数据库的表名、字段名等
  • 能用#{}的地方尽量别用${}

(1) #{}为参数占位符?,即SQL预编译。${}为字符串替换,即SQL拼接,可以理解为仅仅是个纯碎的string替换,在动态SQL解析阶段将会进行变量替换。

(2) #{}是“动态解析->预编译->执行”的过程。${}是“动态解析->编译->执行”的过程。

(3) #{}的变量替换是在DBMS中。${}的变量替换是在DBMS外。

(4) 变量替换后,#{}对应的变量自动加上引号。变量替换后,${}对应的变量不会加上引号。

(5) #{}能防止SQL注入。${}不能防止SQL注入。

11.动态SQL ()

动态 SQL 是 MyBatis 的强大特性之一。在 JDBC 或其它类似的框架中,开发人员通常需要手动拼接 SQL 语句。根据不同的条件拼接 SQL 语句是一件极其痛苦的工作。例如,拼接时要确保添加了必要的空格,还要注意去掉列表最后一个列名的逗号。而动态 SQL 恰好解决了这一问题,可以根据场景动态的构建查询。
Mybatis 动态 sql 可以让我们在 Xml 映射文件内,以标签的形式编写动态 sql,完成逻辑判断和动态拼接 sql 的功能

元素作用备注
if判断语句单条件分支判断
choose(when、otherwise)相当于 Java 中的 switch case 语句多条件分支判断
trim,where辅助元素用于处理一些SQL拼装问题
foreach循环语句在in语句等列举条件常用
bind辅助元素拼接参数

        

        动态 sql 的执行原理?

                原理为:使用 OGNL 从 sql 参数对象中计算表达式的值,根据表达式的值动态拼接 sql,以此来完成动态 sql 的功能

12.了解动态SQL( )

        可以自己看书。

13.如何实现MyBatis一对一映射关系

        参考 (31条消息) MyBatis的一对一映射_mybatis一对一映射标签_文丑颜不良啊的博客-CSDN博客icon-default.png?t=N5F7https://blog.csdn.net/jiaomubai/article/details/108001326 

14.如何实现MyBatis一对多映射关系 (标记中,ofType和javaType区别)

        主要内容看书就行。

        javaType用来指定对象所属的java数据类型,也就是private List<Post>posts 的ArrayList类型
        ofType用来指定对象的所属javaBean类,也就是尖括号的泛型private List<Post>posts

15.了解如何实现MyBatis多对多映射关系

        看书就行。

16. 了解 MyBatis-plus 的特性。

  1. 依赖少:仅仅依赖 Mybatis 以及 Mybatis-Spring 。
  2. 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作 。
  3. 预防Sql注入:内置 Sql 注入剥离器,有效预防Sql注入攻击 。
  4. 通用CRUD操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求 。

强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求

支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错

支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题

支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作

支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )

内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用

内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询

分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库

内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询

内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值