mybatis 가 어떻게 반자동 화 결합 을 해제 하 는 지 간단히 말 하기(추천)

JAVA 의 발전 과정 에서 일련의 ORM 프레임 워 크,JPA,Hibernate,Mybatis 와 Spring jdbc 가 생 겨 나 앞으로 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)CRUD
1.조회  

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)코드 디 렉 터 리 구조

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기