mybatis 가 어떻게 반자동 화 결합 을 해제 하 는 지 간단히 말 하기(추천)
my batis 소스 코드 를 연구 함으로써 my batis 의 대체적인 구 조 를 다음 그림 으로 요약 할 수 있 습 니 다.
1.Mybatis 소스 코드 에 따라 3 층 으로 추상적으로 추정한다.기초 지원 층,핵심 처리 층 과 인터페이스 층
2.기본 지원 층 은 데이터 원본,사무 관리,로그,형식 변환,캐 시,Bind,해석 기 등 을 포함한다.
3.핵심 처리 층 은 설정 해석,설정 맵,SQL 해석,SQL 실행,결과 집합 맵,플러그 인 등 을 포함한다.
4.인터페이스 층 은 주로 JAVA API 를 제공한다
이 글 에서 이 프레임 워 크 를 바탕 으로 다음 과 같은 몇 가지 문 제 를 해결 할 것 입 니 다.
Q1:코드 를 결합 하여 my batis 의 CRUD 원 리 를 분석 하 는 것 은 어 떻 습 니까?
Q2:왜 반자동 화 된 Mybatis 가 자동 화 된 Hibernate 보다 인기 가 많 습 니까?
Q3:Mybatis 는 왜 소나무 결합 을 실현 할 수 있 습 니까?
하나. my batis 의 CRUD 원리
이 문 제 를 해결 하기 위해 서 우 리 는 먼저 다음 과 같은 코드 를 살 펴 보 자.
이 코드 가 실현 하 는 기능 은:userid 사용자 정보 조회. 코드 에서 우 리 는 대체적으로 5 단계 로 나 뉜 다 는 것 을 알 수 있다.
첫 번 째 단계:mybatis 의 전역 프로필 mybatis-config.xml 내용 읽 기
두 번 째 단계:SqlSession Factory 세 션 공장 만 들 기
세 번 째 단계:SqlSession Factory 에 따라 SQL 세 션 SqlSession 만 들 기
STEP 4:조회 작업 수행
public static void main(String[] args) throws IOException {
//
String resource = "demo/mybatis/resources/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// SqlSessionFactory
SqlSessionFactory sqlSF = new SqlSessionFactoryBuilder().build(inputStream);
// SqlSession
SqlSession sqlS = sqlSF.openSession();
// id
try {
// user_id=2
List<UserInfo> list = sqlS.selectList("getUserInfoById", 2);
for (UserInfo user : list) {
System.out.println("UserName:" + user.getUser_name() + ",Addr:" + user.getUser_addr());
}
} finally {
sqlS.close();
}
}
그럼,Mybatis-config.xml 내용 을 다시 보 겠 습 니 다.내용 에서 알 수 있 듯 이
그렇다면 이 세 노드 는 도대체 무엇 을 나타 내 는 것 일 까?
1.properties 노드 는 속성 노드 를 나타 내 고 외부 에서 자원 을 동적 으로 얻 을 수 있 으 며 가 져 온 자원 을 문맥 에 사용 할 수 있 습 니 다.jdbc.properties 내용 을 살 펴 보 겠 습 니 다.
#mysql
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/db_test?characterEncoding=UTF-8
username=root
password=root
한 번 보면 알 수 있 듯 이 이것 은 데이터베이스 에 접근 하 는 관련 매개 변수 입 니 다.그러면 어느 곳 에서 이 매개 변 수 를 인용 합 니까?2.environment 노드,환경 노드 설정 노드,예 를 들 어 데이터 베이스 테스트 환경,개발 환경 등 을 설정 할 때 dataSource 와 관련 된 하위 노드 의 자리 표시 자 는 properties 노드 가 jdbc.properties 에서 얻 은 내용 을 참조 합 니 다.
3.mapper 노드,즉 맵 노드 는 맵 파일 을 연결 하 는 데 사 용 됩 니 다.이 맵 파일 의 내용 을 살 펴 보 겠 습 니 다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mybatisEntity">
<!--Query all-->
<select id="listUserInfo" resultType="demo.mybatis.entity.UserInfo">
SELECT user_name ,user_addr FROM user_info
</select>
<!--Query by id-->
<select id="getUserInfoById" resultType="demo.mybatis.entity.UserInfo">
SELECT user_name ,user_addr FROM user_info WHERE user_id=#{user_id}
</select>
<!--add-->
<select id="addUserInfo" resultType="demo.mybatis.entity.UserInfo">
INSERT INTO user_info(user_name,user_addr)VALUES(#{user_name},#{user_addr})
</select>
<!--delete-->
<select id="delUserInfoById" resultType="demo.mybatis.entity.UserInfo">
DELETE FROM user_info WHERE user_id=#{user_id}
</select>
</mapper>
이것 은 SQL 의 첨삭 과 수정 을 알 수 있다.상기 분석 을 통 해 우리 가 글 에서 제기 하기 시작 한 세 가지 문 제 는 이제 기본적으로 해결 할 수 있다.
Q3:Mybatis 는 왜 소나무 결합 을 실현 할 수 있 습 니까?
상기 분석 을 통 해 우 리 는 my batis 를 ORM 프레임 워 크 로 개발 할 때 우리 의 SQL 문 구 는 모두 xml 설정 파일(예 를 들 어 위의 userInfo-config.xml)에 쓰 여 전통 적 인 하 드 코딩 의 강 한 결합 문 제 를 해결 하고'하 드 코딩'에서'소프트 코딩'까지 의 과정 을 교묘 하 게 실현 한 것 을 알 고 있다.
소나무 결합 의 장점 을 제외 하고 경험 이 있 는 개발 자 들 은 하 드 코딩 에 중대 한 문제 가 존재 한 다 는 것 을 잘 알 아야 한다.즉,SQL 코드 를 바 꾼 후에 재 컴 파일,포장,배치 등 이 필요 한 후에 야 프로그램 이 실 행 될 수 있 고 배치 가능 한 xml 방식 으로 이 루어 진 SQL 문 구 는 필요 하지 않다.
Q4:왜 반자동 화 된 Mybatis 가 자동 화 된 Hibernate 보다 인기 가 많 습 니까?
기능 적 으로 볼 때 Hibernate 는 매우 강하 지만 해결 하기 어 려 운 문제 가 존재 한다.
(1)학습 비용 이 많이 든다.초보 자 에 게 Hibernate 를 배 우 는 시간 비용 은 Mybatis 보다 훨씬 많 습 니 다.Mybatis 는 곧 시작 합 니 다.
(2)육중 하 다.Hibernate 의 강력 한 다른 면 은 육중 한 면 을 나타 낸다.
(3)SQL 을 봉인 한다.Hibernate 는 SQL 을 봉인 하고 사용자 에 게 만 API 인 터 페 이 스 를 제공 하 는 것 이 원활 하지 못 한 근본 적 인 요소 입 니 다.
그러나 my batis 는 SQL 을 독립 시 켜 사용자 정의 로 만 들 었 습 니 다.
위 와 같이 Hibernate 자동화 라 고 하 는 이 유 는 SQL 생 성,해석,실행 등 이 모두 Hibernate 에서 자동 으로 생 성 되 기 때 문 입 니 다.
Mybatis 반자동 화 는 SQL 문 구 는 사용자 정의,SQL 해석,실행 등 작업 을 Mybatis 에서 수행 해 야 하기 때 문 입 니 다.
이렇게 말 하면 전통 적 인 jdbc 는 수공 이 고 Hibernate 는 자동화 이 며 Mybati 는 jdbc 와 Hibernate 의 반자동 화 ORM 프레임 워 크 를 바탕 으로 한다.
둘째. 전체 Mybatis CRUD
(1)웹 애플 리 케 이 션 프로젝트 만 들 기
Intellij IDEA=>새 프로젝트 만 들 기=>Java Enterprise=>웹 애플 리 케 이 션 선택=>Next=>
프로젝트 이름 MybatisCRUD=>Finish
(2)jar 패키지 가 져 오기
두 개의 jar 패키지 가 져 오기:MySQL 드라이버 jar 패키지 와 Mybatis jar 패키지
프로젝트 구조(Ctrl+Alt+Shift+S)=>모듈=>MybatisCRUD=>Dependencies=>JARS 또는 directories...
성공 적 으로 가 져 온 구 조 는 다음 과 같 습 니 다.
(3)테스트 데이터 생 성
#
DROP DATABASE IF EXISTS db_test
CREATE DATABASE db_test
#
DROP TABLE IF EXISTS User_Info
CREATE TABLE user_info
(
user_id INT(5) AUTO_INCREMENT PRIMARY KEY NOT NULL,# id
user_name VARCHAR(50) NOT NULL,#
user_addr VARCHAR(100) NOT NULL #
)
#
INSERT INTO user_Info(user_name,user_addr)
VALUES('A','SH-PuDong'),('B','SH-YangPu'),
('C','SH-QingPu'),('D','SH-XuHui')
(4)UserInfo 실체 만 들 기
package demo.mybatis.entity;
public class UserInfo {
String user_name;
String user_addr;
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public String getUser_addr() {
return user_addr;
}
public void setUser_addr(String user_addr) {
this.user_addr = user_addr;
}
}
5)자원 파일 세 개 만 들 기1.jdbc.property
#mysql
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/db_test?characterEncoding=UTF-8
username=root
password=root
2.mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- -->
<properties resource="demo/mybatis/resources/jdbc.properties">
</properties>
<!-- -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- -->
<mappers>
<mapper resource="demo/mybatis/resources/userInfo-config.xml"/>
</mappers>
</configuration>
3.userInfo.config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mybatisEntity">
<!-- -->
<select id="listUserInfo" resultType="demo.mybatis.entity.UserInfo">
SELECT user_name ,user_addr FROM user_info
</select>
<!-- id -->
<select id="getUserInfoById" resultType="demo.mybatis.entity.UserInfo">
SELECT user_name ,user_addr FROM user_info WHERE user_id=#{user_id}
</select>
<!--add-->
<select id="addUserInfo" resultType="demo.mybatis.entity.UserInfo">
INSERT INTO user_info(user_name,user_addr)VALUES(#{user_name},#{user_addr})
</select>
<!--delete-->
<select id="delUserInfoById" resultType="demo.mybatis.entity.UserInfo">
DELETE FROM user_info WHERE user_id=#{user_id}
</select>
</mapper>
(6)CRUD1.조회
package demo.mybatis.Test;
import demo.mybatis.entity.UserInfo;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestMybatis {
public static void main(String[] args) throws IOException {
//
String resource = "demo/mybatis/resources/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// SqlSessionFactory
SqlSessionFactory sqlSF = new SqlSessionFactoryBuilder().build(inputStream);
// SqlSession
SqlSession sqlS = sqlSF.openSession();
// id
try {
// user_id=2
List<UserInfo> list = sqlS.selectList("getUserInfoById", 2);
for (UserInfo user : list) {
System.out.println("UserName:" + user.getUser_name() + ",Addr:" + user.getUser_addr());
}
} finally {
sqlS.close();
}
}
}
2.추가
package demo.mybatis.Test;
import demo.mybatis.entity.UserInfo;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestMybatis {
public static void main(String[] args) throws IOException {
//
String resource = "demo/mybatis/resources/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// SqlSessionFactory
SqlSessionFactory sqlSF = new SqlSessionFactoryBuilder().build(inputStream);
// SqlSession
SqlSession sqlS = sqlSF.openSession();
//
try{
UserInfo addUser = new UserInfo();
addUser.setUser_name("E");
addUser.setUser_addr("BJ-DongCheng");
sqlS.selectList("addUserInfo",addUser);
List<UserInfo> list=sqlS.selectList("listUserInfo");
for (UserInfo user :list){
System.out.println("UserName:"+user.getUser_name()+",Addr:"+user.getUser_addr());
}
}finally {
sqlS.close();
}
}
}
3.삭제
package demo.mybatis.Test;
import demo.mybatis.entity.UserInfo;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestMybatis {
public static void main(String[] args) throws IOException {
//
String resource = "demo/mybatis/resources/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// SqlSessionFactory
SqlSessionFactory sqlSF = new SqlSessionFactoryBuilder().build(inputStream);
// SqlSession
SqlSession sqlS = sqlSF.openSession();
//
try{
sqlS.selectList("delUserInfoById",12);
List<UserInfo> list=sqlS.selectList("listUserInfo");
for (UserInfo user :list){
System.out.println("UserName:"+user.getUser_name()+",Addr:"+user.getUser_addr());
}
}finally {
sqlS.close();
}
}
}
(7)코드 디 렉 터 리 구조이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MySQL/마이바티스 | 동적 쿼리 사용A라는 서비스에 해당하는 테이블을 조인하고 조회하는 데 사용됩니다. 나중에 공통화를 위해 B 및 C 서비스도 추가됩니다. A, B, C 서비스는 모두 단일 쿼리에서 작동할 수 있도록 공통화되어야 합니다. 테이블에 각...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.