mybatis和hibernate的本质区别和应用场景
1.本质区别:
hibernate:是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序员写sql,sql语句自动生成了。对sql语句进行优化、修改比较困难的。
mybatis:专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。
2.应用场景:
hibernate的应用场景:
适用与需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa。
mybatis的应用场景:
适用与需求变化较多的项目,比如:互联网项目(京东、淘宝。。)
企业进行技术选型,以低成本高回报作为技术选型的原则,根据项目组的技术力量进行选择。
${}和#{}区别
#{key}相当于sql语句中的占位符?,类似PrepareStatement使用方式,可有有效避免SQL注入的问题。
#{key}
若parameterType是简单数据类型,此处的key可以任意编写,例如:value、str等;
若parameterType是pojo类型,此处key尽量与pojo的属性名一致,例如:name、id等;
若parameterType是hashmap类型,此处key尽量与hashmap的键名字一致。
${key}
拼接sql语句,类似于Statement使用方式,会造成SQL注入问题。
若parameterType简单数据类型,{}里面只能是value,即${value}
当传参时,类似于' or 1=1 or '结构,则会造成SQL注入
编写mybatis的xml文档的易错点
一对一关联使用association标签,
1.property属性:与type指定的类中,一对一关联的属性名一致2.javaType属性:与type指定的类中,一对一关联的属性类型一致
一对多映射关系使用collection标签
2.property属性:与type指定的类中,一对多关联的属性名一致2.ofType属性:与type指定的类中,一对多关联的属性的类型一致
主要两个标签的第二个属性,容易混淆
3.异常信息:Error creating lazy proxy. Cause: java.lang.NullPointerException: Cannot invoke "java.lang.reflect.AccessibleObject.setAccessible(boolean)" because "ao" is null
懒加载出现异常
原因:mybatis版本过低
我们需要把mybatis的包换成Mybatis-3.5.1.jar及其以上的版本