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"指定把获取到的主键值注入到CustomerInfo的customer_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、批量删除