关于如何减缓、解除hibernate与domain之间的强关系限制以及与mybatis简单对比
来源:互联网 发布:知乎日报 大误 编辑:程序博客网 时间:2024/06/17 04:58
文章一开始,我们先来讨论一个比较撕逼的话题,hibernate与mybatis到底哪个好。以本人经历过的项目来说,这两个框架都有过接触。可以说是各有利弊。
hibernate与mybatis简单对比
首先、从我个人看来论学习时间成本,mybatis更加容易入手,因为本人第一次接触的项目使用的是hibernate项目,当时被一对一、一对多、多对多、cascade、inverter这些个规定、配置以及效果搞得是一脸懵逼。但是不得不说这一套东西也让hibernate变得如此自动、智能。只要将这些关系配置好,一个crud或一条hql语句就可以达到对一套表进行操作或查询的效果。
其次、从所需掌握东西的复杂度(仅指东西的量,并非深度)来说,hibernate当初创建出来的目的有一部分是为了给那些不会使用sql语句的程序员使用的,这也就是为什么说hibernate是一个完全的orm框架,而mybatis是一个半orm框架。因为对与hibernate而言,你只要知道HQL或QBC的语法或者api你就可以完全以面向对象的方式来对数据库进行操作,即使你并不懂得sql,也可以进行开发。当然hibernate也支持sql开发。但是mybatis你还需要懂得sql语句(当然现在的程序员又有哪个不懂sql呢。)
还有、例如mybatis是将sql写在xml配置文件中的方便进行需求的修改、hibernate是重量级框架但是mybaits是轻量级等等…`
最终、还有一个当初我觉得是mybatis的一个绝对优势(也是我当初的一个项目选择使用mybaits框架的一个决定性因素),我觉得hibernate固然是好,但是当我需要查询一条数据的时候,但是这条数据的内容是从多张表中拼凑出来的时候,这时候就头疼了。因为hql查询出来的数据对封装到对应的对象上,如果我从五张表中分别要每张表中的所需数据,那么我需要对这五张表建立关联关系,这个时候我在创建每一个domain的时候都要想着他与哪个domain有着什么样的关系(太恶心了有木有),而且这样domain牵扯的东西也相对太多了,所以当时我就选择了使用mybatis,因为他可以直接将我多表联查的数据直接使用一个pojo封装,不用考虑一堆复杂的关系。
`
OK,咱们的重点来了,我就是要使用hibernate,但是我还有这个恶心的需求,怎么破?OK 上代码,我们以两个表联查为例
需求:查询个人基础信息以及详情信息
数据库结构如下
基础个人信息表
个人详情信息表
对应domain
User(使用了lombok不了解的同学直接手动创建getset即可,去除@Data)
package com.springboot.domain;import java.io.Serializable;import javax.persistence.*;import lombok.Data;import org.hibernate.annotations.GenericGenerator;@Data@Entity@Table(name = "user")public class User implements Serializable { private static final long serialVersionUID = -8588814535074011726L; @Id private Integer id; @Column private String username; @Column private Integer age; @Column private Integer customerid;}
Info
package com.springboot.domain;import lombok.Data;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.Id;/** * Created by beyondLi on 2017/6/5. */@Entity@Datapublic class Info { @Id private Integer id; @Column private String address; @Column private String position;}
需要接收多表查询结果的domain
package com.springboot.domain;import lombok.Data;/** * Created by beyondLi on 2017/6/5. */@Datapublic class AllInfo { public AllInfo() { } //必须 public AllInfo(Integer id, String username, Integer age, String address, String customerName) { this.id = id; this.username = username; this.age = age; this.address = address; this.customerName = customerName; } private Integer id; private String username; private Integer age; private String address; private String customerName;}
Dao层代码如下
public AllInfo getUserByName(){ //编写sql 注!此处的new后面必须写全路径且必须有对应的构造函数 String sql = "SELECT NEW com.springboot.domain.AllInfo(u.id,u.username,u.age,c.address,c.position) FROM User u,Info c WHERE u.customerid = c.id AND u.id = 1"; //获取query并执行sql Query query = entityManager.createQuery(sql); //获取查询到的值 List<AllInfo> resultList = query.getResultList(); System.out.println(resultList.get(0)); return resultList.get(0); }
对应sql语句以及查询结果
对应项目查询结果
OK 大功告成,我们成功避开了传统的需要在domain里与其他domain配置复杂关系的过程,并将查询到的综合数据封装到了对应的pojo中已达到了与mybatis相似的效果。这里只是一个简单的例子可能并不明显,但是如果当涉及到的表很多以及关系复杂的情况下,这也算是一种很好的思维方式,使用了hibernate并将mybaits中的一些优势引入了进来。
以上属于本人的个人观点,如有错误或者不足,望指出,共同成长。
- 关于如何减缓、解除hibernate与domain之间的强关系限制以及与mybatis简单对比
- Mybatis与Hibernate的简单对比
- Hibernate与 MyBatis的对比
- HIBERNATE与 MYBATIS的对比
- HIBERNATE与 MYBATIS的对比
- HIBERNATE与 MYBATIS的对比
- HIBERNATE与 MYBATIS的对比
- Hibernate与MyBatis的对比
- Mybatis与Hibernate的对比
- Hibernate 与 Mybatis的对比
- HIBERNATE与MYBATIS的对比
- HIBERNATE与 MYBATIS的对比
- Hibernate与MyBatis的对比
- Hibernate与Mybatis的对比
- hibernate与mybatis的对比
- HIBERNATE与 MYBATIS的对比
- HIBERNATE与 MYBATIS的对比
- mybatis与hibernate的对比
- Bitmap 搓圆
- 调用jni的时候出现transformNativeLibsWithStripDebugSymbolForRelease空指针异常
- C# 实现自己画内容并打印
- MySQL + mybatis 查询业务月统计 包括 同比 环比
- 【人工智能概念】门外篇
- 关于如何减缓、解除hibernate与domain之间的强关系限制以及与mybatis简单对比
- 可视化工具–D3–比例尺的使用(quantitative)
- 商城项目实战35:购物车功能实现
- C++后台开发校招面试常见问题
- 序列化和反序列化二叉树(java版)
- 如何使用JavaScript来判断是否为移动设备
- centOs7.0安装docker
- Js中的window.parent ,window.top,window.self 详解
- window.open自适应父窗口并垂直居中