Mybatis 详解篇 一
1.为什么使用Mybatis
无论是Mybatis、Hibernate都是ORM的一种实现框架,都是对JDBC的一种封装!
2.基本原理
- 应用程序找Mybatis要数据
- mybatis从数据库中找来数据
2.1 通过mybatis-config.xml 定位哪个数据库
2.2 通过Category.xml执行对应的select语句
2.3 基于Category.xml把返回的数据库记录封装在Category对象中
2.4 把多个Category对象装在一个Category集合中 - 返回一个Category集合
3.基本原理
-
通过Reader对象读取Mybatis配置文件
-
通过SqlSessionFactoryBuilder对象创建SqlSessionFactory对象
-
获取当前线程的SQLSession
-
事务默认开启
-
通过SQLSession读取映射文件中的操作编号,从而读取SQL语句
-
提交事务
-
关闭资源
4.学习过程
框架的学习无非三个过程:
- 引入jar包
- 编写配置文件
- 熟悉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.映射文件
-
占位符
在Mybatis中,有两种占位符:- #{}解析传递进来的参数数据
- ${}对传递进来的参数原样拼接在SQL中
-
主键
我们一般插入数据的话,如果我们想要知道刚刚插入的数据的主键是多少,我们可以通过以下的方式来获取:
通过LAST_INSERT_ID()获取刚插入记录的自增主键值,在insert语句执行后,执行select LAST_INSERT_ID()就可以获取自增主键。 -
resultMap
我们数据表的字段和JavaBean的属性名称不是相同时,我们就需要使用resultMap -
resultMap和resultType区别
resultType :指定输出结果的类型(pojo、简单类型、hashmap…),将sql查询结果映射为java对象 。
使用resultType注意:sql查询的列名要和resultType指定pojo的属性名相同,指定相同 属性方可映射成功,如果sql查询的列名要和resultType指定pojo的属性名全部不相同,list中无法创建pojo对象的。
resultMap:将sql查询结果映射为java对象。
5. resultType和resultMap用法总结
- resultType:
作用:
将查询结果按照sql列名pojo属性名一致性映射到pojo中。
场合:
常见一些明细记录的展示,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。
- resultMap:
使用association和collection完成一对一和一对多高级映射。
- association:
作用:
将关联查询信息映射到一个pojo类中。
场合:
为了方便获取关联信息可以使用association将关联订单映射为pojo,比如:查询订单及关联用户信息。
- 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的话,是使用序列来返回自动增长的主键的。
-
占位符有两种,一种是解析传递进来的参数数据、一种是原样输出传递进来的数据。