JPA,Hibernate,mybatis,mybatis plus,Querydsl,JDBC五种数据库框架使用感受

孔乐邦
2023-12-01

感受对比

JPA,Hibernate

JPA和Hibernate之间的关系,可以简单的理解为JPA是标准接口,Hibernate是实现。

那么Hibernate是如何实现与JPA 的这种关系的呢?

Hibernate主要是通过三个组件来实现的,及hibernate-annotation、hibernate-entitymanager和hibernate-core。

(1)hibernate-annotation是Hibernate支持annotation方式配置的基础,它包括了标准的JPA annotation以及 Hibernate自身特殊功能的annotation。

(2)hibernate-core是Hibernate的核心实现,提供了Hibernate所有的核心功能。

(3)hibernate-entitymanager实现了标准的JPA,可以把它看成hibernate-core和JPA之间的适配器,它并不直接提供ORM的功能,而是对hibernate-core进行封装,使得Hibernate符合JPA的规范。

总的来说,JPA是规范,Hibernate是框架,JPA是持久化规范,而Hibernate实现了JPA。
理论如此实际感受就是做的项目你可以说是ssh,也可以是Jpa。对于jpa,个人感受他就是基于注解开发(@Entity,@Table,@Id等),对于简单查询代码量很少,复杂查询就需要引入Jdbc,来写sql在进行sql执行。

jdbc

JDBC已经能够满足大部分用户最基本的需求,但是在使用JDBC时,必须自己来管理数据库资源如:获取PreparedStatement,设置SQL语句参数,关闭连接等步骤。

​JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于使用。JdbcTemplate是Spring的一部分。JdbcTemplate处理了资源的建立和释放。他帮助我们避免一些常见的错误,比如忘了总要关闭连接。他运行核心的JDBC工作流,如Statement的建立和执行,而我们只需要提供SQL语句和提取结果。

这个接口一般都是来配合Jpa来写一些复杂查询的sql
代码感受下:

String sql="select * from user";
jdbctemplate.queryForlList(sql);

mybatis,mybatis plus

我觉得大家都该知道plus是什么意思吧,比如Iphone7 和iphone7 plus ,当然现在都是什么什么pro。
意思就是mybatisplus 是前者的升级版。
用过mybatis都懂,需要用很多XML来映射数据库,一个字段一个字段对应,有多难受想想就知道了,而plus就改进了这点,它通过@TableName,@TableId加字段对应来实现映射,可以选择使用XMl写sql,或者@select,再或者QueryWapper条件构造器来自定义,由于xxxmapper接口继承了BaseMapper所以也拥有了许多封装好的方法更加便捷还是不错的。并且对于增删改对比jdbc安全的多,应为他封装的就是逻辑删除
还有就是mybatis-plus的多表关联查询

第一种方法注解形式

@Results,@Many,@One

/**
     * 通过id查询用户的全部信息
     * @param id 用户id
     * @return 用户信息模型
     */
    @Select({"select * from user where id = #{id}"})
    @Results(id="studentMap", value={
            @Result(column="id", property="id", id=true),
            @Result(column="username", property="username"),
            @Result(column="name", property="name"),
            @Result(property="roleList", javaType= List.class,column="id",
                    many=@Many(select="com.phj.rbacdome.dao.RoleMapper.getRoleListById"))
    })
    public UserVO getUserById(@Param("id") Integer id);
}

/**role表的*/
public interface RoleMapper extends BaseMapper<Role> {

    @Select("SELECT * FROM role WHERE id IN (SELECT role_id FROM user_role_con WHERE user_id = #{id})")
    public List<Role> getRoleListById(@Param("id") Integer id);
}

@Result 指定返回的结果,在将用户一对多返回一个角色集合

 @TableField(exist = false)
    private Set<Role> roles=new HashSet<>();

该注解表示数据库不存在的字段
之后再业务层可以查出来集合后 再添加到实体中。

Querydsl

QueryDSL仅仅是一个通用的查询框架,专注于通过 JavaAPI 构建类型安全的 Sql 查询,也可以说 QueryDSL 是基于各种 ORM 框架以及 Sql 之上的一个通用的查询框架,QueryDSL 的查询,类是于 SQL 查询,很全面只不过一个是用 SQL 一个是用代码来代替 SQL
先来局代码感受下

     QUser user = QUser.user;
       return jpaQueryFactory
                .selectFrom(user)
                .orderBy(
                        user.uIndex.asc()
                )
                .fetch();
    }

'点'起来就可以了。

个人一般都是用JPA来结合他,快真的快,少太少了.

  userRepository.findAll(qUser.name.contains(key));

这样就查出了所有名字包含key的用户。

结束语

综上所有的框架,感觉mybatis-plus,扩展性更高,可以将sql与业务逻辑解耦,又有查询构造器,简化开发方便维护,减少sql编写。Jpa的多表关联是我很喜欢的(@OnetoOne,@OnetoMany等),而且还可以自己根据实体去建表,并且封装了很多方法,不过不支持复杂查询。复杂查询还是需要引入jdbc或者querydsl。可能观赏性一般,不过结合Querydsl还是蛮华丽的哈哈。所以大家就看情况吧,一般大型企业项目都是很多人来开发,一个好的项目结构,高扩展性,好的阅读性真的很重要

 类似资料: