关于如何减缓、解除hibernate与domain之间的强关系限制以及与mybatis简单对比

文章一开始,我们先来讨论一个比较撕逼的话题,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
@Data
public 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.
 */
@Data
public 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中的一些优势引入了进来。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值