MyBatisだけを使用する場合(複数のセッションにまたがるトランザクションを実装できないなど)、多くの制限があり、多くのビジネスシステムは元々Springごとに管理されているトランザクションであるため、MyBatisはSpringと最もよく統合されています。
バージョン要件
プロジェクト | バージョン | アドレスをダウンロードしてください | 説明します |
mybatis | 3.0以上 | https://github.com/mybatis/mybatis-3/releases | |
春 | 3.0以上 | http://projects.spring.io/spring-framework/ | |
mybatis-spring | 1.0以上 | https://github.com/mybatis/spring/releases |
<! - ビジネスパッケージの自動スキャン - > <コンテキスト:Component-Scanベースパッケージ= "/> <! - データソース - > <Jee:jndi-lookup id =" jndidatasource "jndi-name =" java:comp/env/jdbc/datasOsorce "/>> < <プロパティ名= "dataSource" ref = "jndidatasource"/> </bean> <! - annotationベースの物事を構成するaop-> <tx:annotation-driven clonsaction-manager = "txmanager" proxy-target-class = "true"/>>
単一の統合
<! - mybatisの統合 - > <bean id = "sqlsessionfactory"> <プロパティ名= "datasource" ref = "jndidatasource" /> <プロパティ名= "configlocation" value = "classpath:/mybatis/mybatis-config.xml" /> <! value = "com.xxx.dto" /> < /bean> <! - dao bean(インターフェイスを提供するだけでなく、実装クラスではなく提供するだけです) - > <bean id = "userdao"> <プロパティ名= "value =" com.xxx.dao.userdao " />> <プロパティ" sqlsessionfactory
私たちはそれをどのように使用するかを理解するだけでなく、なぜこのようにそれを使用するのかを理解する必要があります。
SqlSessionFactoryBeanは工場の豆であり、その機能は構成(データソース、エイリアスなど)を解析することです。
MapperFactoryBeanは工場の豆です。春の容器では、工場の豆には特別な用途があります。スプリングが工場を他の豆に注入すると、工場の豆自体を注入するのではなく、豆のgetobjectメソッドを呼び出します。このgetobjectメソッドが何をするかを見てみましょう。
public t getobject()throws exception {return getSqlSession()。getMapper(this.mapperinterface); }これを見た後、この方法はMyBatisだけを使用したときと同じであることを理解する必要があります。最初にsqlsessionオブジェクトを取得し、次にsqlsessionからマッパーオブジェクトを取得します(マッパーに対して、マッパーインターフェイスインターフェイスをプロキシするプロキシオブジェクトであり、このインターフェイスはユーザーが提供するDAOインターフェイスです)。当然、ビジネス層への最終的な注入はこのマッパーオブジェクトです。
一般的に言えば、複数のプロジェクトがあります。複数のプロジェクトがある場合は、上記の構成に従って順番に構成します。
バッチアップデートの使用方法
前のセクションでは、マッパーオブジェクトをビジネスレイヤーに注入する方法について説明しました。マッパーの動作は構成に依存します。 MyBatisはデフォルトで単一の更新を使用します(つまり、デフォルトのexecutorTypeはバッチではなく簡単です)。もちろん、MyBatis構成ファイルを変更することでデフォルトの動作を変更できますが、1つまたは複数のマッパーのみをバッチ更新を使用する場合は、実行できません。現時点では、テンプレートテクノロジーを使用する必要があります。
<! - テンプレートを介してmybatisの動作をカスタマイズ - > lt; bean id = "sqlsessiontemplatesimple"> <constructor-arg index = "0" ref = "sqlsessionfactory"/> <! - 単一モードでの更新 - > <constructor-arg index = "1" 1 "value =" simple " lt; bean id = "sqlsessiontemplateBatch"> <constructor-arg index = "0" ref = "sqlsessionfactory"/> <! - バッチモードで更新 - > <constructor-arg index = "1" value = "batch"/> </bean>
ここで、著者は2つのテンプレートオブジェクトを定義します。1つは単一の更新を使用し、もう1つはバッチアップデートを使用しています。テンプレートがあった後、マッパーの動作方法を変更できます。
<bean id = "userdao"> <プロパティ名= "mapperinterface" value = "com.xxx.dao.userdao" /> <プロパティ名= "sqlsessiontemplate" ref = "sqlsessiontemplateBatch" /> < /bean>
前のセクションのマッパー構成とは異なり、ここでsqlsessionFactoryプロパティを構成する必要はありません。SQLSessionTemplateを構成するだけです(SQLSessionFactoryプロパティはテンプレートで構成されています)。
自動スキャンでマッパーの構成を簡素化します
前の章でわかるように、DAOは構成ファイルで1つずつ構成する必要があります。多くのDAOがある場合、構成ファイルは非常に大きくなり、管理がより苦痛になります。幸いなことに、MyBatisチームもこれに気付きました。 Springが提供する自動スキャン機能を使用して、自動的にスキャンするツールクラスをカプセル化したため、この関数を使用して構成を簡素化できます。
<! - 自動スキャン(シングルアップデートモード)を使用してマッパービーンを作成します - > <bean> <プロパティ名= "basepackage" value = "com.xxx.dao" /> <プロパティ名= "sqlsessiontemplatebeanname" value = "sqlsessiontemplatesimple" /> <プロパティ= "com.da.dae < /bean> <! - 自動スキャン(バッチ更新モード)を使用してマッパービーンを作成します - > <bean> <プロパティ名= "basepackage" value = "com.xxx.dao" /> <プロパティネーム= " value = "com.xxx.dao.batchdao" /> < /bean>
MapperScannerConfigurer自体に関与するスプリングテクノロジーについては話しません。興味があり、春の原則をよく理解している場合は、そのソースコードを確認できます。 3つのプロパティに焦点を当てましょう。
インターフェイスフィルタリングの使用に加えて、注釈フィルタリングを使用することもできます。
<! - 自動スキャン(バッチ更新モード)を使用してマッパービーンを作成します - > <bean> <プロパティ名= "basepackage" value = "com.xxx.dao" /> <プロパティ名= "sqlsessiontemplatebeanname" value = "sqlsessiontemplateBatch" /> <プロパティ/> < /bean>
AnnotationClass:アノテーションが構成されている場合にのみ、スキャナーによってスキャンされ、ベースパッケージは同じ機能です。
2つのフィルター条件のうち1つだけが一致できることに注意する必要があります。
例:トランザクション管理
エンティティクラスを定義します:emp.java
パッケージcom.lixing.scm.entity; public class emp {private string id;プライベート文字列名;プライベートストリングセックス;プライベートインクエイジ;プライベート文字列電話; public string getId(){return id; } public void setid(string id){this.id = id; } public string getname(){return name; } public void setName(string name){this.name = name; } public string getSex(){return sex; } public void setSex(string sex){this.sex = sex; } public int getage(){return age; } public void Setage(int age){this.age = age; } public string getPhone(){return phone; } public void setPhone(string phone){this.phone = phone; }}内部操作インターフェイスを定義します:empmapper.java
パッケージ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); list <Emp> getAllemp(); emp getbyid(string id); void deleteemp(string id); void updateEmp(Map <String、Object> Map);}エンティティクラス操作インターフェイスのマッピングファイルを定義する:empmapper.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" namespace = "com.lixing.scm.test.mapper.empmapper"> <parametermap type = "com.lixing.scm.entity.emp" id = "parametermapemp"> <parameterプロパティ= "id"/> <parameter property = "name"/> <parameter = "sex/> <paramet property ="/>> <parmet property = "/param <resultmap type = "com.lixing.scm.entity.emp" id = "resultmapemp"> <respuringプロパティ= "id" column = "id"/> <resultプロパティ= "column =" name "/> <resultプロパティ=" column = "sex"/> <resportプロパティ= "age"/> <resultプロパティ= "column =" age "/>> <intex"/> <intec column " id = "insertemp" parametermap = "parametermapemp"> emp(id、name、sex、chone)values(?、、?、?、?)</insert> <select id = "getAllemp" resultmapemp = "resultmapemp"> select * from emp </select> <select id = "getByid" id =#{value} </select> <delete id = "deleteemp" parametertype = "string"> delete from emp =#{value} </delete> <update id = "updateemp" parametertype = "java.util.map"> update emp set name =#{name}、sex =#{phere ^ id =#{id} </update> </mapper> spring3.0.6定義:applicationcontext.xml <?xmlバージョン= "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.springframework.org/schema/tx" xsi:schemalocation = "http://ww.springframework http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context-/spring-context-/spring http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/ap http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <! - > <context:annotation-config/> <context:component-scanベースパッケージ=" com.lixing.scm.test。*"/> < value = "classpath:jdbc.properties" /> < /bean> <bean id = "mydatasource" destroy-method = "close"> <property name = "driverclassname" value = "$ {jdbc.driverclassname} value = "$ {jdbc.username}" /> <property name = "password" value = "$ {jdbc.password}" /> < /bean> <! - sqlsessionfactory-> <bean id = "sqlsessionfactory"> <property name = "datasource" ref = "mydatasource" /> < /< /bean <bean> <プロパティ名= "basepackage" value = "com.lixing.scm.test.mapper" /> < /bean> <! - ============================================================================================ <bean name = "transactionManager"> <プロパティ名= "dataSource" ref = "mydatasource"> </property> </bean> <tx:アドバイスid = "usertxadvice" transaction-manager = "transactionmanager"> <tx:actributes> <tx:method = "delete*" deletage = "" fise "" fails "" rollback-for="java.lang.Exception" no-rollback-for="java.lang.RuntimeException"/> <tx:method name="insert*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.RuntimeException" /> <tx:method name="update*" propagation="REQUIRED" read-only="false" lollback-for = "java.lang.exception"/> <tx:method name = "find*" suppeats "/> <tx:method name =" get*supports "/> <tx:method name =" select*"propagation =" supports "/>> </tx:actibutes> <aop expression = "execution(public*com.lixing.scm.test.service。*。*(..))" /> <! - サービスレベルでの制御トランザクション - > <aop:advisor pointcut-ref = "pc" advise-ref = "usertxadvice" />> < /aop:config> < <bean id = "empservice" autowire = "byname"/> </beans> DAOインターフェース:Empdao.java
パッケージ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); list <Emp> getAllemp(); emp getbyid(string id); void deleteemp(string id); void updateEmp(Map <String、Object> Map);} DAOインターフェイス実装クラス:Empdaoimpl.java
パッケージcom.lixing.scm.test.dao.impl; import java.util.list; import java.util.map; Import com.lixing.scm.scm.entity.emp; import com.lixing.scm.test.dao.empdao; import com.lixing.scm.test.mapper.mapper.mpmpmper.mpmpmper.mpmpmper.mpmpmper.empmpmper.mpmpmpmper Empmapper Empmapper; //ここにEmpmapperを挿入する//このエンパマッパーはspringによって自動的に生成されます新しいruntimeexception( "error"); // runtimeexception //例外をテストして、データベースにレコードがあるかどうかを確認してください} @override public void deleteemp(string id){this.empmapper.deleteemp(id); } @Override public List <Emp> getAllemp(){return this.empmapper.getallemp(); } @Override public Emp getByid(string id){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
パッケージcom.lixing.scm.test.service; import com.lixing.scm.entity.emp; public interface empservice {void insertemp(emp);}サービスレイヤーインターフェイス実装クラス:empserviceimpl.java
パッケージ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 empserviceimpl empservice {prive empdao empdao; @Override public void insertemp(emp){empdao.insertemp(emp); } public empdao getempdao(){return empdao; } public void setempdao(empdao empdao){this.empdao = empdao; }}テストクラス:testempservice.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 = 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); }}