При использовании только Mybatis есть много ограничений (например, неспособность внедрить транзакции, охватывающие несколько сеансов), и многие бизнес -системы изначально являются транзакциями, управляемыми весной, поэтому 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 |
<!-Автоматическое сканирование бизнес-пакетов-> <Контекст: компонент-сканирование Base-package = "com.xxx.service"/> <!-источник данных-> <jee: jndi-lookup id = "jndidatasource" jndi-name = "java: comp/env/jdbc/dataSource"/> <! <name = "dataSource" ref = "jndataSource"/> </bean> <!-Настройка вещей на основе аннотаций AOP-> <TX: аннотационные транзакции-manager = "txmanager" Proxy-Target-class = "true"/>>>>
Единая интеграция
<!-Интеграция mybatis-> <bean id = "sqlSessionFactory"> <name = "dataSource" ref = "jndataSource" /> <name = "configlocation" value = "classpath: /mybatis/mybatis-config.xml" /> <! value = "com.xxx.dto" /> < /bean> <!-Создать Dao Bean (просто предоставьте интерфейсы, но не классы реализации)-> <bean id = "userdao"> <name = "mapperinterface" value = "com.xxx.dao.userdao" /> <property name = "sqlSessionFactory" ref = "sqreanfoory" /> beport name = "sqlSessionFactory"?
Мы должны не только понимать, как его использовать, но и понимать, почему мы используем это так.
SQLSessionFactoryBean - это фабричный бон, и его функцией является анализ конфигураций (источник данных, псевдоним и т. Д.).
MapperFactoryBean - это фабрика. В весеннем контейнере заводские бобы имеют специальное использование. Когда весна вводит фабричные бобы в другие бобы, он не вводит самого фабричного боба, но называет метод GetObject фасоли. Давайте посмотрим на то, что делает этот метод GetObject:
public t getObject () выбрасывает exection {return getSqlSession (). getMapper (this.mapperinterface); }Увидев это, вы должны понять, что этот метод такой же, как и когда мы использовали Mybatis в одиночку. Сначала мы получаем объект SQLSession, а затем получаем объект Mapper от SQLSession (против Mapper является прокси -объектом, который прокси -интерфейс интерфейс интерфейса Mapper, и этот интерфейс является интерфейсом DAO, предоставляемым пользователем). Естественно, окончательная инъекция в бизнес -слой - этот объект Mapper.
Вообще говоря, есть более одного проекта. Если у вас есть несколько проектов, затем настройте их последовательно в соответствии с вышеуказанной конфигурацией.
Как использовать обновления пакетов
В предыдущем разделе говорилось о том, как вводить объект Mapper в бизнес -уровень. Поведение Mapper зависит от конфигурации. Mybatis использует одно обновление по умолчанию (то есть IRESTORTYPE по умолчанию прост, а не пакетный). Конечно, мы можем изменить поведение по умолчанию, изменяя файл конфигурации Mybatis, но если мы хотим, чтобы только один или несколько сортировщиков использовали пакетные обновления, это не может быть сделано. В настоящее время нам нужно использовать технологию шаблонов:
<!-Настройте поведение mybatis через шаблоны-> lt; bean id = "sqlSessionTemplatesImple"> <constructor-arg index = "0" ref = "sqlSessionFactory"/> <!-Обновление в одном режиме-> <constructor-arg index = "1" lt; bean id = "sqlSessionTemplateBatch"> <constructor-arg index = "0" ref = "sqlSessionFactory"/> <!-Обновление в режиме пакетного режима-> <constructor-arg index = "1" value = "batch"/> </bean>
Здесь автор определяет два объекта шаблона, один используя одно обновление, а другое, используя пакетное обновление. После того, как у нас есть шаблон, мы можем изменить способ ведения Mapper:
<bean id = "userdao"> <name = "mapperinterface" value = "com.xxx.dao.userdao" /> <name = "sqlSessionTemplate" ref = "sqlSessionTemplateBatch" /> < /bean>
В отличие от конфигурации Mapper в предыдущем разделе, нет необходимости настраивать свойство SQLSessionFactory здесь, вам нужно только настроить SQLSessionTemplate (свойство SQLSessionFactory было настроено в шаблоне).
Упростить конфигурацию карт с помощью автоматического сканирования
Как вы можете видеть в предыдущей главе, наш DAO должен быть настроен один за другим в файле конфигурации. Если есть много DAO, файл конфигурации будет очень большим, что будет более болезненным для управления. К счастью, команда Mybatis также поняла это. Они использовали функцию автоматического сканирования, предоставленную Spring, чтобы инкапсулировать класс инструментов, который автоматически сканирует, чтобы мы могли использовать эту функцию для упрощения конфигурации:
<!-Создать фасоль Mapper с использованием автоматического сканирования (режим одиночного обновления)-> <bean> <name = "basepackage" value = "com.xxx.dao" /> <name = "sqlSessionTemplatebeanName" value = "sqlSessionTemplatesImple" /> name = "markerInternam < /bean> <!-Создать бон Mapper с использованием автоматического сканирования (режим обновления пакетного обновления)-> <bean> <name = "basepackage" value = "com.xxx.dao" /> <name = "sqlSessionTemplatebeanname" value = "sqlSessionTemptateBatch" /> <name = "markerinterface" value = "com.xxx.dao.batchdao" /> < /bean>
Я не буду говорить о весенних технологиях, участвующих в самой MappersCannerConfigurer. Если вы заинтересованы и хорошо понимаете принципы весны, вы можете проверить его исходный код. Давайте сосредоточимся на его трех свойствах:
В дополнение к использованию интерфейсной фильтрации, вы также можете использовать фильтрацию аннотации:
<!-Создать фасоль Mapper с использованием автоматического сканирования (режим обновления пакетного обновления)-> <bean> <name = "basepackage" value = "com.xxx.dao" /> <name = "sqlSessionTemplatebeanname" value = "sqlSessionTemplatebatch" /> <properationTemantaTiation Class "value =" com.dation.Bannation " /> <> name =" annotation-class "=" com.dotation " /> <> name =" annotation class ". </bean>
AnnotationClass: Только когда аннотация настроена, будет сканироваться сканером, а базовый - это функция того же самого.
Следует отметить, что только одно из двух условий фильтра может быть сопоставлено.
Пример: управление транзакциями
Определите класс сущности: emp.java
пакет 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 (string name) {this.name = name; } public String getSex () {return Sex; } public void setsex (строка 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 empmapper {void Insertemp (EMP EMP); Список <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"> <mapper.org/dtd/mybatis-3-mapper.dtd " namespace="com.lixing.scm.test.mapper.EmpMapper"> <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.lixing.scm.entity.emp" id = "resultmapemp"> <result property = "id" = "id"/> <result property = "name" column = "name"/> <result property = "sex" column = "sex"/> <result property = "age"/> <result property = "Age" column = "/> <result =" phone "/> </> <result vopport =" age "/"/> <result = "/"/> </> <serview Mopport = "ageemp"/> <result = "? parametermap = "parametermapemp"> вставьте в EMP (ID, имя, пол, возраст, телефон) значения (?,?,?,?,?) </select> <delete id="deleteEmp" parameterType="String"> DELETE FROM emp WHERE id=#{value} </delete> <update id="updateEmp" parameterType="java.util.Map"> UPDATE emp SET name=#{name},sex=#{sex},age=#{age},phone=#{phone} WHERE id=#{id} </update> </mapper> spring3.0.6 Определение: ApplicationContext.xml <? 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://wwww.spramemema/xmlns: aop =" http://wwww.spramemema/xmlns: "http://wwww.spramemema/context": xmlns: tx = "http://www.springframework.org/schema/tx" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.spramework.orgemabema/spersm.3. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-30.xsramework.org/schema/aop/spring-30.xramework.orgememo. <context:annotation-config /> <context:component-scan base-package="com.lixing.scm.test.*" /> <!-- jdbc.propertis Directory --> <bean > <property name="locations" value="classpath:jdbc.properties" /> </bean> <bean id="MyDataSource" destroy-method="close" > <property name = "DriverClassName" value = "$ {jdbc.driverclassname}" /> <name = "url" value = "$ {jdbc.url}" /> <name = "username" value = "$ {jdbc.username}" /> <property name = "value =" $ {jdbc.pass} " /> < /> < /> < /> <proportce =" value = "$ {jdbc.prass} < /> < /> < /> < /> <proportce =" SqlSessionFactory-> <bean id = "sqlSessionFactory"> <name = "dataSource" ref = "myDataSource" /> < /bean> <!-ScanMapperfiles-> <Bean> <свойство = "basepackage" value = "com.lixing.scm.test.mapper" /> < /bean> <! ============================================================================================================================= <bean name = "transactionManager"> <name = "dataSource" ref = "myDataSource"> </property> </bean> <tx: usd id = "usertxadvice" transaction-manager = "transactionManager"> <tx: атрибуты> <tx: имя метода = "Delete*" Профессионал = "требуется" read-only = "fallibutes> <tx:" delete*"" Rollback-for = "java.lang.exception" no-rollback-for = "java.lang.runtimeexception" /> <tx: method name = "insert*" propagation = "требуется" только для чтения = "false" hollback-for = "java.lang.runtimeexcept Rollback-for = "java.lang.exception"/> <tx: method name = "find*" Propagation = "Поддерживает"/> <tx: method name = "get*" Propagation = "Поддержки"/> <tx: method name = "select*" Propagation = "Поддержка"/> </tx: attributes> </tx: Asseme> <AOP: pointc "/> </> </> </tx: attributes> </tx: <aooP: pactc"/> </> </> </> </> Express = "execution (public*com.lixing.scm.test.service.*.*(..))" /> <!-управляющие транзакции на уровне службы-> <AOP: Advisor pointcut-ref = "pc" ref = "usertxadvice" /> < /aop: config> <!-следующее Bean-> <Bean Id = "empda" ateme ". <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 emp); Список <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.entity.emp; import com.lixing.scm.test.dao.empdao; импорт com.lixing.scm.test.mapper.empmapper; Empmapper; // Внедряют EMPMAPPER здесь // Этот EMPMAPPER автоматически генерируется Spring // Нам не нужно вручную определять @Override public void insertemp (EMP EMP) {this.empmapper.insertemp (emp); бросить новое runtimeexception ("ошибка"); // Тестовые броски 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) {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
Пакет com.lixing.scm.test.service; import com.lixing.scm.entity.emp; public empservice {void insertemp (emp emp);} Класс реализации интерфейса сервисного уровня: empserviceimpl.java
пакет com.lixing.scm.test.service.impl; import com.lixing.scm.entity.emp; import com.lixing.scm.test.dao.empdao; импорт com.lixing.scm.test.service.empservice; публичный класс Empserviceimpless 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; }} Тестовый класс: testempservice.java
Импорт org.junit.test; import org.springframework.context.applicationContext; Import org.springframework.context.support.classpathxmlapplicationContext; импорт com.lixing.scm. testTrasaction () {emp emp = new emp (); Emp.Setid ("00000003"); emp.setname ("某某某"); Emp.Setage (50); emp.setsex ("мужчина"); Emp.Setphone ("566666"); ApplicationContext ctx = new ClassPathxMlapplicationContext ("classPath: ApplicationContext.xml"); Empservice Service = ctx.getbean (empservice.class); service.insertemp (emp); }}