关于如何减缓、解除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中的一些优势引入了进来。

以上属于本人的个人观点,如有错误或者不足,望指出,共同成长。