Java DataBase Connnectivity
자바 언어와 DB를 연결해주는 통로로, 자바에서 데이터베이스에 접근할 수 있도록 해주는 자바 API
JDBC의 복잡성을 줄이기 위한 Spring 프레임워크의 일부
JDBC, SQL Mapper, ORM 혼용
- 기본적으로는 분리해서 사용하나, 복잡한 프로그램을 다룰 때는 같이 사용하기도 한다!
- ex. node.js에서 mysql 모듈과 sequelize를 동시에 쓰지 않음
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.2'
runtimeOnly 'com.mysql:mysql-connector-j'
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:포트번호/데베명?useUnicode=yes&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Asia/Seoul
spring.datasource.username=유저이름
spring.datasource.password=데베비번
mybatis.type-aliases-package=com.spring.boot.mapper
mybatis.mapper-locations=mybatis-mapper/*.xml
Java Persistence API
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
# mysql connect
spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
# DB function use
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create
# none: not create / create: auto create / update: only update structure
logging.level.org.hibernate=info
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.use_sql=true
// Entity : DB에서 쓰이는 필드와 매핑이 되는 클래스 (DB 클래스와 대응되는 클래스)
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
@Entity // 해당 클래스가 Entity 라는 것을 알려준다.
@Table(name="user2") // 테이블 이름을 명시
@Getter
@Setter
public class UserEntity {
@Id // pk라는 것을 알려주고,
@GeneratedValue(strategy = GenerationType.IDENTITY)
// 자동으로 키를 생성해주는데, 그때 사용하는 전략을 auto-increment로 하겠다.
// (mysql 에서 가장 많이 쓰이는 방식)
private int id;
@Column(length = 25, nullable = false) // DB에 컬럼이다 라는 것을 알려준다.
// name varchar(25) not null,
private String name;
@Column
// @Column(columnDefinition = "TEXT")
// nickname text
private String nickname;
}
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import sesac.mybatis.sesacmybatis.domain.User;
import sesac.mybatis.sesacmybatis.entity.UserEntity;
import java.util.List;
import java.util.Optional;
// JpaRepository<대상으로 지정할 Entity, 해당 Entity의 pk타입>
public interface UserRepository extends JpaRepository<UserEntity, Integer> {
// findBy를 이용하고 단일값으로 받으면 ( UserEntity, Optional<UserEntity> )
// 검색된 값이 2개 이상일 때 에러
// Optional<UserEntity> findByName(String name);
List<UserEntity> findByName(String name);
// Optional<UserEntity> findByNickname(String nickname); // 조건에 nickname을 걸어서 실행하겠다.
List<UserEntity> findByNickname(String nickname);
// 아래 쿼리는 findBy 뒤에 컬럼명이 upper case로 된 형태로 들어오지 않을 때(JPA 규칙에 어긋남) 실행되는 것
// 즉, 쿼리 어노테이션 + JPA 규칙을 동시에 한다면 쿼리가 2개가 되는 것
// @Query("select u from UserEntity u where u.name=:name and u.nickname=:nickname")
// @Query(nativeQuery = true, value="select * from user where name=:name and nickname=:nickname")
// Optional<UserEntity> findByNameAndNickname(String name, String nickname);
List<UserEntity> findByNameAndNickname(String name, String nickname);
List<UserEntity> findByNameOrNickname(String name, String nickname);
// @Query(nativeQuery = true, value="select * from user2 where name=:name")
// UserEntity findExist(String name);
// JPA 메소드 존재
boolean existsByName(String name);
}