스프링 과정에서 MyBatis, 특히 데이터 소스를 통합하는 몇 가지 통합 방법이 있기 때문입니다. 나는 종종 다른 구성 방법을보고 항상 약간 지저분한 느낌이 들기 때문에 오늘 요약 할 시간이 있습니다.
1. org.mybatis.spring.mapper.mapperscannerconfigurer를 사용하십시오
실제로 이것은 역 엔지니어링과 같은 방식입니다
1. 데이터 소스 구성 파일
2. dao 파일
패키지 com.jdd.mapper; import com.jdd.pojo.employee; Java.util.list 가져 오기; 공개 인터페이스 eployeemapper {공공 직원 getemployeebyid (int id); 공개 목록 <ployee> findallemployees (); }3. mapper.xml 파일
<? xml 버전 = "." 인코딩 = "utf-"?> <! doctype mapper public "-// mybatis.org//dtd mapper .//en" "http://mybatis.org/dtd/mybatis-mapper.dtd"> <mapper 네임 스페이스 = "com.jdd.mapper.emprosseeemapper"> <getemporeed = "Int" resulttype = "com.jdd.pojo.employee"> <! ]]> </select> <select <select id = "findallemployees"resulttype = "com.jdd.pojo.employee"> <! ]]]> </선택> </맵퍼>
이런 식으로 DAO 인터페이스를 서비스 클래스에 직접 주입 할 수 있습니다.
패키지 com.jdd.service.impl; import com.jdd.mapper.employeemapper; import com.jdd.pojo.employee; com.jdd.service.employeeservice import; org.springframework.beans.factory.annotation.autowired; org.springframework.stereotyp.service; Java.util.list 가져 오기; @Service ( "Employepservice") 공공 클래스 Employepiceimpl은 Employepice {@autowired private Employeemapper Employeemapper; @override public Employee getemployeebyid (int id) {return Employeemapper.getemployeebyid (id); } @override public list <aployee> findallemployees () {return Employeemapper.findallemployees (); }}2. 추상 클래스 org.mybatis.spring.support.sqlsessiondaosupport를 사용하여 sqlsessionfactory에 주입하십시오.
1. 데이터 소스 구성 파일
<? xml 버전 = "." 인코딩 = "utf-"?> <beans xmlns = "http://www.springframework.org/schema/beans"xmlns : context = "http://www.springframework.org/schema/context" xmlns : p = "http://www.springframework.org/schema/p"xmlns : aop = "http://www.springframework.org/schema/tx"xmlns : xsi = "http://www.w.org//xchema-instance. xsi : schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-..xsd http://www.springframework.org/schema/contex http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-..xsd http://www.spramframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-..xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-..xsd "! <Context : Property-Placeholder Location = "ClassPath /*. Properties" /> <!-데이터베이스 연결 풀-> <bean id = "DataSource"Destroy-Method = "close"> <속성 이름 = "driver className"value = "$ {jdbc.driver}" /> 이름 = "username"value = "$ {jdbc.username}" /> <property name = "property name ="password "value ="$ {jdbc.password} " /> <property name ="maxactive "value =" " /> <속성 이름 ="minidle "value =" " /> < /bean> <! 이름 = "configlocation"value = "classpath : mybatis/sqlmapconfig.xml"> </property> <property name = "dataSource"ref = "dataSource"> </property name = "mapperlocations"value = "classpath : com/jdd/mapper/*. xml"> </beans>2. Basedao 클래스
패키지 com.jdd.dao; import org.apache.ibatis.session.sqlsessionfactory; import org.mybatis.spring.support.sqlsessiondaosupport; import javax.annotation.resource; 공개 초록 클래스 기반은 sqlsessiondaoSupport {@resource public void setsqlsessionFactory (sqlSessionFactory sqlsessionFactory) {super.SetSqlSessionFactory (sqlsessionSctortory); }}3. 인터페이스 Employeedao.java 클래스
패키지 com.jdd.dao; import com.jdd.pojo.employee; Java.util.list 가져 오기; 공개 인터페이스 Employeedao {Employee getemployeebyid (int id); list <plineee> findallemployees (); }4. DAO는 Employeedaoimpl 클래스를 구현합니다
패키지 com.jdd.dao.impl; import com.jdd.dao.basedao; import com.jdd.dao.employeedao; import com.jdd.pojo.employee; org.springframework.stereotype.repository import; Java.util.list 가져 오기; @repository ( "Employeedao") 공개 클래스 Employeedaoimpl은 기반을 확장합니다. int } @override public list <aployee> findallemployees () {return this.getSqlsession (). selectList ( "com.jdd.dao.employeedao.findallemployees"); }}5. 이런 식으로, 당신은 Employeedao를 서비스 클래스에 주입 할 수 있습니다.
3. org.mybatis.spring.sqlsessiontemplate 템플릿 클래스를 사용하십시오
1. 데이터 소스 파일
<? xml 버전 = "." 인코딩 = "utf-"?> <beans xmlns = "http://www.springframework.org/schema/beans"xmlns : context = "http://www.springframework.org/schema/context" xmlns : p = "http://www.springframework.org/schema/p"xmlns : aop = "http://www.springframework.org/schema/tx"xmlns : xsi = "http://www.w.org//xchema-instance. xsi : schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-..xsd http://www.springframework.org/schema/contex http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-..xsd http://www.spramframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-..xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-..xsd "! <Context : Property-Placeholder Location = "ClassPath /*. Properties" /> <!-데이터베이스 연결 풀-> <bean id = "DataSource"Destroy-Method = "close"> <속성 이름 = "driver className"value = "$ {jdbc.driver}" /> 이름 = "username"value = "$ {jdbc.username}" /> <property name = "property name ="password "value ="$ {jdbc.password} " /> <property name ="maxactive "value =" " /> <속성 이름 ="minidle "value =" " /> < /bean> <! 이름 = "configlocation"value = "classpath : mybatis/sqlmapconfig.xml"> </property> <property name = "dataSource"ref = "dataSource"> </property name> <property name = "mapperLocations"value = "classpath : com/jdd/mapper/*. xml"> <생성자 -ARG index = ""ref = "sqlsessionFactory"/> </bean> </beans>2. Rasedao.java 클래스
패키지 com.jdd.dao; import org.mybatis.spring.sqlsessiontemplate; import javax.annotation.resource; 공개 초록 클래스 기반 {public sqlsessiontemplate sqlsessiontemplate; @Resource public void setsqlsessiontemplate (sqlsessiontemplate sqlsessiontemplate) {this.sqlsessiontemplate = sqlsessiontemplate; }} 3. 인터페이스 Employeedao.java 클래스
패키지 com.jdd.dao; import com.jdd.pojo.employee; Java.util.list 가져 오기; 공개 인터페이스 Employeedao {Employee getemployeebyid (int id); list <plineee> findallemployees (); }4. DAO는 Employeedaoimpl 클래스를 구현합니다
패키지 com.jdd.dao.impl; import com.jdd.dao.basedao; import com.jdd.dao.employeedao; import com.jdd.pojo.employee; org.springframework.stereotype.repository import; Java.util.list 가져 오기; @repository ( "Employeedao") 공공 클래스 Employeedaoimpl은 기반을 확장합니다. } @override public list <aployee> findallemployees () {return sqlsessiontemplate.selectlist ( "com.jdd.dao.employeedao.findallemployeees"); }}5. 이제 Employeedao를 서비스 클래스에 직접 주입하여 사용할 수 있습니다.
참고 : 여기에 기반의 주입은 더 유연합니다. SQLSESSIONFACTORY를 주입 한 다음 Setter 메소드에서 SQLSESSIONTEMPLATE를 작성할 수도 있습니다.
패키지 com.jdd.dao; import org.apache.ibatis.session.sqlsessionfactory; import org.mybatis.spring.sqlsessiontemplate; import javax.annotation.resource; 공개 초록 클래스 기반 {public sqlsessiontemplate sqlsessiontemplate; @Resource public void setsqlsessionFactory (sqlsessionFactory sqlsessionFactory) {sqlsessionTemplate = new SqlSessionTemplate (sqlsessionTemplate); }}실제로, SQLSESSIONDAOSUPPORT 클래스를 상속하는 방법, SQLSESSIONFACTORY를 주입하거나 sqlSessionTemplate을 직접 주입하는 방법이든, 본질적으로 동일합니다.
sqlsessionFactory를 주입하면 하단의 sqlsessionFactory를 통해 sqlsessionTemplate을 생성 한 다음 API를 통해 작동합니다.
당신이 그것을 믿지 않으면, sqlsessiondaosupport의 소스 코드를 보자.
// // Intellij Idea에 의해 .class 파일에서 재현 된 소스 코드 // (Fernflower decompiler에 의해 구동) // package org.mybatis.spring.support; import org.apache.ibatis.session.sqlsession; import org.apache.ibatis.session.sqlsessionfactory; import org.mybatis.spring.sqlsessiontemplate; org.springframework.dao.support.daosupport; org.springframework.util.assert 가져 오기; 공개 초록 클래스 SQLSESSIONDAOSUPPORT 확장 DAOSUPPORT {private SQLSESSION SQLSESSION; 개인 부울 externalsqlsession; public sqlsessiondaoSupport () {} public void setsqlsessionSctorfactory (sqlsessionFactory sqlSessionFactory) {if (! this.externalsqlSession) {this.sqlsession = new sqlsessiontemplate (sqlsessiontory); }} public void setsqlsessiontemplate (sqlsessiontemplate sqlsessiontemplate) {this.sqlsession = sqlsessiontemplate; this.externalsqlsession = true; } public sqlsession getSqlsession () {return this.sqlsession; } Protected void checkDaoconfig () {assert.notnull (this.sqlsession, "property 'sqlsessionfactory'또는 'sqlsessiontemplate'가 필요합니다"); }}마찬가지로 SQLSESSIONTEMPLATE는 SQLSESSION 인터페이스를 상속하므로 작동에 관계없이 효과가 동일합니다.
// // Intellij Idea에 의해 .class 파일에서 재현 된 소스 코드 // (Fernflower decompiler에 의해 구동) // package org.mybatis.spring; import java.lang.reflect.invocationHandler; import java.lang.reflect.method; java.lang.reflect.proxy import; java.sql.connection 가져 오기; Java.util.list 가져 오기; java.util.map import; import org.apache.ibatis.exceptions.persistenceException; import org.apache.ibatis.executor.batchresult; import org.apache.ibatis.reflection.exceptionutil; import org.apache.ibatis.session.configuration; import org.apache.ibatis.session.executortype; import org.apache.ibatis.session.resulthandler; import org.apache.ibatis.session.rowbounds; import org.apache.ibatis.session.sqlsession; import org.apache.ibatis.session.sqlsessionfactory; org.springframework.dao.support.persistenceExceptionTranslator; org.springframework.util.assert 가져 오기; 공개 클래스 sqlsessiontemplate는 sqlsession {private final sqlsessionfactory sqlsessionFactory를 구현합니다. Private Final Executipe Executiple; 개인 최종 SQLSESSION SQLSESSIONPROXY; Private Final PersistenceExceptionTranslator ExceptionTranslator; public sqlsessiontemplate (sqlsessionFactory sqlsessionFactory) {this (sqlsessionFactory, sqlsessionCitory.getConfiguration (). getDefaulteXecutortype ()); } public sqlsessiontemplate (sqlsessionFactory sqlSessionFactory, ExecutOple Executipe) {this (sqlsessionFactory, executOple, new myBatisExceptionTransLator (sqlSessionFactory.getConfiguration (). getEnvirondment ()); } public sqlsessiontemplate (sqlsessionFactory sqlsessionFactory, ExecutOple Executiple, PersisTenceExceptionTransLator ExceptionTransLator) {Assert.NotNull (SQLSESSIONFACTORY, "속성 'SQLSESSIONACTORY'가 필요하다"); Assert.notnull (Executiple, "Property 'executipe'가 필요하다"); this.sqlsessionFactory = sqlsessionFactory; this.executortype = executipe; this.exceptionTranslator = ExceptionTranslator; this.sqlsessionproxy = (sqlsession) proxy.newproxyInstance (sqlsessionfactory.class.getClassLoader (), new class [] {sqlsession.class}, new sqlsessionTemplate.sqlsessionInterceptor ()); } public sqlsessionFactory getSqlSessionFactory () {return this.sqlSessionFactory; } public executople getExecutorType () {return this.executorType; } public persistenceExceptionTransLator getPersistenceExceptionTransLator () {return this.ExceptionTransLator; } public <t> t selectone (문자열 문) {return this.sqlsessionproxy.selectone (문); } public <t> t selectone (문자열 문, 개체 매개 변수) {return this.sqlsessionproxy.selectone (Statement, Parameter); } public <k, v> map <k, v> selectMap (문자열 문, 문자열 mapkey) {return this.sqlsessionproxy.selectmap (state, mapkey); } public <k, v> map <k, v> selectMap (문자열 문, 객체 매개 변수, 문자열 mapkey) {return this.sqlsessionproxy.selectmap (state, parameter, mapkey); } public <k, v> map <k, v> selectMap (문자열 문, 객체 매개 변수, 문자열 mapkey, rowbounds rowbounds) {return this.sqlsessionproxy.selectmap (state, parameter, mapkey, rowbounds); } public <e> list <e> selectList (문자열 문) {return this.sqlsessionProxy.SelectList (문); } public <e> list <e> selectList (문자열 문, 개체 매개 변수) {return this.sqlsessionProxy.SelectList (state, parameter); } public <e> list <e> selectList (문자열 문, 객체 매개 변수, 행 } public void select (문자열 문, resulthandler handler) {this.sqlsessionproxy.select (state, handler); } public void select (문자열 문, 객체 매개 변수, resulthandler handler) {this.sqlsessionproxy.select (state, parameter, handler); } public void select (문자열 문, 객체 매개 변수, 행 바운드 행 바운드, resulthandler handler) {this.sqlsessionproxy.select (문, 매개 변수, 행 바운드, 핸들러); } public int insert (문자열 문) {return this.sqlsessionproxy.insert (문); } public int insert (문자열 문, 객체 매개 변수) {return this.sqlsessionproxy.insert (state, parameter); } public int update (문자열 문) {return this.sqlsessionproxy.update (문); } public int update (문자열 문, 객체 매개 변수) {return this.sqlsessionproxy.update (statement, parameter); } public int delete (문자열 문) {return this.sqlsessionproxy.delete (문); } public int delete (문자열 문, 객체 매개 변수) {return this.sqlsessionproxy.delete (state, parameter); } public <t> t getMapper (class <t> type) {return this.getConfiguration (). getMapper (type, this); } public void commit () {새로운 UnsupportedOperationException ( "Spring Managed Sqlsession에는 수동 커밋이 허용되지 않습니다"); } public void Commit (부울 힘) {새로운 UnsupportEdoperationException 던지기 ( "수동 커밋은 스프링 관리 SQLSESSION을 통해 허용되지 않습니다"); } public void rollback () {Throw New New UnsupportedOperationException ( "스프링 관리 SQLSESSION에서 수동 롤백이 허용되지 않습니다"); } public void rollback (부울 힘) {새로운 UnsupportedOperationException 던지기 ( "수동 롤백은 스프링 관리 SQLSESSION을 통해 허용되지 않습니다"); } public void close () {새 새 UnsupportedOperationException ( "스프링 관리 SQLSESSION에는 수동 닫기가 허용되지 않습니다"); } public void clearcache () {this.sqlsessionproxy.clearCache (); } public configuration getConfiguration () {return this.sqlsessionFactory.getConfiguration (); } public Connection getConnection () {return this.sqlsessionproxy.getConnection (); } 공개 목록 <BatchResult> FlushStatements () {return this.sqlsessionproxy.flushstatements (); } private class sqlsessioninterceptor empocationHandler {private sqlsession interceptor () {} public object invoke (개체 프록시, 메소드 메소드, 오브젝트 [] args) 던질 수있는 {sqlsession sqlsession = sqlsessionutils.getSqlsession (sqlsessiontemplate. sqlsessiontemplate.this.executortype, sqlsessiontemplate.this.exceptionTranslator); 랩핑되지 않은 물체; try {object result = method.invoke (sqlsession, args); if (! sqlsessionutils.iscqlsessiontransactional (sqlsession, sqlsessiontemplate.this.sqlsessionfactory)) {sqlsession.commit (true); } unprapped = result; } catch (Throwable var) {unprapped = exceptil.unwrapThrowable (var); if (sqlsessiontemplate.this.exceptionTranslator! = null && persistenceException의 Unwrapped 인스턴스) {sqlsessionutils.closesqlsession (sqlsession, sqlsessiontemplate.this.sqlsessionActory); sqlsession = null; Throwable translated = sqlsessiontemplate.this.exceptiontranslator.translateExceptionIfPossible ((PersistenceException) Unwrapped); if (transrated! = null) {unprapped = transrated; }} 던지기 (던질 수있는) 풀 랩핑; } 마지막으로 {if (sqlsession! = null) {sqlsessionutils.closesqlsession (sqlsession, sqlsessiontemplate.this.sqlsessionfactory); }} 랩핑되지 않은 반환; }}}}요약
위의 것은 MyBatis의 데이터 소스를 소개하는 스프링을위한 몇 가지 구성 방법입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨주세요. 편집자는 제 시간에 당신에게 답장 할 것입니다!