mybatis 만 사용할 때 (여러 세션에 걸친 트랜잭션을 구현할 수 없음) 많은 제한 사항이 있으며, 많은 비즈니스 시스템은 원래 Spring에서 관리하는 거래이므로 Mybatis는 Spring과 가장 잘 통합됩니다.
버전 요구 사항
프로젝트 | 버전 | 주소를 다운로드하십시오 | 설명 |
mybatis | 3.0 이상 | https://github.com/mybatis/mybatis-3/releases | |
봄 | 3.0 이상 | http://projects.spring.io/spring-framework/ | |
미바 티스 스프링 | 1.0 이상 | https://github.com/mybatis/spring/releases |
<!-비즈니스 패키지의 자동 스캔-> <context : component-scan base-package = "com.xxx.service"/> <!-데이터 소스-> <jee : jndi-lookup id = "jndidatasource"jndi-name = "java : comp/env/jdbc/dataSource"-<jo id id = "transAction". > <property name = "dataSource"ref = "jndidatasource"/> </bean> <!-주석 기반을 구성합니다-> <tx : 주석 중심 트랜잭션-매너 = "txmanager"proxy-target class = "true"/>
단일 통합
<!-myBatis의 통합-> <bean id = "sqlsessionFactory"> <property name = "dataSource"ref = "jndidatasource" /> <property name = "configlocation"value = "classPath : /mybatis/mybatis-config.xml" />-자동 구성 앨리어스-<property espack rame = " value = "com.xxx.dto" /> < /bean> <!-dao bean을 만듭니다.
우리는 그것을 사용하는 방법을 이해해야 할뿐만 아니라 왜 우리가 그것을 사용하는지 이해해야합니다.
SQLSESSIONFACTORYBEAN은 공장 콩이며 그 기능은 구성 (데이터 소스, 별명 등)을 구문 분석하는 것입니다.
Mapperfactorybean은 공장 콩입니다. 스프링 컨테이너에서 공장 콩에는 특별한 용도가 있습니다. 스프링이 공장 콩을 다른 콩에 주입하면 공장 콩 자체를 주입하지 않고 콩의 getObject 방법을 호출합니다. 이 getObject 메소드가 무엇을하는지 살펴 보겠습니다.
public t getObject ()는 예외를 던져 {return getSqlsession (). getMapper (this.mapperInterface); }이것을 본 후에, 당신은이 방법이 우리가 mybatis 만 사용했을 때와 동일하다는 것을 이해해야합니다. 먼저 SQLSESSION 객체를 얻은 다음 SQLSESSION에서 MapPer 객체를 가져옵니다 (Mapper는 Mapper 인터페이스 인터페이스를 프록시하는 프록시 객체 이며이 인터페이스는 사용자가 제공하는 DAO 인터페이스입니다). 당연히 비즈니스 계층에 대한 최종 주입은이 맵퍼 객체입니다.
일반적으로 말하면 둘 이상의 프로젝트가 있습니다. 여러 프로젝트가있는 경우 위 구성에 따라 순서대로 구성하십시오.
배치 업데이트를 사용하는 방법
이전 섹션에서는 Mapper 객체를 비즈니스 계층에 주입하는 방법에 대해 이야기했습니다. 맵퍼의 동작은 구성에 따라 다릅니다. MyBatis는 기본적으로 단일 업데이트를 사용합니다 (즉, 기본 임원 유형은 배치 대신 간단합니다). 물론 MyBatis 구성 파일을 수정하여 기본 동작을 수정할 수 있지만, 하나 또는 여러 개의 매퍼가 배치 업데이트를 사용하려는 경우 수행 할 수 없습니다. 현재 템플릿 기술을 사용해야합니다.
<!-템플릿을 통해 myBatis의 동작을 커스터마이징합니다-> lt; bean id = "sqlsessionTemplatesImple"> <생성자-arg index = "0"ref = "sqlsessionFactory"/> <!-단일 모드에서 업데이트-> <Constructor-arg index = "1"value = "simple" "/bean> <!-mybat의 행동을 명시하십시오. id = "sqlsessiontemplatebatch"> <생성자 -Arg index = "0"ref = "sqlSessionFactory"/> <!-배치 모드에서 업데이트-> <Constructor-Arg index = "1"value = "batch"/> </bean>
여기서 저자는 단일 업데이트를 사용하고 다른 하나는 배치 업데이트를 사용하여 두 개의 템플릿 객체를 정의합니다. 템플릿이 있으면 Mapper가 행동하는 방식을 변경할 수 있습니다.
<bean id = "userDao"> <property name = "mapperInterface"value = "com.xxx.dao.userdao" /> <속성 이름 = "sqlsessiontemplate"ref = "sqlsessiontemplatebatch" /> < /bean>
이전 섹션의 Mapper 구성과는 달리 여기에서 sqlsessiontemplate 만 구성하면 SQLSessionTemplate (SQLSESSIONFACTORY 속성이 템플릿에서 구성되었습니다) 만 구성하면됩니다.
자동 스캔으로 맵퍼 구성을 단순화하십시오
이전 장에서 볼 수 있듯이 DAO는 구성 파일에서 하나씩 구성해야합니다. DAO가 많으면 구성 파일이 매우 커서 관리하기가 더 고통 스럽습니다. 다행히도 Mybatis 팀도 이것을 깨달았습니다. 그들은 Spring이 제공 한 자동 스캔 기능을 사용하여 자동 스캔하는 툴 클래스를 캡슐화 하여이 기능을 사용하여 구성을 단순화 할 수 있도록했습니다.
<!-자동 스캔 (단일 업데이트 모드)-> <ean> <속성 이름 = "basePackage"value = "com.xxx.dao" /> <속성 이름 = "sqlsessiontemplatebeanname"value = "sqlsessionTemplatesImple" /> <propertion name = "markerinterface =" /boor " /boor"> < /boor ". <!-자동 스캐닝 (배치 업데이트 모드)을 사용하여 Mapper Bean을 만듭니다 (배치 업데이트 모드)-> <bean> <속성 이름 = "basepackage"value = "com.xxx.dao" /> <property name = "sqlsessiontemplatebeanname"value = "sqlsessiontemplatebatch" /> <propultion name = "markerinterface ="com.xx.dao.
MapperscannerConfigurer 자체와 관련된 봄 기술에 대해서는 이야기하지 않을 것입니다. 관심이 있고 봄의 원칙을 잘 이해하고 있다면 소스 코드를 확인할 수 있습니다. 세 가지 속성에 초점을 맞추겠습니다.
인터페이스 필터링을 사용하는 것 외에도 주석 필터링을 사용할 수도 있습니다.
<!-자동 스캔 (배치 업데이트 모드)을 사용하여 Mapper Bean을 생성합니다 (배치 업데이트 모드)-> <bean> <속성 이름 = "basepackage"value = "com.xxx.dao" /> <property name = "sqlsessiontemplatebeanname"value = "sqlsessiontemplatebatch" /> <propertybatch "="annotationClass " /ban value ="value = "value"
AnnotationClass : 주석이 구성된 경우에만 스캐너가 스캔하고 기본이 동일합니다.
두 필터 조건 중 하나만 일치 할 수 있습니다.
예 : 거래 관리
엔티티 클래스 정의 : emp.java
package com.lixing.scm.entity; public class emp {private String id; 개인 문자열 이름; 개인 문자열 섹스; 사적인 int 연령; 개인 문자열 전화; public String getId () {return id; } public void setId (String id) {this.id = id; } public String getName () {return name; } public void setName (문자열 이름) {this.name = 이름; } public String getSex () {return sex; } public void setsex (String sex) {this.sex = sex; } public int getage () {반환 연령; } public void 설정 (int Age) {this.age = age; } public String getPhone () {반환 전화; } public void setphone (String Phone) {this.phone = 전화; }} 내부 작동 인터페이스를 정의합니다 : Empmapper.java
package com.lixing.scm.test.mapper; import java.util.list; import java.util.map; import com.lixing.scm.entity.emp; public interface empmapper {void insertemp (emp emp); List <emp> getAllemp (); emp getbyid (문자열 ID); void deleteemp (문자열 ID); void ustudEmp (map <문자열, 개체>지도);} 엔티티 클래스 작동 인터페이스의 매핑 파일 정의 : empmapper.xml
<? xml version = "1.0"alcoding = "utf-8"?> <! doctype mapper public "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd "> <mapper namepace ="com.sc.sc.lest.scm.sc.lest.sc.lest.cm. <parameterMap type = "com.lixing.scm.entity.emp"id = "parameterMapemp"> <parameter property = "id"/> <parameter property = "name"/> <parameter property = "sex"/<parameter property = "age"/<parameter property = "phone"/> </parametermap> <resultmap type = "com.scm.scm.Entity.emp.Entity.emp.Emp.Ent.emp.Emp.Ent.emp.Emp.Ent. <result property = "id"column = "id"/> <결과 속성 = "이름"열 = "name"/> <result property = "sex"column = "sex"column = "sex"/<result property = "age"/> <result property = "age"column = "age"/<result property = "폰"/</resultmap> <insert id = "insertemp" VALUES(?,?,?,?,?) </insert> <select id="getAllEmp" resultMap="resultMapEmp"> SELECT * FROM emp </select> <select id="getById" parameterType="String" resultMap="resultMapEmp"> SELECT * FROM emp WHERE id=#{value} </select> <delete id="deleteEmp" parameterType="String"> DELETE FROM emp WHERE id =#{value} </delete> <update id = "updateemp"parametertype = "java.util.map"> update emp emp em name =#{name}, sex =#{sex}, age =#{age},#{{phone} 여기서 id =#{id} </update> </mapper> spring3.0.6 Applicationcontoctont.xt.xml. version = "1.0"encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans"xmlns : xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns : context = "http://www.springframework.org/schema/context"xmlns : aop = "http://www.springframework.org/schema/aop"xmlns : tx = "http://www.spramwork.org/schema/schema/schema/schema. xsi : schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/contet http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/sprging-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <! <! jdbc.propertis 디렉토리-> <ean> <속성 이름 = "locations"value = "classpath : jdbc.properties" /> < /bean> <bean id = "mydatasource"destrover-method = "close"> <property name = "driverclassName"value = "$ {jdbc.driverclassname}" /> <property name = "urll" value = "$ {jdbc.url}" /> <property name = "username"value = "$ {jdbc.username}" /> <property name = "password"vale = "$ {jdbc.password}" /> < /bean> <!-sqlsessionactory-> bean id = "property name ="dataSource " ref = "mydatasource" /> < /bean> <!-scanmapperfiles-> <ean> <property name = "basepackage"value = "com.lixing.scm.test.mapper" /> < /bean> <!- ====================================================================================================== 이름 = "transactionManager"> <속성 이름 = "dataSource"ref = "myDatasource"> </property> </bean> <tx : 조언 id = "usertxAdvice"transaction-manager = "transactionManager"> <tx : attributes> <tx : method*"provagation ="read bach = "java." no-rollback-for = "java.lang.runtimeexception" /> <tx : method name = "insert*"propagation = "필수"read-rely = "false"rollback-for = "java.lang.runtimeexception" /> <tx : method name = "update*"propagation = "reade-rely ="rollback-for = "java.lang" <tx : 메소드 이름 = "find*"propagation = "supports"/> <tx : method name = "get*"propagation = "supports"/> <tx : 메소드 이름 = "select*"propagation = "supports"/> </tx : attributes> </tx : explicution : proplicution "="expression " com.lixing.scm.test.service.*.*(..)) " /> <!-서비스 수준에서의 제어 트랜잭션-> <aop : Advisor Pointcut-Ref ="PC "Advice-Ref ="UsertxAdvice " /> < /aop : config> <!-다음은 사용자 정의 콩입니다.> <bean id ="a autowire = "gyname" / / / / /aop. id = "empservice"autowire = "byname"/> </beans> Dao 인터페이스 : Empdao.java
package com.lixing.scm.test.dao; import java.util.list; import java.util.map; import com.lixing.scm.entity.emp; public interface empdao {void insertemp (emp emp); List <emp> getAllemp (); emp getbyid (문자열 ID); void deleteemp (문자열 ID); void ustudEmp (map <문자열, 개체>지도);} DAO 인터페이스 구현 클래스 : Empdaoimpl.java
패키지 com.lixing.scm.test.dao.impl; import java.util.list; import java.util.map; import com.lixing.scm.entity.emp; import com.lixing.scm.test.dao.empdao; import com.lixing.scm.test.mpaper.empmapper; public class emplempl empdao emplement empdaomplest empdaomplest empdaomplest emplmest empdao emplement empmapper; // 여기에 empmapper를 주입 //이 empmapper는 스프링에 의해 자동으로 생성됩니다. // 우리는 @override public void insertemp (emp emp) {this.empmapper.insertemp (emp)를 수동으로 정의 할 필요가 없습니다. 새로운 runtimeexception을 던지십시오 ( "오류"); // test는 runtimeexception // 예외를 던지기 위해 데이터베이스에 레코드가 있는지} @override public void deleteemp (string id) {this.empmapper.deleteemp (id); } @override public list <emp> getallemp () {return this.empmapper.getallemp (); } @override public emp getByid (문자열 ID) {return this.empmapper.getByid (id); } @override public void updateemp (map <string, object> map) {this.empmapper.updateemp (map); } public empmapper getempmapper () {return empmapper; } public void setempMapper (empmapper empmapper) {this.empmapper = empmapper; }} 서비스 계층 인터페이스 : empservice.java
package com.lixing.scm.test.service; import com.lixing.scm.entity.emp; public interface empservice {void insertemp (emp emp);} 서비스 계층 인터페이스 구현 클래스 : empserviceimpl.java
package com.lixing.scm.test.service.impl; import com.lixing.scm.entity.emp; import com.lixing.scm.test.dao.empdao; import com.lixing.scm.test.service.empservice; public class empserviceimpll empservice {private empdao empdao; @override public void insertemp (emp emp) {empdao.insertemp (emp); } public empdao getempdao () {return empdao; } public void setempdao (Empdao empdao) {this.empdao = empdao; }} 테스트 클래스 : addeMpservice.java
import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.lixing.scm.entity.Emp;import com.lixing.scm.test.service.EmpService;public class TestEmpService { @Test public void testtrasaction () {emp emp = new emp (); emp.setId ( "00000003"); emp.setName ( "某某某"); emp.setage (50); emp.setsex ( "male"); emp.setphone ( "566666"); ApplicationContext CTX = New ClassPathXmlApplicationContext ( "ClassPath : ApplicationContext.xml"); empservice service = ctx.getBean (empservice.class); service.insertemp (EMP); }}