jpa、hibernate、spring-data-jpa、jdbcTemplate

简介: jpa、hibernate、spring-data-jpa、jdbcTemplate

1、jpa、hibernate、spring-data-jpa关系

JPA的是 Java Persistence API 的简写,JPA是一套规范,而不是具体的ORM框架。故Hibernate、TopLink 等ORM框架 都是JPA的实现,其中Hibernate已获得Sun的兼容认证。

开发者面向JPA规范的接口,但底层的JPA实现可以任意切换:觉得Hibernate好的,可以选择Hibernate JPA实现;觉得TopLink好的,可以选择TopLink JPA实现

 

Spring框架几乎是无所不能,无所不在。其次Spring也想要做持久化相关工作,并且已有Spring-data-**这一系列包(Spring-data-jpa,Spring-data-template,Spring-data-mongodb等)。其中Spring-data-jpa即代表着,Spring框架对JPA的整合。Spring Data JPA是在JPA规范的基础下提供了jap接口Repository层的实现JpaRepository,

Spring Data JPA是Spring提供的一套对JPA操作更加高级的封装,是在JPA规范下的专门用来进行数据持久化的解决方案。

 

SpringData Jpa 极大简化了数据库访问层代码。 如何简化的呢? 使用了SpringDataJpa,我们的dao层中只需要写接口,就自动具有了增删改查、分页查询等方法。

接口约定命名规则:

实例:

让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来实现

2、spring-jdbc(spring-boot-starter-jdbc)

spring-boot-starter-jdbc也就是创建项目时下图中的JDBC API,也就是JDBCTemplate,提供基础的 Spring 抽象类,包括 DataSource 等,帮助你在 Spring 框架下链接数据库。同时支持使用 JdbcTemplate 连接数据库、执行 SQL 语句。

基础sql使用

public interface StudentDAO {
 
    /**
     * 查询所有学生
     * @return 所有学生
     */
    public List<Student> query();
 
}
public class StudentDAOImpl implements  StudentDAO{
 
    @Override
    public List<Student> query() {
 
        List<Student> students = new ArrayList<Student>();
 
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        String sql = "select id, name , age from student";
        try {
            connection = JDBCUtil.getConnection();//这里我们把获取连接操作写在一个工具类中,方便调用
            preparedStatement = connection.prepareStatement(sql);
            resultSet = preparedStatement.executeQuery();
 
            Student student = null;
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                int age = resultSet.getInt("age");
 
                student = new Student();
                student.setId(id);
                student.setName(name);
                student.setAge(age);
 
                students.add(student);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtil.release(resultSet,preparedStatement,connection);//关闭操作也写在工具类中,方便调用
        }
        return students;
    }
}

jdbcTemplate使用

public interface StudentDAO {
 
    /**
     * 查询所有学生
     * @return 所有学生
     */
    public List<Student> query();
 
}
 
/**
 * StudentDAO访问接口实现类:通过Spring jdbc的方式操作
 */
public class StudentDAOSpringJdbcImpl implements  StudentDAO{
 
    private JdbcTemplate jdbcTemplate;//使用SpringIoc注入
 
    public List<Student> query() {
        final List<Student> students = new ArrayList<Student>();
        String sql = "select id, name , age from student";
 
        jdbcTemplate.query(sql, new RowCallbackHandler(){
        //RowCallbackHandler是一个接口,这里使用内部类的方式实现接口
            @Override
            public void processRow(ResultSet rs) throws SQLException {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
 
                Student student = new Student();
                student.setId(id);
                student.setName(name);
                student.setAge(age);
 
                students.add(student);
            }
        });
 
        return students;
    }
}

这里解释一下这个接口:接口中的processRow方法参数是一个ResultSet,也就是一个结果集,我们可以定制自己对结果集的操作。

我们可以清楚的看到,相对于原生的JDBC,很多冗余的代码都不见了,代码也清爽了许多。这貌似看起来已经很不错了,

然后程序员是真的很“懒”呀,他们又想:我们拿到结果集之后还要自己一个个将值设置到对象中,这个机械化的操作,能不能也有类似模板的东西帮我们去做?答案是可以的,

结果集直接映射成对应的实体类,我们拿到的结果就是若干个实体类,省去了手动设值的过程,也就是ORM(Object Relational Mapping,对象关系映射)。

import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
 
public class RunAQuery {
 
    private JdbcTemplate jdbcTemplate;
 
    public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }
 
    public int getCount() {
        return this.jdbcTemplate.queryForObject("select count(*) from mytable", Integer.class);
    }
 
    public String getName() {
        return this.jdbcTemplate.queryForObject("select name from mytable", String.class);
    }
}

关于JdbcTemplate 使用查看文章

JdbcTemplate详解_北航_Curry的博客-CSDN博客_jdbctemplate

Spring Boot 整合JdbcTemplate_探索er的博客-CSDN博客_springboot整合jdbctemplate

3、spring-data-jdbc(spring-boot-starter-data-jdbc)

除了基础的数据库连接功能,还额外提供了 CrudRepository ,如下所示

@Repository

public interface UserRepository extends CrudRepository<User, Long> {

   //自定义其他方法

}


4、spring-data-jpa(spring-boot-starter-data-jpa)

5、mybatis&mybatisplus

fastmybatis

fastmybatis: 一个mybatis开发框架,其宗旨为:简单、快速、有效

fastmybatis开发文档


相关文章
|
20天前
|
SQL Java 数据库连接
从理论到实践:Hibernate与JPA在Java项目中的实际应用
本文介绍了Java持久层框架Hibernate和JPA的基本概念及其在具体项目中的应用。通过一个在线书店系统的实例,展示了如何使用@Entity注解定义实体类、通过Spring Data JPA定义仓库接口、在服务层调用方法进行数据库操作,以及使用JPQL编写自定义查询和管理事务。这些技术不仅简化了数据库操作,还显著提升了开发效率。
33 3
|
2月前
|
SQL Java 数据库连接
springBoot+Jpa(hibernate)数据库基本操作
springBoot+Jpa(hibernate)数据库基本操作
44 0
|
4月前
|
SQL 数据库
Spring5入门到实战------13、使用JdbcTemplate操作数据库(批量增删改)。具体代码+讲解 【下篇】
这篇文章是Spring5框架的实战教程,深入讲解了如何使用JdbcTemplate进行数据库的批量操作,包括批量添加、批量修改和批量删除的具体代码实现和测试过程,并通过完整的项目案例展示了如何在实际开发中应用这些技术。
Spring5入门到实战------13、使用JdbcTemplate操作数据库(批量增删改)。具体代码+讲解 【下篇】
|
4月前
|
XML 数据库 数据格式
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
这篇文章是Spring5框架的实战教程的终结篇,介绍了如何使用注解而非XML配置文件来实现JdbcTemplate的数据库操作,包括增删改查和批量操作,通过创建配置类来注入数据库连接池和JdbcTemplate对象,并展示了完全注解开发形式的项目结构和代码实现。
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
|
4月前
|
SQL XML Java
Spring5入门到实战------12、使用JdbcTemplate操作数据库(增删改查)。具体代码+讲解 【上篇】
这篇文章是Spring5框架的实战教程,详细讲解了如何使用JdbcTemplate进行数据库的增删改查操作,包括在项目中引入依赖、配置数据库连接池、创建实体类、定义DAO接口及其实现,并提供了具体的代码示例和测试结果,最后还提供了完整的XML配置文件和测试代码。
Spring5入门到实战------12、使用JdbcTemplate操作数据库(增删改查)。具体代码+讲解 【上篇】
|
4月前
|
XML JSON Java
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
本文介绍了如何使用IntelliJ IDEA和Maven搭建一个整合了Struts2、Spring4、Hibernate4的J2EE项目,并配置了项目目录结构、web.xml、welcome.jsp以及多个JSP页面,用于刷新和学习传统的SSH框架。
93 0
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
|
4月前
|
Java 数据库连接 数据库
携手前行:在Java世界中深入挖掘Hibernate与JPA的协同效应
【8月更文挑战第31天】Java持久化API(JPA)是一种Java规范,为数据库数据持久化提供对象关系映射(ORM)方法。JPA定义了实体类与数据库表的映射及数据查询和事务控制方式,确保不同实现间的兼容性。Hibernate是JPA规范的一种实现,提供了二级缓存、延迟加载等丰富特性,提升应用性能和可维护性。通过结合JPA和Hibernate,开发者能编写符合规范且具有高度可移植性的代码,并利用Hibernate的额外功能优化数据持久化操作。
44 0
|
4月前
|
Java 数据库连接 数据库
Spring Data JPA 与 Hibernate 之区别
【8月更文挑战第21天】
95 0
|
4月前
|
SQL Java 数据库连接
Hibernate 和 JPA 有什么区别?
【8月更文挑战第21天】
270 0
|
5月前
|
Java 数据库连接 数据库
如何在Spring Boot中集成Hibernate
如何在Spring Boot中集成Hibernate