Mybatis整理

 

1、首先,Mybatis与Hibernate的区别

  1.1、Mybatis不是一个完整的ORM框架

  ORM大概的意思就是“对象关联映射”,Hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。

  而Mybatis仅有基本的字段映射,对象数据以及对象实际关系任然需要通过手动编写sql来实现和管理。

  1.2、Hibernate数据库移植性远大于Mybatis

  Hibernate通过它强大的映射结构和hql语言,大大降低了对象与数据库的耦合性,由于Mybatis需要手动编写sql语句,就导致它的移植性比较差。

  1.3、Hibernate拥有完整的日志系统,Mybatis欠缺一些

  hibernate日志系统非常健全,涉及广泛,包括:sql记录、关系异常、优化警告、缓存提示、脏数据警告等;

  而mybatis则除了基本记录功能外,功能薄弱很多。

  1.4、Mybatis简单,易上手。Hibernate则配置比较复杂,学习成本高

  1.5、sql优化,Mybatis比Hibernate方便的多

  由于Mybatis的sql都是写在mapper.xml里,所有sql优化比Hibernate方便的多。

  而Hibernate的sql大多都是自动生成的,无法直接维护。虽然有hql,但是hql的功能不及sql强大,遇到一些复杂的统计时hql会有局限性。

  虽然Hibernate也支持原生的sql,但开发模式却与ORM不同,使用起来不是很方便。

2、     Mybatis注意事项整理

  2.1、Mybatis映射文件参数传递

  

  注意:接口中有多个传参的时候,可以使用@Param注解

   

  注意:@Param注解导入的是Mybatis的jar包,不是springframework的jar包

  

  接下来,看下Mybatis的mapper.xml配置文件

  

  1:未使用@Param注解时,用数组的方式取值

   2:这里获取表名称的值是使用$符号获取,而不是#符号获取

  

  1:接口参数包含多个,且有对象类型的参数时的调用方式

        2:if条件判断需要使用对象参数的调用方式

  

  2.2、${}与#{}区别

    2.2.1、描述

    #{}:占位符号,好处是防止sql注入

    ${}:sql拼接符号,只是简单的字符串替换

    2.2.2、具体分析

    动态sql是mybatis的强大特性之一,mybatis在对sql语句进行预编译之前,会对sql进行动态解析,在动态解析时,#{}和${}所表现的形式会有所不同。 

    例如:#{}

    

    动态解析之后:

    

    一个#{}被解析成一个参数占位符?。

    而${}则仅仅是一个纯粹的字符串的替换,在动态sql解析阶段将会进行变量替换。

    例如:${}

    

    当我们传递的参数为“test”时,则解析成:

     

    在预编译之前的sql语句已经不包含变量了,完成已经是常量数据了。综上所述:

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

    2.2.3、使用

    1、在使用过程中,我们应该使用哪种方式呢?

    答案是:优先使用#{},因为${}的方式会存在sql注入的问题。例如:

    

    假如,我们的参数table_name的值是user;delete user; --,

    那么sql动态解析阶段,预编译之前的sql语句就将变成:

     

    -- 之后的的语句将作为注释,不起作用。因此本来一条查询语句,结果偷偷的包含了一个删除表数据的sql。  

    2、表名作为变量时,必须使用${},

     这是因为,表名是字符串,使用sql占位符替换字符串时会带上引号’’,这会导致sql语法错误。

    例如:

     

    预编译之后的sql语句变成:

     

    假如我们传入的参数table_name的值是”user”,operator_name的值为”test”,

    那么占位符进行变量替换之后的sql语句为:

   

    上述的sql语句存在语法错误,表名不能加上单引号’’

  2.3、sql语句的复用

    声明:

    

    引用:

    

  2.4、别名标签

     在映射文件中parameterType或者resultType时需要写类名的全路径,可以指定别名简化书写。

    mybatis中还有许多内置别名:

Alias

Mapped Type

_byte

byte

_long

long

_short

short

_int

int

_integer

int

_double

double

_float

float

_boolean

boolean

string

String

byte

Byte

long

Long

short

Short

int

Integer

integer

Integer

double

Double

float

Float

boolean

Boolean

date

Date

decimal

BigDecimal

bigdecimal

BigDecimal

object

Object

map

Map

hashmap

HashMap

list

List

arraylist

ArrayList

collection

Collection

iterator

Iterator

    

    

    

  

    1)自定义别名:

      在Mybatis的核心配置文件中配置别名

        

      使用:

        

       

         

      

      2)自定义别名:

        

      

      3)自定义别名:

        

      

    2.5、日志打印

在spring-mybatis.xml配置文件中加入以上配置,然后新增mybatis-config.xml配置文件

  

  注意:typeAliases标签要放在settings标签下面,因为configuration标签下的字标签是需要按照固定的顺序

  1)  日志打印:

  

  2)  日志打印:

  

  

  2.6、动态更新

  当进行数据库修改的时候 ,有时只需要修改表中的某几个字段 , 其他字段保持不变 , 这是就需要用到动态更新 , 不然会出现其他值为null的问题

  1)  方式一:

  

  注意: 字段后的“,” ,如果age为空 ,set标签会自动把name属性后的“,”去掉

  1)  方式二:

   

  trim标签有4个属性:

       prefix:在trim标签内sql语句加上前缀

  suffix:在trim标签内sql语句加上后缀
  suffixOverrides:去除多余的后缀内容
  prefixOverrides:去除多余的前缀内容

  2.7、动态查询

  

  注意:and加在字段前,当name字段为null时,where标签会自动去掉age前的and

   

  2.8、动态插入

   

  useGeneratedKeys设置为"true"表明要MyBatis获取由数据库自动生成的主键

  keyProperty="customer_id"指定把获取到的主键值注入到CustomerInfocustomer_id属性

   

  2.8、批量插入

  

  foreach属性:

属性

描述

item

循环体中的具体对象。支持属性的点路径访问,如item.age,item.info.details。 具体说明:在list和数组中是其中的对象,在map中是value。 该参数为必选。

collection

要做foreach的对象,作为入参时,List<?>对象默认用list代替作为键,数组对象有array代替作为键,Map对象用map代替作为键。 当然在作为入参时可以使用@Param("keyName")来设置键,设置keyName后,list,array,map将会失效。 除了入参这种情况外,还有一种作为参数对象的某个字段的时候。举个例子: 如果User有属性List ids。入参是User对象,那么这个collection = "ids" 如果User有属性Ids ids;其中Ids是个对象,Ids有个属性List id;入参是User对象,那么collection = "ids.id" 上面只是举例,具体collection等于什么,就看你想对那个元素做循环。 该参数为必选。

separator

元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。

open

foreach代码的开始符号,一般是(和close=")"合用。常用在in(),values()时。该参数可选。

close

foreach代码的关闭符号,一般是)和open="("合用。常用在in(),values()时。该参数可选。

index

在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。

  

 

  

 

 

 

 

 

 

 

 

 

  2.9、批量删除

     

原文地址:https://www.cnblogs.com/zl-wjzf/p/9647306.html