프로젝트 팀의 구성원이 항상 Mybatis를 사용했기 때문에 지난 이틀 동안 새로운 프로젝트가 시작되었습니다. 나는 개인적으로 JPA의 미니멀리스트 모델을 선호하지만, Mybatis는 여전히 프로젝트를 유지하기 위해 통합 기술 선택을 유지하기로 결심합니다. 나는 온라인으로 Spring Boot와 Mybatis의 조합에 대한 관련 정보를 찾았습니다. 다양한 형태가있어 사람들이 그것을 읽는 데 지친 사람들이 있습니다. Mybatis의 공식 데모와 문서를 결합하여 마침내 두 가지 가장 간단한 모드를 찾았습니다. 나는 그것을 요약하고 공유하는 데 하루를 보냈다.
ORM 프레임 워크의 본질은 프로그래밍에서 작동 데이터베이스의 인코딩을 단순화하는 것입니다. 이제 기본적으로 두 회사가 남아 있습니다. 하나는 SQL Hibernate의 문장을 쓸 수 없다고 주장하는 것이고, 다른 하나는 동적 SQL의 mybatis를 유연하게 디버깅하는 것입니다. 둘 다 고유 한 특성을 가지고 있으며 엔터프라이즈 수준의 시스템 개발의 요구에 따라 유연하게 사용될 수 있습니다. 나는 흥미로운 현상을 발견했습니다. 대부분의 전통적인 회사는 최대 절전 모드를 사용하는 것을 좋아하고 인터넷 산업은 일반적으로 mybatis를 사용합니다.
최대 절전 모드의 특징은 모든 SQL이 Java 코드를 사용하여 생성되며 프로그램에서 뛰어 내리지 않고 (읽기) SQL을 쓸 필요가 없다는 것입니다. 프로그래밍 무결성이 있습니다. 모델의 맨 위로 발전합니다. 기본적으로 해당 SQL은 메소드 이름에 따라 생성 될 수 있습니다. 많이 모른다면 Spring Data JPA 사용에 대한 이전 기사를 읽을 수 있습니다.
MyBatis는 초기 단계에서 매우 번거롭고 다양한 구성 파일, 엔티티 클래스, DAO 레이어 매핑 연결 및 기타 여러 구성이 필요합니다. 물론, Mybatis는 또한이 단점을 발견했습니다. 초기 단계에서 발전기가 개발되어 테이블 결과를 기반으로 엔티티 클래스, 구성 파일 및 DAO 계층 코드를 자동으로 생성 할 수 있으며, 이는 개발 볼륨의 일부를 줄일 수 있습니다. 후반 단계에서는 많은 최적화를 사용하여 주석을 사용하고 DAO 레이어 및 구성 파일 등을 자동으로 관리 할 수 있으며, 오늘날 우리가 이야기 할 모델입니다. Mybatis-Spring-Boot-Starter는 SpringBoot+MyBatis가 구성 파일없이 완전히 주석을 달 수 있으며 간단한 구성이며 시작하기 쉽습니다.
이제 그것에 대해 생각하십시오. Spring Boot는 훌륭합니다. Spring Boot와 관련이있는 한 단순화됩니다.
Mybatis-Spring-Boot-Starter
공식 설명 : Mybatis Spring-Boot-Starter가 Spring Boot와 함께 Mybatis를 사용하는 데 도움이됩니다.
실제로, Mybatis는 Spring Boot가 인기가 높기 때문에 재미에 참여할 수있는 솔루션을 개발했지만, 이것은 실제로 많은 문제를 해결했으며 실제로 사용하기가 훨씬 부드럽습니다. Mybatis-Spring-Boot-Starter를위한 두 가지 주요 솔루션이 있습니다. 하나는 주석을 사용하여 모든 문제를 해결하고 다른 하나는 단순화 된 오래된 전통입니다.
물론 모든 모드는 먼저 Mybatis-Spring-Boot-Starter의 POM 파일을 소개해야합니다. 이제 최신 버전은 1.1.1입니다 (단지 Double 11에 있습니다 :)).
<pectionency> <groupid> org.mybatis.spring.boot </groupid> <artifactid> mybatis-spring-boot-starter </artifactid> <bersion> 1.1.1 </version> </dependency>
두 가지 개발 모델을 소개하겠습니다
구성 파일 주석 버전이 없습니다
주석으로 이루어집니다.
1 관련 Maven 파일을 추가하십시오
<pectionies> <pectionency> <groupId> org.springframework.boot </groupId> <artifactid> Spring-Boot-Starter </artifactid> </depectency> <groupid> org.springframework.boot </groupid> <artifactidid </groupid> <artifactid > Spring-Boot-starter-test </artifactid> <scope> test </scope> </dependency> <pectionement> <groupid> org.springframework.boot </groupid> <artifactid> Spring-Boot-Starter-Web </artifactid> </depen dency> <groupid> org.mybatis.spring.boot </groupid> <artifactid> mybatis-spring-boot-starter </artifactid> <bersion> 1.1.1 </dependency> <pelection> <groupid> mysql </groupid> <artifactid> mysql-c Onnector-Java </artifactid> </dependency> <pectionency> <groupid> org.springframework.boot </groupid> <artifactid> spring-boot-devtools </artifactid> <selection> true </teptional> </dependency> </dependencies>
여기에 완전한 POM 패키지를 게시하지 않겠습니다. 소스 코드를 직접 읽으십시오.
2. Application.properties 관련 구성을 추가합니다
mybatis.type-aliases-package = com.neo.entityspring.datasource.driverclassname = com.mysql.jdbc.driverspring.datasource.url = jdbc : mysql : // localhost : 3306/test1? true & caracterencode = utf-8sprfred = rootspring.datasource.Password = 루트
SpringBoot는 Spring.datasource.*의 관련 구성을 자동으로로드하고 데이터 소스는 SQLSESSIONFACTORY에 자동으로 주입됩니다. sqlsessionfactory는 자동으로 맵퍼에 주입됩니다. 그건 그렇고, 당신은 모든 것에 대해 걱정할 필요가없고, 그것을 집어 들고 사용하십시오.
시작 클래스 @MapperScan 에서 Mapper 패키지 스캔 추가
@springbootApplication@mapperscan ( "com.neo.mapper") 공개 클래스 응용 프로그램 {public static void main (String [] args) {springApplication.run (Application.Class, Args);}}또는 Mapper 클래스에 @mapper를 추가하십시오. 위의 것을 사용하는 것이 좋습니다. 그렇지 않으면 각 맵퍼에 주석을 추가하는 것이 매우 번거 롭습니다.
3. 매퍼를 개발하십시오
세 번째 단계는 가장 중요한 부분이며 SQL 생산은 여기에 있습니다.
public interface usermapper {@select ( "select * from user")@results ({@result (property = "userex", column = "user_sex", javatype = userexenum.class),@result (property = "nickname", column = "nick_name"))) 목록 <사용자 endity> getall (); #{id} ")@results ({@result (property ="userex ", column ="user_sex ", javatype = userexenum.class),@result (property ="nickname ", column ="nick_name "}) useentity getone (long id);@insert ("usern, password, user},} #{userEx}) ") void insert (userentity user);@update ("USDERS SET SET USERNAME =#{username}, nick_name =#{nickname} where id =#{id} ") void update (userentity user);@delete ("id =#{id} ") void delete (long id);};생산에 더 가까워지기 위해 데이터베이스에서 user_sex와 nick_name의 두 가지 속성에 특별히 밑줄을 긋고 엔티티 클래스 속성 이름은 일치하지 않습니다. 또한 user_sex는 열거를 사용합니다
@Select는 쿼리 클래스의 주석이며 모든 쿼리는 이것을 사용합니다.
@Result 반환 된 결과 세트를 수정하고 관련 엔티티 클래스 속성 및 데이터베이스 필드는 하나씩 해당합니다. 엔티티 클래스 속성 및 데이터베이스 속성 이름이 일관된 경우이 속성을 수정할 필요가 없습니다.
@Insert 사용에 데이터베이스를 삽입하면 엔티티 클래스를 직접 통과하면 해당 값에 속성을 자동으로 구문 분석합니다.
@update는 수정을 담당하며 개체에 직접 전달 될 수 있습니다.
@Delete는 삭제를 담당합니다
더 많은 속성은 여기를 참조하십시오 : http://www.mybatis.org/mybatis-3/zh/java-api.html
# 기호와 $ 기호 사용의 차이점은 다음과 같습니다.
//이 예제는 select * from where where name =? selectTeachForGivEnname (@param ( "name") 문자열 이름);
4. 사용
위의 세 단계는 기본적으로 관련 계층 개발을 완료합니다. 그것을 사용할 때는 일반 클래스로 사용하면 주입 할 수 있습니다.
@runwith (springrunner.class) @springboottestpublic class usermappertest {@autowiredprivate usermapper usermapper; @testpublic void testinsert () {usermapper.insert (new userentity ( "aa", "a123456", usereNenum.man); "B123456", UsersExenum.woman)); usermapper.insert (새로운 사용자 엔티티 ( "CC", "B123456", usersExenum.woman)); assert.assertequals (3, usermapper.getall ()) usermapper.getall (); system.out.println (user.tostring ());}@testpublic void testupdate ()는 예외 {userentity user = usermapper.getone (3l); system.out.println (user.tostring ()); user.setnickname ( "neo"); usermpper.update (user); assert.asserttrue (( "neo".equals (3l) .getnickname ()));소스 코드에는 완전한 추가, 삭제, 수정 및 검색이 있으므로 여기에 게시하지 않습니다.
미니멀리스트 XML 버전
미니멀리스트 XML 버전은 파일 매핑의 오래된 전통을 유지합니다. 최적화는 주로 구현할 필요가없는 구현 계층에 반영됩니다. 시스템은 메소드 이름에 따라 매핑 파일에서 해당 SQL을 자동으로 찾습니다.
1. 구성
POM 파일은 다음 구성이 application.properties 에 추가 된 것을 제외하고는 이전 버전과 동일합니다.
mybatis.config-locations = classpath : mybatis/mybatis-config.xmlmybatis.mapper-locations = classpath : mybatis/mapper/*. xml
MyBatis 기본 구성 파일 및 엔티티 클래스 매핑 파일의 주소를 지정합니다.
mybatis-config.xml 구성
<configuration> <taintealiases> <faultealias alias = "integer"type = "java.lang.integer" /> <failtealias alias = "long"type = "java.lang.long" /> <failtealias alias = "hashmap"type = "java.util.hashmap" /> <intecmap "intinkedhashmap" type = "java.util.linkedhashmap" /> <faintealias alias = "arraylist"type = "java.util.arraylist" /> <faintealias alias = "linkedlist"type = "java.util.linkedList" /> < /fabiliass> < /configuration>
여기에 기본 mybatis 구성을 추가 할 수도 있습니다
2. 사용자의 매핑 파일을 추가하십시오
<mapper namepace = "com.neo.mapper.usermapper"> <resultmap id = "baseresultmap"type = "com.neo.entity.userentity"> <id column = "id"property = "id"jdbctype = "bigint" /> <result column = "username"property = "username"varchal "" "varchor" "varchor" "varchor" 속성 = "비밀번호"jdbctype = "varchar" /> <결과 열 = "user_sex"property = "userex"javatype = "com.neo.enums.usersexenum" /> <result column = "nick_name"property = "nickname"jdbctype = "varchar" /> < /resultmap> <sql id = "base_liton"> 비밀번호, user_sex, nick_name </sql> <select id = "getAll"resultmap = "baseresultMap"> select <포함 refid = "base_column_list"/> from </select> <select id = "getOne"parameterType = "java.lang.long"resultMap = "vaseresultmap"real refid include refid. /> ushere id = #{id} </select> <insert id = "insert"parametertype = "com.neo.entity.userentity"> user (username, password, user_sex) value ( #{username}, #{password}, #{userestex}) <업데이트 id = "업데이트" ParameterType = "com.neo.entity.userentity"> 업데이트 사용자 set <if test = "username! = null"> username = #{username}, </if> <test = "password! = null"> password = {password}, </if> nick_name = #{nickname} #<delete} <delete " parametertype = "java.lang.long"> id = #{id} </delete> </mapper> where hose where where whereusers 삭제실제로, 그것은 단지 Mapper SQL을 이전 버전에서 여기에서 XML로 옮기고있었습니다.
3. DAO 레이어 코드를 작성하십시오
public interface usermapper {list <userentity> getall (); userentity getone (long id); void insert (userentity user); void update (userentity user); void delete (long id);}이전 단계와 비교하여 인터페이스 메소드 만 남습니다.
4. 사용
사용과 이전 버전에는 차이가 없습니다. 코드를보십시오.
선택하는 방법
두 모드에는 고유 한 특성이 있습니다. 주석이 달린 버전은 간단하고 빠른 모드에 적합합니다. 실제로 요즘 인기있는 마이크로 서비스 모델과 마찬가지로 마이크로 서비스는 자체 데이터베이스에 해당합니다. 멀티 테이블 연결 쿼리에 대한 수요는 크게 줄어들고이 모드에 점점 더 적합해질 것입니다.
기존 전통적인 모델은 대규모 프로젝트에 더 적합합니다. SQL을 동적으로 유연하게 생성 할 수 있으며 SQL을 조정하기에 편리하며 즐거움과 매끄러운 SQL을 작성하는 느낌이 있습니다.
샘플 코드 -github : https://github.com/ityoukne/spring-boot-examples
예제 코드-코드 클라우드 : https://gitee.com/ityoukne/spring-boot-examples