자바 면접 문제 스퍼트 9 일 째--마 이 바 티 스
진지 하 게 대답 하 다.
(Object Relational Mapping, ORM)
은 주로 프로그램 대상 이 데이터베이스 데이터 와 관련 된 매 핑 을 실현 한다.JAVA 프로 그래 밍 은 데이터베이스 와 접촉 하 는 것 을 피 할 수 없다.그러면 데이터 베 이 스 를 어떻게 효율 적 이 고 편리 하 게 조작 하 는 지 하 는 것 도 대응 해 야 할 문제 이다.원생 의 JDBC 기반 방식 은 매우 비효 율 적 이 고
을 많이 써 야 하기 때문에 선택 할 가치 가 없다.ORM JDBC
,우 리 는 반복 적 으로 바퀴 를 만 들 필요 가 없습니다.현재 이미 많은 우수한 ORM 프레임 워 크 를 사용 할 수 있 습 니 다.흔히 볼 수 있 는 것 은 Mybatis(batis),Hibernate,Jpa,Jdo 등 입 니 다.장점:
Mybatis jdbc
,spring jdbc 가 실현 하고 자 하 는 세부 사항 이 매우 많 습 니 다.예 를 들 어 Mybatis 는 더 많은 대상 맵 을 봉 인 했 습 니 다.
,인터페이스 개발 에 직면 하여 효율 이 높 고 분 단위 로 sql 을 해결 합 니 다.진지 하 게 대답 하 다.
Hibernate 와 MyBatis 는 Session Factory Buider 를 통 해 XML 설정 파일 로 Session Factory 를 생 성 한 다음 Session Factory 에서 Session 을 생 성 하고 마지막 으로 Session 에서 실행 사무 와 SQL 문 구 를 열 수 있 습 니 다.그 중에서 도 Session Factory Buider,Session Factory,Session 의 생명 주 기 는 많 지 않다.
Hibernate 와 MyBatis 는 모두 JDBC 와 JTA 사무 처 리 를 지원 합 니 다.
Mybatis 우세
어떤 위 에서 발췌 한 경전 총 결:
Hibernate
MyBatis
Hibernate 와 Mybatis 의 2 급 캐 시 는 시스템 의 기본 캐 시 체 제 를 사용 하 는 것 을 제외 하고 자신의 캐 시 를 실현 하거나 다른 제3자 캐 시 방안 을 위해 어댑터 를 만들어 캐 시 행 위 를 완전히 덮어 쓸 수 있 습 니 다.
다른 점:
Hibernate 의 2 급 캐 시 설정 은 Session Factory 에서 생 성 된 설정 파일 에 상세 하 게 설정 한 다음 구체 적 인 표-대상 맵 에 설정 하 는 것 이 캐 시 입 니 다.
MyBatis 의 2 급 캐 시 설정 은 각각 구체 적 인 표-대상 맵 에서 상세 하 게 설정 되 어 있 으 며,서로 다른 표 에 대해 서로 다른 캐 시 체 제 를 사용자 정의 할 수 있 습 니 다.또한 Mybatis 는 네 임 스페이스 에서 같은 캐 시 설정 과 인 스 턴 스 를 공유 하고 Cache-ref 를 통 해 이 루어 집 니 다.
두 가지 비교:8195°8195°Hibernate 는 조회 대상 에 대해 좋 은 관리 체 제 를 가지 기 때문에 사용 자 는 SQL 에 관심 을 가 질 필요 가 없다.따라서 2 급 캐 시 를 사용 할 때 더러 운 데이터 가 발생 하면 시스템 이 오 류 를 보고 하고 알려 줍 니 다.
한편,MyBatis 는 이 방면 에서 2 급 캐 시 를 사용 할 때 특히 조심해 야 한다.데이터 업데이트 작업 의 파급 범 위 를 완전히 확정 하지 못 하면 Cache 의 맹목적 인 사용 을 피 할 수 있 습 니 다.그렇지 않 으 면 더러 운 데이터 의 출현 은 시스템 의 정상 적 인 운행 에 큰 위험 을 가 져 올 것 이다.
면접 문제 3:Mybatis 의\#{}과${}은 어떤 차이 가 있 습 니까?
진지 하 게 대답 하 다.
-- #{}
<select id="userLogin" parameterType="java.util.Map" resultMap="userResMap">
select id, username, password, role
from user
where username = #{username}
and password = #{password}
</select>
-- ${}
<select id="userLogin" parameterType="java.util.Map" resultMap="userResMap">
select id, username, password, role
from user
where username = ${username}
and password = ${password}
</select>
1.\#들 어 오 는 데 이 터 를 문자열 로 생각 하고 자동 으로 들 어 오 는 데이터 에 더 블 따옴표 를 추가 합 니 다.예 를 들 어
where username=#{username},
에 들 어 오 는 값 이 111 이면 sql 로 분 석 될 때의 값 은 where username="111"이 고 들 어 오 는 값 이 id 라면 sql 은 where username="id"로 분 석 됩 니 다.2.$들 어 오 는 데 이 터 를 sql 에 직접 표시 합 니 다.
예 를 들 어
where username=${username},
에 들 어 오 는 값 이 111 이면 sql 로 분 석 될 때의 값 은 where username=111 입 니 다.그렇다면 들 어 오 는 값 이
:;drop table user
이 라면;어떻게 되 는 거 야?분석 한 sql 은:
select id, username, password, role from user where username=;drop table user;
\#방식 은 sql 주입 을 어느 정도 방지 할 수 있 습 니 다.$방식 은 Sql 주입 을 방지 할 수 없습니다.$방식 은 일반적으로 데이터베이스 대상,예 를 들 어 표 이름 을 입력 하 는 데 사 용 됩 니 다.
# $
,“${xxx}”
과 같은 인 자 를 사용 하지 않 으 면 수 동 으로 여과 작업 을 잘 하여 sql 주입 공격 을 방지 해 야 합 니 다.MyBatis 에서
“${xxx}”
과 같은 형식의 매개 변 수 는 SQL 컴 파일 에 직접 참여 하여 주입 공격 을 피 할 수 없습니다.그러나 동적 표 이름과 열 명 과 관련 될 때 “${xxx}”
과 같은 매개 변수 형식 만 사용 할 수 있 습 니 다.따라서 이러한 매개 변 수 는 주입 을 방지 하기 위해 코드 에서 수 동 으로 처리 해 야 한다.종합 적 으로,우 리 는 MyBatis 의 매 핑 문 구 를 작성 할 때,가능 한 한
“#{xxx}”
과 같은 형식 을 사용 합 니 다.“${xxx}”
과 같은 인 자 를 사용 하지 않 으 면 SQL 주입 공격 을 막 기 위해 수 동 으로 여과 작업 을 해 야 합 니 다.깊이 추궁:
추궁 1:sql 주입 이 무엇 입 니까?
sql 주입 은 코드 주입 기술 로 데이터 구동 을 공격 하 는 응용 에 사 용 됩 니 다.악의 적 인 SQL 문 구 는 실 행 된 실체 필드 에 삽입 되 었 습 니 다(예 를 들 어 데이터 베 이 스 를 저장 하기 위해 공격 자 에 게)
SQL 주입 하면 모두 가 낯 설 지 않 을 것 이 라 고 믿 는 것 은 해커 학우 들 이 자주 사용 하 는 공격 방식 이다.공격 자 는 인터페이스의 폼 정보 나 URL 에 이상 한 SQL 세 션(예 를 들 어
“or ‘1'='1'
)을 입력 하면 파라미터 검사 가 부족 한 응용 프로그램 에 침입 할 수 있 습 니 다.그래서 우리 의 응용 에서 이런 공격 방식 에 대비 하기 위해 일 을 해 야 한다.일부 안전성 에 대한 요구 가 높 은 응용 프로그램(예 를 들 어 은행 소프트웨어)에서 SQL 문 구 를 모두 저장 과정 으로 바 꾸 는 방식 을 자주 사용 하여 SQL 주입 을 방지한다.이것 은 당연히 매우 안전 한 방식 이지 만,우 리 는 평소에 개발 할 때 이런 딱딱 한 방식 이 필요 하지 않 을 것 이다.
2:my batis 는 어떻게 sql 주입 을 방지 합 니까?
MyBatis 프레임 워 크 는 반자동 화 된 지구 층 프레임 워 크 로 서 SQL 문 구 는 우리 가 직접 작성 해 야 합 니 다.이 럴 때 SQL 주입 을 방지 해 야 합 니 다.사실 MyBatis 의 SQL 은'입력+출력'기능 을 가지 고 함수 와 유사 한 구조 로 위의 두 가지 예 를 참고 합 니 다.
그 중에서 parameterType 은 입력 한 매개 변수 유형 을 표시 하고 resultType 은 출력 한 매개 변수 유형 을 표시 합 니 다.위의 글 에 응답 합 니 다.SQL 주입 을 막 으 려 면 당연히 입력 매개 변수 에 공 을 들 여야 합 니 다.위 코드 에 서 는\#의 입력 매개 변수 가 SQL 에 연 결 된 부분 을 사용 합 니 다.매개 변 수 를 입력 한 후 실 행 된 SQL 문 구 를 출력 하면 SQL 이 이 렇 습 니 다.
select id, username, password, role from user where username=? and password=?
어떤 인 자 를 입력 하 든 출력 된 SQL 은 이 렇 습 니 다.MyBatis 가 사전 컴 파일 기능 을 사용 하기 때문에 SQL 이 실행 되 기 전에 위의 SQL 을 데이터베이스 에 보 내 컴 파일 합 니 다.실행 할 때 컴 파일 된 SQL 을 직접 사용 하여 자리 표시 자 를 바 꿉 니 다."?"됐 습 니 다.SQL 주입 은 컴 파일 과정 에 만 작용 하기 때문에 이러한 방식 은 SQL 주입 문 제 를 잘 피 할 수 있다.총결산
이 글 은 여기까지 입 니 다.당신 에 게 도움 을 줄 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 실 수 있 기 를 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.