JDBC, 데이터 소스, 연결 풀, 데이터베이스 드라이버 및 지속성 계층 프레임워크의 차이점

1. 데이터베이스

데이터베이스는 데이터 구조에 따라 데이터를 구성, 저장 및 관리하는 "창고"입니다.
데이터베이스는 관계형 데이터베이스(sql 데이터베이스)와 비관계형 데이터베이스(no-sql 데이터베이스)로 구분되는데, 둘의 차이점은 SQL 문을 연산 방식으로 사용하느냐의 차이이다. 우리가 사용하는 대부분의 데이터베이스는 MySql 데이터베이스, PostgreSql, oracle 데이터베이스와 같은 관계형 데이터베이스입니다.

2. 데이터베이스 드라이버

데이터베이스 드라이버는 특정 개발 언어 환경(예: java)에서 데이터베이스 호출을 가능하게 하기 위해 다양한 데이터베이스 개발자(예: oracle mysql 등)가 개발한 프로그램입니다. Java
데이터베이스 호출 언어는 데이터베이스 자체의 데이터베이스 언어로 번역되며 , 물론 이 번역(데이터베이스 드라이버)은 통합된 인터페이스를 위해 각 개발자가 맞춤화하고 개발합니다.
일반적으로 사용되는 드라이버:

1. MySQL
드라이버 클래스 이름: com.mysql.jdbc.Driver
JDBC URL(연결 주소): jdbc:mysql://dbip:port/databasename

  • dbip: 데이터베이스 서버의 IP 주소입니다. 로컬이고 쓰기 가능한 경우: localhost 또는 127.0.0.1.
  • 포트: 데이터베이스의 리스닝 포트로 설치 시 구성에 따라 달라지며 기본값은 3306입니다.
  • 데이터베이스 이름: 데이터베이스의 이름입니다.

2. SQL Server 데이터베이스
드라이버 클래스 이름: com.microsoft.jdbc.sqlserver.SQLServerDriver
JDBC URL: jdbc:microsoft:sqlserver://dbip:port;DatabaseName=databasename

  • dbip: 데이터베이스 서버의 IP 주소입니다. 로컬이고 쓰기 가능한 경우: localhost 또는 127.0.0.1.
  • 포트: 데이터베이스의 수신 포트로 설치 시 구성에 따라 다르며 기본값은 1433입니다.
  • 데이터베이스 이름: 데이터베이스의 이름입니다.

3. Oracle 데이터베이스
드라이버 클래스 이름: oracle.jdbc.driver.OracleDriver
JDBC URL: jdbc:oracle:thin:@dbip:port:databasename

  • dbip: 데이터베이스 서버의 IP 주소입니다. 로컬이고 쓰기 가능한 경우: localhost 또는 127.0.0.1.
  • 포트: 데이터베이스의 수신 포트로 설치 시 구성에 따라 다르며 기본값은 1521입니다.
  • 데이터베이스 이름: 데이터베이스의 SID이며 일반적으로 전역 데이터베이스의 이름입니다.

아래와 같이 JDBC 이전에는 Java 개발자가 다양한 데이터베이스를 운영하기 위해 다양한 데이터베이스에 대한 드라이버를 유지 관리해야 했습니다.
이미지.png

3、JDBC

JDBC의 전체 이름은 Java Database connect이며, 이는 SQL 문을 실행하기 위한 Java API 집합입니다 . 애플리케이션은 이 API 세트를 통해 관계형 데이터베이스에 연결 하고 SQL 문을 사용하여 데이터베이스의 데이터 쿼리, 업데이트 및 삭제와 같은 작업을 완료할 수 있습니다. 쉽게 말하면 데이터베이스를 연결 하고 운영하는 구성요소이다.

public static void main(String[] args) throws Exception {
    
    
        //1. 加载数据库驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2. 通过驱动管理类获取数据库连接
        Connection conn = DriverManager.getConnection(url,username,password);
        //3. 通过Connection对象创建Statement对象
        Statement stmt = conn.createStatement();
        //4. 执行sql语句
        ResultSet rs = preparedStatement.executeQuery("SELECT * FROM ...") ;
        //5. 遍历结果集
        while(rs.next()){
    
        
         String name = rs.getString("name") ;      
         }   
        //6. 关闭数据库连接,回收数据库资源
        // 关闭顺序:依次关闭ResultSet、Statement、Connection等资源。
        if(rs !=null){
    
       // 关闭记录集    
           try {
    
    
              rs.close();
           } catch (SQLException e) {
    
    
              e.printStackTrace();
           }
        }    
        if(stmt !=null){
    
       // 关闭声明    
           try {
    
    
              stmt.close();
           } catch (SQLException e) {
    
    
              e.printStackTrace();
           }
        }
        if(conn !=null){
    
      // 关闭连接对象    
           try {
    
    
              conn.close();
           } catch (SQLException e) {
    
    
              e.printStackTrace();
           }
        }
}

애플리케이션이 JDBC를 사용하여 데이터베이스에 접근하는 방식은 아래 그림과 같다.
이미지.png
위 그림에서 볼 수 있듯이 애플리케이션이 JDBC를 사용하여 특정 데이터베이스에 접근할 때, 다른 데이터베이스 드라이버와 연결해야 한다. 데이터베이스 벤더마다 제공하는 데이터베이스 드라이버가 다르기 때문에 애플리케이션이 데이터베이스와 실제로 연결을 설정하려면 JDBC가 데이터베이스에 액세스하기 위한 API를 제공하고 다양한 데이터베이스 서버와의 통신 세부 사항을 캡슐화해야 합니다.

4、데이터 소스

데이터 소스 기술은 Java가 데이터베이스를 운영하기 위한 핵심 기술이며 널리 사용되는 지속성 프레임워크는 데이터 소스의 응용과 분리될 수 없습니다.
데이터 소스는 데이터베이스 연결을 얻는 간단한 방법을 제공하고 풀 메커니즘을 통해 내부적으로 데이터베이스 연결을 재사용 할 수 있으므로 데이터베이스 연결 생성 횟수가 크게 줄어들고 시스템 성능이 향상됩니다. 데이터 소스가 필요한 이유: jdbc를 사용하여 연결을 설정하고 해제하는 것은 리소스 낭비가 크기 때문에 데이터 소스인 데이터베이스와 연결을 설정하기 위한 효율적인 구성 요소 집합이 필요하며, 데이터 소스는 연결 풀을 생성할 수 있습니다. 일반적인 것에는 DBCP, C3P0, druid, hikariCP 등이 포함됩니다.

5. 데이터베이스 연결 풀

데이터베이스 연결 풀은 데이터베이스 연결 할당, 관리 및 해제를 담당하며, 이를 통해 애플리케이션은 새 데이터베이스 연결을 설정하는 대신 기존 데이터베이스 연결을 재사용할 수 있습니다. 커넥션 풀 기술은 메모리 자원을 최대한 많이 재사용하고, 메모리를 대폭 절약하며, 서버의 서비스 효율성을 높이고, 더 많은 고객 서비스를 지원할 수 있습니다. 연결 풀을 사용하면 프로그램 실행 효율성이 크게 향상되며 동시에 자체 관리 메커니즘을 통해 데이터베이스 연결 수와 사용량을 모니터링할 수 있습니다.
MySQL에 액세스하는 것을 예로 들어 SQL 명령을 실행하십시오.
연결 풀링을 사용하지 않는 경우:

데이터베이스 연결 풀링을 사용하지 않는 단계:

TCP建立连接的三次握手
MySQL认证的三次握手
真正的SQL执行
MySQL的关闭
TCP的四次握手关闭

SQL을 실행하기 위해서는 우리가 신경 쓰지 않는 많은 네트워크 상호 작용이 있음을 알 수 있습니다.

이점 결점
구현이 간단함 네트워크 IO가 많고 데이터베이스의 로드가 높습니다.
긴 응답 시간 긴 응답 시간
애플리케이션이 자주 연결을 생성하고 닫습니다.
연결을 닫은 후 다수의 TIME_WAIT TCP 상태가 나타납니다.

연결 풀 사용 과정:

데이터베이스 연결 풀 사용 단계:

第一次访问的时候,需要建立连接。 但是之后的访问,均会复用之前创建的连接,直接执行SQL语句。

이점:

  1. 네트워크 오버헤드 감소
  2. 시스템 성능이 크게 향상됩니다.
  3. 더 이상 번거로운 TIME_WAIT 상태가 없습니다.

6. 지속성 레이어 프레임워크

6.1、ORM

ORM(Object-Relational Mapping)은 객체지향 개발 방식으로 오늘날 기업 수준 애플리케이션 개발 환경의 주류 개발 방식이며, 관계형 데이터베이스는 기업 수준 애플리케이션에서 데이터를 영구적으로 저장하는 주류 데이터 저장 시스템이다. 환경. 객체관계형 데이터는 비즈니스 엔터티를 표현하는 두 가지 형태로, 비즈니스 엔터티는 메모리의 객체로 표현되고 데이터베이스에서는 관계형 데이터로 표현됩니다 . 메모리에는 객체 간의 연관과 상속 관계가 있지만, 데이터베이스에서는 관계형 데이터가 다대다 연관과 상속 관계를 직접적으로 표현할 수 없습니다. 따라서 ORM(객체 관계형 매핑) 시스템은 일반적으로 미들웨어 형태로 존재하며 주로 프로그램 객체를 관계형 데이터베이스 데이터에 매핑하는 작업을 구현합니다 . 객체 관계형 매핑 설명: A. 단순함: ORM은 가장 기본적인 형태로 데이터를 모델링합니다. 예를 들어, ORM은 MySQL 테이블을 Java 클래스(모델)에 매핑하고 테이블의 필드는 이 클래스의 멤버 변수 B입니다. 정확함: ORM을 사용하면 모든 mysql 데이터 테이블을 통합 표준에 따라 Java 클래스에 정확하게 매핑할 수 있습니다. .코드 수준에서 시스템을 정확하고 통일되게 유지 C. 이해하기 쉬움: ORM은 데이터베이스 구조를 문서화합니다. 예를 들어, MySQL 데이터베이스는 ORM에 의해 Java 프로그래머가 이해할 수 있는 Java 클래스로 변환됩니다. Java 프로그래머는 자신이 잘하는 Java 수준에만 집중할 수 있습니다(물론 MySQL에 능숙한 것이 더 좋습니다) D. 사용 편의성: ORM에는 create(), update(), save(), load(), find(), find_all(), where() 등과 같은 영속 객체에 대한 CRUD 작업을 위한 API가 포함되어 있습니다. 즉, 모든 SQL 쿼리는 프로그래밍 언어로 캡슐화되어 함수 내의 함수는 함수의 체인 조합을 통해 최종 SQL 문을 생성합니다. 이러한 종류의 캡슐화를 통해 비표준, 중복 및 균일하지 않은 SQL 문을 피할 수 있고, 인간이 만든 많은 버그를 피할 수 있으며, 코딩 스타일의 통일 및 향후 유지 관리가 용이해질 수 있습니다.





6.2, Jdbc템플릿

JDBC는 추가, 삭제, 수정, 쿼리 등을 위한 데이터베이스 운영을 위한 인터페이스 세트도 제공하지만 너무 번거롭다.
JdbcTemplate은 jdbc에 접근하기 위해 spring에서 제공하는 템플릿으로, JDBC를 더 쉽게 사용할 수 있도록 Spring에서 캡슐화한 것이다.
JdbcTemplate은 리소스 생성 및 릴리스를 처리하는 Spring의 일부로, 항상 연결을 닫는 것을 잊어버리는 것과 같은 몇 가지 일반적인 실수를 방지하는 데 도움이 됩니다. Statement 구축 및 실행 등 핵심 JDBC 워크플로우를 실행하며, SQL문 제공 및 결과 추출만 하면 되기 때문에 기존 JDBC 작업보다 훨씬 간단합니다.
JdbcTemplate의 사용법:

JdbcTemplate jdbcTemplate = new JdbcTemplate(DataSourceUtils.getDataSource());
String sql = "INSERT INTO product VALUES (NULL, ?, ?);";
jdbcTemplate.update(sql, "iPhone3GS", 3333);

6.3, 마이바티스

Mybatis 는 일반적인 SQL 쿼리, 저장 프로시저 및 고급 매핑을 지원하는 뛰어난 지속성 계층 (반)ORM
프레임워크 입니다.
Mybatis는 거의 모든 JDBC 코드와 매개변수의 수동 설정 및 결과 세트 획득을 방지합니다.
SpringBoot에서 MybatisAutoConfiguration 클래스. SqlSessionFactory에 데이터 소스 DataSource가 주입되고, SqlSessionFactory를 기반으로 SqlSessionTemplate이 생성되는 것을 볼 수 있습니다. 이로써 자동 조립이 완료되고 @Autowired를 직접 사용할 수 있습니다.

  @Bean
  @ConditionalOnMissingBean
  public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
    
    
    SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
    factory.setDataSource(dataSource);
    //...
  }
  
  @Bean
  @ConditionalOnMissingBean
  public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
    
    
    ExecutorType executorType = this.properties.getExecutorType();
    if (executorType != null) {
    
    
      return new SqlSessionTemplate(sqlSessionFactory, executorType);
    } else {
    
    
      return new SqlSessionTemplate(sqlSessionFactory);
    }
  }

Mybatis의 구성 요소:

각 구성 요소의 기능 소개:

  • Mybatis 구성 파일: SqlMapConfig.xml은 Mybatis의 전역 구성 파일로 주로 데이터 소스, 트랜잭션, 매핑 파일 로드 등을 구성합니다. 이름은 무엇이든 가능합니다(이름으로 의미를 아는 것이 가장 좋습니다). Mapper.xml은 주로 SQL문과 같은 Statement 관련 정보를 구성합니다.
  • SqlSessionFactoryBuilder: XML 구성 또는 Java 구성을 기반으로 SqlSessionFactory 개체를 생성합니다. 빌더 모드를 사용합니다.(간단히 말하면 큰 집을 짓기, 벽돌 구입, 벽돌 쌓기 등의 단계를 사용하여 큰 개체를 단계별로 만드는 것입니다. 그리고 벽을 칠하는 것) 큰 집이 큰 물체이고 일련의 건축 단계가 단계별 건축인 건축).
  • SqlSessionFactory: SqlSession을 생성하는 데 사용됩니다. SqlSession 개체는 SqlSessionFactory.openSession() 메서드를 통해 생성될 수 있습니다. 팩토리 패턴을 사용합니다(간단히 말하면 클래스를 통해 객체를 얻습니다. 이 클래스는 new를 통해 직접 생성하는 대신 필요한 인스턴스를 생성하고 반환합니다).
  • SqlSession: JDBC의 Connection 객체와 동일하며 SqlSession 인스턴스를 사용하여 매핑된 SQL 문을 직접 실행하거나 해당 Mapper를 얻을 수 있습니다.
  • Executor: MyBatis의 모든 Mapper 문은 Executor를 통해 실행됩니다. (Mapper: XML 파일과 Java 인터페이스로 구성됩니다. XML에 구성된 매핑 정보에 따라 해당 SQL 문을 실행하고 실행 결과를 반환합니다.)
  • 매퍼 인터페이스: 데이터 작업 인터페이스는 일반적으로 DAO 인터페이스라고도 하며 매퍼 구성 파일의 메소드와 일대일로 대응해야 합니다. 즉, 추가, 삭제, 수정, 확인과 일치해야 합니다. Mapper.xml의 태그 ID입니다.
  • 매퍼 구성: 특정 쿼리 비즈니스를 구성하고 데이터베이스의 필드 관계를 매핑하는 데 사용되며 XML 형식(Mapper.xml) 또는 Java 주석 형식을 사용하여 구현할 수 있습니다.
  • MappedStatement: 해당 기능은 SQL 문, 입력 매개변수, 출력 결과 등을 포함하여 문 관련 정보를 캡슐화하는 것입니다.

마이바티스 실행 과정:

  1. 먼저 Mybatis의 전역 구성 파일을 로드한 후 SQL 매핑 파일 또는 해당 주석의 관련 SQL 내용을 로드합니다.
  2. 세션 팩토리 생성 MyBatis는 구성 파일의 정보를 읽어 세션 팩토리(SqlSessionFactory)를 구성합니다.
  3. 세션을 생성합니다. 세션 팩토리에 따르면 MyBatis는 이를 통해 세션 개체(SqlSession)를 생성할 수 있습니다. 세션 개체는 데이터베이스 작업을 추가, 삭제, 수정 및 쿼리하기 위한 메서드가 포함된 인터페이스입니다.
  4. Executor를 생성한다. Session 객체 자체는 데이터베이스를 직접적으로 동작시킬 수 없기 때문에 데이터베이스 Executor(Executor)라는 인터페이스를 사용하여 동작을 수행하도록 돕는다.
  5. SQL 객체 캡슐화 이 단계에서 실행자는 SQL 문, 입력 매개변수 매핑 정보(Java 단순 유형, HashMap 또는 POJO) 및 출력 결과 매핑 정보(Java 단순 유형, HashMap 또는 POJO)를 포함하는 객체(MappedStatement)로 처리할 SQL 정보를 캡슐화합니다. Java 단순 유형, HashMap 또는 POJO).
  6. 데이터베이스를 운영하기 위해서는 일단 Executor와 SQL 정보 캡슐화 객체를 가지고 이를 이용하여 데이터베이스에 접근하고, 마지막으로 연산 결과를 반환하여 프로세스를 종료한다.

6.4, JPA

JPA의 전체 이름은 Java Persistence API인 Java Persistence API입니다. SUN에서 시작한 ORM 기반 사양 집합입니다
. JPA 사양은 본질적으로 ORM 사양입니다. JPA는 ORM 프레임워크가 아닙니다. ORM 구현을 제공하지 않고 일부 사양을 공식화하고 일부 프로그래밍 API 인터페이스를 제공하지만 특정 구현은 서비스 공급업체에서 제공합니다. JPA와 Hibernate의 관계는 JDBC와 JDBC 드라이버의 관계와 같습니다.JPA는 사양입니다.Hibernate는 ORM 프레임워크일 뿐만 아니라 JPA 구현이기도 합니다.

Spring Data JPA는 ORM 프레임워크와 JPA 사양을 기반으로 Spring에 의해 캡슐화된 JPA 애플리케이션 프레임워크 세트입니다. 기본 레이어는 여전히 jpa를 구현하는 최대 절전 모드 기술을 사용하므로 개발자는 최소한의 코드로 데이터베이스에 액세스하고 운영할 수 있습니다
. :
객체 작업을 위한 인터페이스를 정의하고 JpaRepository의 핵심 인터페이스를 상속합니다.

import com.boot.jpa.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User,Integer> {
    
    

    // 但条件查询
    User findByAge(Integer age);
    // 多条件查询
    User findByNameAndAge(String name, Integer age);
    // 自定义查询
    @Query("from User u where u.name=:name")
    User findSql(@Param("name") String name);
}

7. 요약

JDBC: 기본 코드에 가까운 데이터베이스 연결 및 운영을 위한 기본 API입니다.
JDBC 및 데이터 소스: 데이터 소스는 데이터베이스에 연결하기 위한 jdbc의 구현입니다.
데이터 소스 및 데이터베이스 드라이버: 다른 데이터베이스에 연결하려면 다른 드라이버를 사용해야 합니다.
데이터 소스 및 연결 풀: 데이터 소스는 기본 jdbc를 사용하여 일부 유휴 연결을 생성하고 데이터베이스에 액세스할 때 사용할 연결 풀에 넣습니다.
JdbcTemplate, MyBatis 및 데이터소스를 동작시키기 위해서는 먼저 데이터베이스에 연결해야 하므로 jdbcTemplate 및 MyBatis에 대한 데이터소스를 설정하여 jdbcTemplate과 MyBatis가 데이터소스의 Connection Pool을 사용할 수 있도록 해야 한다.
jpa 및 Hibernate: Hibernate는 jpa 사양에 따라 구현됩니다. 맨 아래 계층도 데이터 소스와 JDBC를 사용하여 데이터베이스에 액세스합니다.
JDBC 및 jpa: 본질적으로 jdbc와 jpa는 동일한 수준에 있지 않습니다.

JDBC是数据库的统一接口标准。
jpa是ORM框架的统一接口标准。
用法有区别: jdbc更注重数据库,orm则更注重于java代码,
但是实际上jpa实现的框架底层还是用jdbc去和数据库打交道。

참고:

  1. https://www.cnblogs.com/yanze/p/9714703.html
  2. https://www.zhihu.com/question/45993333
  3. https://juejin.cn/post/6844903475239714823
  4. https://blog.csdn.net/An1090239782/article/details/107159335
  5. https://www.cnblogs.com/tanghaorong/p/13856465.html#:~:text=MyBatis%20%E6%98%AF%E6%94%AF%E6%8C%81%E5%AE%9A %E5%88%B6%E5%8C%96,%E5%8F%82%E6%95%B0%E4%BB%A5%E5%8F%8A%E8%8E%B7%E5%8F%96% E7%BB%93%E6%9E%9C%E9%9B%86%E3%80%82
  6. https://blog.csdn.net/u013541707/article/details/113182157
  7. https://blog.csdn.net/papima/article/details/78219000

추천

출처blog.csdn.net/hansome_hong/article/details/124320410