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时,必须自己来管理数据库资源如:获取PreparedStatement,设置SQL语句参数,关闭连接等步骤。
JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于使用。JdbcTemplate是Spring的一部分。JdbcTemplate处理了资源的建立和释放。他帮助我们避免一些常见的错误,比如忘了总要关闭连接。他运行核心的JDBC工作流,如Statement的建立和执行,而我们只需要提供SQL语句和提取结果。
这个接口一般都是来配合Jpa来写一些复杂查询的sql
代码感受下:
String sql="select * from user";
jdbctemplate.queryForlList(sql);
我觉得大家都该知道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仅仅是一个通用的查询框架,专注于通过 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还是蛮华丽的哈哈。所以大家就看情况吧,一般大型企业项目都是很多人来开发,一个好的项目结构,高扩展性,好的阅读性真的很重要。