2018-03-05
mybatis-主要内容
mybatis 评论:0 浏览:116

转载请注明出处:https://oldnoop.tech/c/127.html

介绍

mybatis是对jdbc的封装,是一个dao层的框架

将面向sql的操作转变成面向对象的操作

核心类

SqlSessionFactory, SqlSession, Mapper接口类

与spring集成使用 SqlSessionFactoryBean, MapperScannerConfigurer

配置文件

配置文件和映射文件

配置文件引入映射文件

映射文件定义sql

Sql语句使用sql,select,insert,update,delete等标签,引入sql使用include 标签

sql的输入参数类型使用pamaterType,parameterMap

返回结果类型使用resultType,resultMap

 

动态sql

使用 where,set 可以动态处理and,或者逗号的拼接逻辑

使用if,choose,when,otherwise进行判断

 

连接查询

使用association关联一对一,多对一,

使用 collection 关联一对多

 

特殊字符

处理特殊字符,使用<![CDATA[  ]]> 包起来,也可以使用转义字符

可以使用生成器生成实体类,映射文件,Mapper接口类

 

获得自增长的主键

Mysql使用SELECT LAST_INSERT_ID()

Oracle 使用 select 序列.NEXTVAL from dual

与ibatis不同,

ibatis的插入方法返回值是生成的id,

mybatis 插入方法返回值是插入的数据条数,生成的id封装在插入的参数实体类对象中

 

分页

直接在sql语句中进行分页,分页参数 通过Mapper接口类参数传递进来

Mysql:

使用limit分页

Oracle:

使用rownum

 

like

Mysql:

like concat('%',${ }, '%')

oracle:

like '%'||${ }||'%'

 

${}和#{}的区别

${}是变量占位符,相当于是简单的字符串替换,也就是简单的字符串拼接

#{}是预编译sql语句的参数占位符,会将参数的值传进来

是否支持一对一,一对多查询

通过association配置一对一,collection配置一对多

 

mybatis优化

  1. 尽量减少 if, choose when otherwise等判断语句的使用

会造成sql中大量的空格,增加请求数据库的数据量

也会影响数据库对sql的解析速度

  1. 尽量使用#{},避免使用${}

会导致数据库的数据类型的解析,降低执行的速度

因为${}相当于简单的字符串拼接,比如字符串字段,拼接后sql语句中就成为数字,数据库解析sql的时候,会尝试做类型转换

  1. 批量插入,使用mybatis的批量插入,

主要使用foreach 标签,传入list对象

 

延迟加载

Mybatis仅支持association关联对象和collection关联集合对象的延迟加载

association指的就是一对一,collection指的就是一对多查询。

在Mybatis配置文件中,可以配置是否启用延迟加载

lazyLoadingEnabled=true|false

 

批量插入

mybatis支持批量查询,可以提高插入的速度

Mysql配置

<insert id="" useGeneratedKeys="true" parameterType="java.util.List">  

    <selectKey resultType="long" keyProperty="id" order="AFTER">  

        SELECT LAST_INSERT_ID()  

    </selectKey>  

    insert into 表名 (字段1,字段2,...字段n)   

    values  

    <foreach collection="list" item="item" index="index" separator="," >  

        (#{},#{},...,#{item.flag})  

    </foreach>  

</insert>

Oracle配置

<insert id="" parameterType="java.util.List">   

  insert into 表名 (字段1,字段2,...,字段n)   

 <foreach close=")" collection="list" item="item" index="index" open="(" separator="union">   

select  

#{,jdbcType=VARCHAR},  

#{,jdbcType=VARCHAR},  

#{,jdbcType=VARCHAR}  

from dual   

</foreach>  

</insert>

 

mybatis缓存

Mybatis的一级缓存是指SqlSession。一级缓存的作用域是一个SqlSession。Mybatis默认开启一级缓存。

在同一个SqlSession中,执行相同的查询SQL,第一次会去查询数据库,并写到缓存中;第二次直接从缓存中取。当执行SQL时两次查询中间发生了增删改操作,则SqlSession的缓存清空。

Mybatis的二级缓存是指mapper映射文件。二级缓存的作用域是同一个namespace下的mapper映射文件内容,多个SqlSession共享。Mybatis需要手动设置启动二级缓存。

在同一个namespace下的mapper文件中,执行相同的查询SQL,第一次会去查询数据库,并写到缓存中;第二次直接从缓存中取。当执行SQL时两次查询中间发生了增删改操作,则二级缓存清空。



  • 转载请注明出处:https://oldnoop.tech/c/127.html

Copyright © 2018 oldnoop.tech. All Rights Reserved

鄂ICP备2023022735号-1