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


    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都可以依赖于它来实现,在实际的工作工程中,推荐使用Spring Data JPA + ORM(如:hibernate)完成操作,这样在切换不同的ORM框架时提供了极大的方便,同时也使数据库层操作更加简单,方便解耦

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

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

    基础sql使用

    1. public interface StudentDAO {
    2. /**
    3. * 查询所有学生
    4. * @return 所有学生
    5. */
    6. public List<Student> query();
    7. }
    8. public class StudentDAOImpl implements StudentDAO{
    9. @Override
    10. public List<Student> query() {
    11. List<Student> students = new ArrayList<Student>();
    12. Connection connection = null;
    13. PreparedStatement preparedStatement = null;
    14. ResultSet resultSet = null;
    15. String sql = "select id, name , age from student";
    16. try {
    17. connection = JDBCUtil.getConnection();//这里我们把获取连接操作写在一个工具类中,方便调用
    18. preparedStatement = connection.prepareStatement(sql);
    19. resultSet = preparedStatement.executeQuery();
    20. Student student = null;
    21. while (resultSet.next()) {
    22. int id = resultSet.getInt("id");
    23. String name = resultSet.getString("name");
    24. int age = resultSet.getInt("age");
    25. student = new Student();
    26. student.setId(id);
    27. student.setName(name);
    28. student.setAge(age);
    29. students.add(student);
    30. }
    31. } catch (Exception e) {
    32. e.printStackTrace();
    33. } finally {
    34. JDBCUtil.release(resultSet,preparedStatement,connection);//关闭操作也写在工具类中,方便调用
    35. }
    36. return students;
    37. }
    38. }

    jdbcTemplate使用

    1. public interface StudentDAO {
    2. /**
    3. * 查询所有学生
    4. * @return 所有学生
    5. */
    6. public List<Student> query();
    7. }
    8. /**
    9. * StudentDAO访问接口实现类:通过Spring jdbc的方式操作
    10. */
    11. public class StudentDAOSpringJdbcImpl implements StudentDAO{
    12. private JdbcTemplate jdbcTemplate;//使用SpringIoc注入
    13. public List<Student> query() {
    14. final List<Student> students = new ArrayList<Student>();
    15. String sql = "select id, name , age from student";
    16. jdbcTemplate.query(sql, new RowCallbackHandler(){
    17. //RowCallbackHandler是一个接口,这里使用内部类的方式实现接口
    18. @Override
    19. public void processRow(ResultSet rs) throws SQLException {
    20. int id = rs.getInt("id");
    21. String name = rs.getString("name");
    22. int age = rs.getInt("age");
    23. Student student = new Student();
    24. student.setId(id);
    25. student.setName(name);
    26. student.setAge(age);
    27. students.add(student);
    28. }
    29. });
    30. return students;
    31. }
    32. }

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

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

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

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

    1. import javax.sql.DataSource;
    2. import org.springframework.jdbc.core.JdbcTemplate;
    3. public class RunAQuery {
    4. private JdbcTemplate jdbcTemplate;
    5. public void setDataSource(DataSource dataSource) {
    6. this.jdbcTemplate = new JdbcTemplate(dataSource);
    7. }
    8. public int getCount() {
    9. return this.jdbcTemplate.queryForObject("select count(*) from mytable", Integer.class);
    10. }
    11. public String getName() {
    12. return this.jdbcTemplate.queryForObject("select name from mytable", String.class);
    13. }
    14. }

    关于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开发文档

  • 相关阅读:
    selenium下载安装 -- 使用谷歌驱动碰到的问题
    大一学生期末大作业 html+css+javascript网页设计实例【电影购票项目】html网页制作成品代码
    无水印免费4K视频素材网站 可商用-Free Stock Video
    JDBC的基本使用(mysql与java)
    正厚干货 | Git客户端用户使用指南
    C和指针 第15章 输入/输出函数 15.11 二进制I/O
    竞赛选题 基于深度学习的人脸表情识别
    揭秘In-Context Learning(ICL):大型语言模型如何通过上下文学习实现少样本高效推理[示例设计、ICL机制详解]
    【目标检测】大图包括标签切分,并转换成txt格式
    优雅的用户体验:微信小程序中的多步骤表单引导
  • 原文地址:https://blog.csdn.net/qq_34491508/article/details/125533134