文章目录
前言
一、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都是很有必要学的。因为遇到的项目会各种各样,所以两者各有长短。使用哪个合适要结合具体的业务进行分析。