前言


一、JPA

1. 简单介绍

  • JPA是Java Persistence API的简称,中文名Java持久层API 。
  • 是 Java EE 5.0 平台标准的 ORM规范,使得应用程序以统一的方式访问持久层。既然是规范,那肯定就需要技术来实现这个规范,所以Hibernate3.2+、TopLink 10.1.3以及OpenJPA都提供了JPA的实现。

2. JPA的优势

  • 标准化 :提供相同的访问API,保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。
  • 简单易用,集成方便 :JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下创建实体和创建Java 类一样简单,没有任何的约束和限制,只需要使用 javax.persistence.Entity进行注释,JPA的框架和接口也都非常简单。
  • 和JDBC的查询能力差不多 :JPA的查询语言是面向对象而非面向数据库的,JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。
  • 支持面向对象的高级特性 :JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型。
    面向对象也避免了程序与数据库 SQL 语句耦合严重,比较适合跨数据源的场景(一会儿 MySQL,一会儿 Oracle 等)。

3. 用JPA创建实体类

// lombok注解,自动生成get、set方法
@Data
// 生成无参构造函数的注解
@NoArgsConstructor
// 生成有参构造函数的注解
@AllArgsConstructor
@Entity
// @Table注解是确定表名,不写这个注解的话,默认类名就是表名
@Table (name ="user")
public class User  implements Serializable {
	// 序列化,要继承上面的序列化接口
	private static final long serialVersionUID =  524258970393766098L;

	/**
	 * 自增id
	 */
	 // 指定列名
   	@Column(name = "user_id" )
	@Id
	private Long userId;

	/**
	 * 登录名
	 */
   	@Column(name = "username" )
	private String username;
	
	/**
	 * 登录密码
	 */
   	@Column(name = "password" )
	private String password;

	/**
	 * 性别
	 */
   	@Column(name = "user_sex" )
	private String userSex;

	/**
	 * 手机
	 */
   	@Column(name = "user_tel" )
	private String userTel;

	/**
	 * 爱好
	 */
   	@Column(name = "user_hobby" )
	private String userHobby;

	/**
	 * 创建时间
	 */
   	@Column(name = "create_time" )
	private Long createTime;

	/**
	 * 修改时间
	 */
   	@Column(name = "update_time" )
	private Long updateTime;

}

4. 用JPA书写repository层

public interface CreditRepository extends PagingAndSortingRepository<CreditDO, Long> {
    List<CreditDO> findCreditDOSByUcc(String ucc);

    Page<CreditDO> findAllByUcc(String ucc, Pageable pageable);

    Long countAllByCreatedAtAfterAndCreatedAtBeforeAndTypeAndUcc(Date after, Date before, CREDIT_TYPE t, String ucc);

    CreditDO findCreditDOById(Long creditId);

    Boolean existsCreditDOByUccAndType(String ucc, CREDIT_TYPE t);

}

package com.lm.jpaDemo.repositroy;

import com.lm.jpaDemo.entities.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;

public interface UserRepository extends JpaRepository<User, Integer>, CrudRepository<User, Integer> {


    /**
     * 自定义的查询方法
     * @return
     */
    @Query("select u from User u where u.username = ?1")
    public User findByName();


    /**
     * 使用hql进行删除操作
     * @param id
     */
    @Modifying
    @Query("delete from User u where u.userId = ?1")
    public void deleteById(Integer id);

    /**
     * 使用sql进行删除操作
     * nativeQuery = true属性标识启用sql操作,即value中写操作将被当作sql语句进行操作,而不是hql语句
     * @param id
     */
    @Modifying
    @Query(value = "delete from User u where u.user_id = ?1", nativeQuery = true)
    public void deleteById2(Integer id);

二、mybatis

1. 简单介绍

  • MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。
  • MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。
  • MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录。

2. mybatis的优势

  • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件。
  • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。
  • sql写在xml里,便于统一管理和优化 : 通过sql语句可以满足操作数据库的所有需求。
  • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
  • 提供映射标签,支持对象与数据库的orm字段关系映射 : 提供对象关系映射标签,支持对象关系组建维护。 提供xml标签,支持编写动态sql。

3. 用mybatis创建的实体类

实体类中的参数和数据库表中的参数一一对应。根据数据库建表。

public class User implements Serializable {
		
	private int id ;
	private String username;
	......
}

4. 用mybatis创建mapper层

public interface IUserMapper {
	/**
	* 查询所有操作
	* @return
	*/
	List<User> findAll();
}

5. 创建创建mybatis的主配置文件

<configuration>
    <!--配置环境-->
    <environments default="mysql">
        <!--配置Mysql的环境-->
        <environment id="mysql">
            <!--配置事务的类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置数据源(连接池)-->
            <dataSource type="POOLED">
                <!--配置连接数据库的四个基本信息-->
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/db1" />
                <property name="username" value="root" />
                <property name="password" value="a" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="Mybatis/IuserMapper.xml" />
    </mappers>

</configuration>

6. 创建mybatis映射配置文件

<mapper namespace="com.Mapper.IUserMapper" >
    <select id="findAll" resultType="com.Pojo.User" >
        select * from usr
    </select>
</mapper>

7. 编写测试类

......

InputStream in = Resources.getResourceAsStream("mybatis/MapperConfig.xml");
//创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
//使用SqlSession创建Mapper接口的代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
//使用代理对象执行方法
List<mybatis_user> users = userMapper.findAll();
for (mybatis_user muser : users){
    System.out.println(muser);
}
session.close();
in.close();

......

三、对比 JPA 和 mybatis

  • 其实JPA和mybatis大体上没什么区别,架构上很相似,mybatis就是mapper层 :

在这里插入图片描述
JPA就是repository层

在这里插入图片描述

其他都一样的.

  • spring data jpa实现了jpa(java persistence api)功能,即可以实现pojo转换为关系型数据库记录的功能,通俗来讲就是可以不写任 何的建表sql语句了。jpa是spring data jpa功能的⼀个⼦集。 ⽽mybatis并没有jpa功能,建表语句还是要⾃⼰写的。
  • spring data jpa是全⾃动框架,不需要写任何sql。⽽mybatis是半⾃动框架,需要⾃⼰写sql,mybatis-plus为mybatis赋能,使其也可以基本上不需要写任何模板sql。

总结

  • jpa对于单表的简单查询确实简单方便又实用。
  • mybatis ,只能说对于多表查询确实是比较支持。尤其是在业务逻辑多是多表关联的情况下,mybatis绝对比jpa要更加适合。无论是以后的维护还是业务的变更都方便不少。

总的来说,JPA 和 mybatis 各有各的优势,其实jpa和mybatis都是很有必要学的。因为遇到的项目会各种各样,所以两者各有长短。使用哪个合适要结合具体的业务进行分析

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐