栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

为什么90%的开发者放弃使用Hibernate,而选择MyBatis?

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么90%的开发者放弃使用Hibernate,而选择MyBatis?

目录

一、SSM思维导图二、MyBatis是什么?三、hibernate与mybatis使用心得四、漫谈hibernate

1、hibernate优势2、hibernate劣势 五、mybatis特点六、mybatis中#和$的区别七、mybatis是如何防止sql注入的八、mybatis中的顶级标签

1、sql – 可被其他语句引用的可重用语句块2、insert – 映射插入语句3、update – 映射更新语句4、delete – 映射删除语句 九、动态sql标签

1、if2、choose (when, otherwise)3、trim (where, set)4、foreach5、bind6、xml中的timestamp比较7、@Param 十、批量插入十一、useGeneratedKeys参数

1、在settings元素中设置useGeneratedKeys参数2、在xml映射器中配置useGeneratedKeys参数3、在接口映射器中设置useGeneratedKeys参数 十二、MyBatis xml文件中postgres数据库字符串转timestamp写法十三、鉴别器十四、关注公众号哪吒编程,回复1024,获取Java学习资料,还有不定期的送书活动

一、SSM思维导图

二、MyBatis是什么?

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 Bean 映射成数据库中的记录。

三、hibernate与mybatis使用心得

springboot时代之前,持久层最流行的就是hibernate和mybatis了,hibernate对数据库进行了重量级的封装,hibernate的思想和Java不谋而合,都是对象的思想。听起来很友好,但配合使用的hql就不那么友好了,hql可以说是sql的简化版本,hql是在sql上面套了一层,但是hql优化很难搞,hibernate使用了大量的反射机制,虽然hibernate的反射大多数都是在程序初始化的时候完成的,但运行的过程中反射也是存在的,反射比较影响程序性能。

mybatis是持久层的轻量级框架,定义一个接口mapper,一个xml,映射关系一匹配,再配置一个扫描包,目前也是持久层的主流写法。

还有第三种方式DruidDataSource + JdbcTemplate,实现了在Java中直接书写sql语句,同时还能进行简单的对象操作。结合了hibernate和mybatis的部分优点,完美的产物?不存在的,到处都是sql,为以后的代码重构,框架重整,带来了不必要的麻烦,而且总感觉DruidDataSource + JdbcTemplate有一种lowlow的感觉。

四、漫谈hibernate 1、hibernate优势

hibernate让你不用写sql了,这不单可以让你的应用更好移植其它数据库,更主要的是让程序员更专注业务逻辑、数据关系、对象关系等。hibernate对一对多,多对多关系实现是非常好的。很关键一点,它支持lazy,可以让你的数据只在需要的时候被加载,听起来很完美。hibernate还有一个更牛的就是HQL,这是完全可以把查询映射到你OO模型的查询语言,和mybatis的映射比起来,还是更方便和更强大的。

2、hibernate劣势
    难以使用数据库的一些功能满足不了程序对cache的需求耦合度高debug难hibernate更新大批量数据难度高hibernate删除大批量数据难度高
五、mybatis特点
    简单易学:本身就很小且简单,没有任何第三方依赖,引入jar包,配置xml即可。灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。提供映射标签,支持对象与数据库的orm字段关系映射。提供对象关系映射标签,支持对象关系组建维护。提供xml标签,支持编写动态sql。
六、mybatis中#和$的区别

1、#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
如:where id=#{id},如果传入的值是1,那么解析成sql时的值为where id=“1”, 如果传入的值是id,则解析成的sql为where id=“id”。

2、将传入的数据直接显示生成在sql中。
如:where id=${id},如果传入的值是1,那么解析成sql时的值为where username=1;
如果传入的值是;drop table user;,则解析成的sql为:

select * from student where id=1;drop table student;

3、#方式能够很大程序防止sql注入,$方式无法防止sql注入。

4、$方式一般用于传入数据库对象,比如表明。

5、一般能用#的就不要使用,若不得不使用,则要做好前期校验工作,防止sql注入攻击。

6、在mybatis中,涉及到动态表名和列名时,只能使用${xxx}这样的参数形式。所以这样的参数需要我们在代码中手工进行处理来防止注入。

七、mybatis是如何防止sql注入的

MyBatis框架作为一款半自动化的持久层框架,其SQL语句都要我们自己手动编写,这个时候当然需要防止SQL注入。其实,MyBatis的SQL是一个具有“输入+输出”的功能,类似于函数的结构,参考上面的两个例子。其中,parameterType表示了输入的参数类型,resultType表示了输出的参数类型。回应上文,如果我们想防止SQL注入,理所当然地要在输入参数上下功夫。上面代码中使用#的即输入参数在SQL中拼接的部分,传入参数后,打印出执行的SQL语句,会看到SQL是这样的:

select * from student where id=? and name=?

不管输入什么参数,打印出的SQL都是这样的。这是因为MyBatis启用了预编译功能,在SQL执行前,会先将上面的SQL发送给数据库进行编译;执行时,直接使用编译好的SQL,替换占位符“?”就可以了。因为SQL注入只能对编译过程起作用,所以这样的方式就很好地避免了SQL注入的问题。

八、mybatis中的顶级标签 1、sql – 可被其他语句引用的可重用语句块
 where valid = 1 
 
select * from user 
2、insert – 映射插入语句
insert into User (id,name,sex) values (#{id},#{name},#{sex})
3、update – 映射更新语句

  update User set
    name = #{name},
    sex= #{sex}
  where id = #{id}

4、delete – 映射删除语句

  delete from User where id = #{id}

九、动态sql标签 1、if

  SELECT * FROM User WHERe age = 26
  
    
      AND name like #{name}
    
    
      AND sex like #{sex}
    
    
      AND valid = 1
    
  

3、trim (where, set)

  ...

 


  ...

4、foreach

  
  SELECT * FROM User
  WHERe name LIKE #{pattern}

6、xml中的timestamp比较
第一种写法:
原符号       <        <=      >       >=       &        '        "
替换符号    <    <=   ">>    ">>=   &   '  "

例如:sql如下:

create_date_time >= #{startTime} and create_date_time <= #{endTime}

第二种写法:
大于等于
= ]]>
小于等于

例如:sql如下:

create_date_time = ]]> #{startTime} and create_date_time #{endTime}


    SELECT id,name FROM t_role
    WHERe roleName=#{roleName}
    AND note=#{note}

(2) 使用@Param

很明显上面的缺点就在于可读性差,每次必须阅读他的键,才能明白其中的作用,并且不能限定其传递的数据类型,下面是使用@Param的情况,需要将接口改为
public List findRoleByAnnotation(@Param("roleName") String roleName, @Param("note") String note);

这样我们就可以直接传入对应的值了。

当然也可以使用Java Bean来传递多个参数,定义一个POJO

public class RoleParam {
    private String roleName;
    private String note;
    
}

此时接口就变为

public List findRoleByBean(RoleParam role);

这样对应的xml文件与1处的区别就在于id和parameterType发生了变化,id对应的方法和parameterType对应该类的权限定名。

而使用更多的场景可能是这样的,对应多个POJO

public List findRoleByMix(@Param("roleP") RoleParam role, @Param("permissionP") PermissionParam permission);

这样就可以进行如下映射


	SELECT name 
	FROM user 
	WHERe birthdaey < TO_TIMESTAMP(#{start}, 'yyyy-mm-dd hh24:mi:ss') 
	AND birthdaey ">>= TO_TIMESTAMP(#{end}, 'yyyy-mm-dd hh24:mi:ss') 
	ORDER BY birthdaey DESC 
	LIMIT 1;

十三、鉴别器

    
    
    
    
    
        
            
                
        
        
            
            
            
            
        
    


十四、关注公众号哪吒编程,回复1024,获取Java学习资料,还有不定期的送书活动
    极简JavaNode+MongoDB+React 项目实战开发微信小程序开发从入门到实战C++从入门到精通


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/750837.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号