Mybatis 详解篇 一

1.为什么使用Mybatis

无论是Mybatis、Hibernate都是ORM的一种实现框架,都是对JDBC的一种封装!
在这里插入图片描述

2.基本原理

  1. 应用程序找Mybatis要数据
  2. mybatis从数据库中找来数据
    2.1 通过mybatis-config.xml 定位哪个数据库
    2.2 通过Category.xml执行对应的select语句
    2.3 基于Category.xml把返回的数据库记录封装在Category对象中
    2.4 把多个Category对象装在一个Category集合中
  3. 返回一个Category集合
    在这里插入图片描述

3.基本原理

  1. 通过Reader对象读取Mybatis配置文件

  2. 通过SqlSessionFactoryBuilder对象创建SqlSessionFactory对象

  3. 获取当前线程的SQLSession

  4. 事务默认开启

  5. 通过SQLSession读取映射文件中的操作编号,从而读取SQL语句

  6. 提交事务

  7. 关闭资源

4.学习过程

框架的学习无非三个过程:

  1. 引入jar包
  2. 编写配置文件
  3. 熟悉API

5.CRUD

在合适的位置正确的写SQL语句就行了
值得注意的是:

  • 这个insert/update/delete标签只是一个模板,在做操作时,其实是以SQL语句为核心的即在做增/删/时,insert/update/delete标签可通用,但做查询时只能用select标签,我们提倡什么操作就用什么标签。

6.动态SQL

如果嵌入的SQL没有明确给出,如在Java中定义了一个字符串类型的变量sql:String sql;,然后采用preparedStatement对象的execute方法去执行这个sql,该sql的值可能等于从文本框中读取的一个SQL或者从键盘输入的SQL,但具体是什么,在编译时无法确定,只有等到程序运行起来,在执行的过程中才能确定,这种SQL叫做动态SQL。

7.映射文件

  1. 占位符
    在Mybatis中,有两种占位符:

    • #{}解析传递进来的参数数据
    • ${}对传递进来的参数原样拼接在SQL中
  2. 主键
    我们一般插入数据的话,如果我们想要知道刚刚插入的数据的主键是多少,我们可以通过以下的方式来获取:
    通过LAST_INSERT_ID()获取刚插入记录的自增主键值,在insert语句执行后,执行select LAST_INSERT_ID()就可以获取自增主键。

  3. resultMap
    我们数据表的字段和JavaBean的属性名称不是相同时,我们就需要使用resultMap
    在这里插入图片描述

  4. resultMap和resultType区别

    resultType :指定输出结果的类型(pojo、简单类型、hashmap…),将sql查询结果映射为java对象 。

    使用resultType注意:sql查询的列名要和resultType指定pojo的属性名相同,指定相同 属性方可映射成功,如果sql查询的列名要和resultType指定pojo的属性名全部不相同,list中无法创建pojo对象的。

    resultMap:将sql查询结果映射为java对象。

5. resultType和resultMap用法总结

  1. resultType:

作用:

将查询结果按照sql列名pojo属性名一致性映射到pojo中。

场合:

常见一些明细记录的展示,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。

  1. resultMap:

使用association和collection完成一对一和一对多高级映射。

  1. association:

作用:

将关联查询信息映射到一个pojo类中。

场合:

为了方便获取关联信息可以使用association将关联订单映射为pojo,比如:查询订单及关联用户信息。

  1. collection:

作用:

将关联查询信息映射到一个list集合中。

场合:

为了方便获取关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块和功能,可使用collection将模块和功能列表映射到list中。

6.配置文件

在这里插入图片描述
延迟加载:

在进行数据查询时,为了提高数据库查询性能,尽量使用单表查询,因为单表查询比多表关联查询速度要快。

如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,再关联查询,当需要关联信息再查询这个叫延迟加载。

在Mybatis中延迟加载就是在resultMap中配置具体的延迟加载…

7.其他

  • 如果sql查询列名和最终要映射的pojo的属性名不一致,使用resultMap将列名和pojo的属性名做一个对应关系 (列名和属性名映射配置)

  • Mybatis的SQLSession工具类使用ThreadLocal来对线程中的Session来进行管理。

  • Mybatis的事务默认是开启的,需要我们手动去提交事务。

  • Mybatis的SQL语句是需要手写的,在程序中通过映射文件的命名空间.sql语句的id来进行调用!

  • 在Mybatis中,增删改查都是需要我们自己写SQL语句的,然后在程序中调用即可了。SQL由于是我们自己写的,于是就相对Hibernate灵活一些。

  • 如果需要传入多个参数的话,那么我们一般在映射文件中用Map来接收。

  • Mybatis也支持一些判断标签,于是我们就可以通过这些标签来完成动态CRUD的操作了。

  • 值得注意的是,我们的sql片段代码是需要我们自己手动去分割,号的。

  • 在程序中调用的SQL语句是由映射文件的命令空间+sql片段的id所组成的。它内部会生成一个Statement对象的。

  • 在使用别名的时候,可以指定包名,在使用总配置文件加载映射文件时,也可以指定包名。

  • 主键如果需要返回的话,使用selectKey 标签即可。UUID也可以返回。在Oracle的话,是使用序列来返回自动增长的主键的。

  • 占位符有两种,一种是解析传递进来的参数数据、一种是原样输出传递进来的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值