У нас есть класс домена для пользователя и таблица базы данных для хранения информации о пользователе в базе данных. В нашем примере мы будем использовать модель конфигурации xml для определения команд SQL, которые будут выполнять операции CRUD.
Класс нашего домена
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 | packagecom.raistudies.domain;importjava.io.Serializable;publicclassUser implementsSerializable{    privatestaticfinallongserialVersionUID = 3647233284813657927L;    privateString id;    privateString name = null;    privateString standard = null;    privateString age;    privateString sex = null;    //setter and getter have been omitted to make the code short    @Override    publicString toString() {        return"User [name="+ name + ", standard="+ standard + ", age="+ age        + ", sex="+ sex + "]";    }} | 
У нас есть пять свойств в нашем доменном классе, который называется User, для которого мы должны предоставлять услуги базы данных.
Наша таблица базы данных
Ниже приведена таблица нашей базы данных:
| 1 2 3 4 5 6 7 8 | CREATETABLE`user` (    `id` varchar(36) NOTNULL,    `name` varchar(45) DEFAULTNULL,    `standard` varchar(45) DEFAULTNULL,    `age` varchar(45) DEFAULTNULL,    `sex` varchar(45) DEFAULTNULL,    PRIMARYKEY(`id`)) ENGINE=InnoDB DEFAULTCHARSET=utf8 | 
Создание интерфейса для операций CRUD
Для определения операции базы данных CRUD с использованием MyBatis 3 мы должны указать методы, которые будут использоваться для выполнения операции CRUD. Ниже приведен интерфейс для нашего примера:
| 01 02 03 04 05 06 07 08 09 10 11 12 13 | packagecom.raistudies.persistence;importjava.util.List;importcom.raistudies.domain.User;publicinterfaceUserService {    publicvoidsaveUser(User user);    publicvoidupdateUser(User user);    publicvoiddeleteUser(String id);    publicList<User> getAllUser();} | 
У нас есть четыре метода для выполнения операций создания, обновления, удаления и получения из базы данных.
Файл сопоставления XML для интерфейса UserService
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"<mappernamespace="com.raistudies.persistence.UserService">    <resultMapid="result"type="user">        <resultproperty="id"column="id"/>        <resultproperty="name"column="name"/>        <resultproperty="standard"column="standard"/>        <resultproperty="age"column="age"/>        <resultproperty="sex"column="sex"/>    </resultMap>    <selectid="getAllUser"parameterType="int"resultMap="result">        SELECT id,name,standard,age,sex        FROM user;    </select>    <insertid="saveUser"parameterType="user">        INSERT INTO user (id,name,standard,age,sex)        VALUE (#{id},#{name},#{standard},#{age},#{sex})    </insert>    <updateid="updateUser"parameterType="user">        UPDATE user        SET        name = #{name},        standard = #{standard},        age = #{age},        sex = #{sex}        where id = #{id}    </update>    <deleteid="deleteUser"parameterType="int">        DELETE FROM user        WHERE id = #{id}    </delete></mapper> | 
Здесь вы увидите много нового:
Файл отображения будет содержать элемент <mapper /> для определения оператора SQL для сервисов. Здесь свойство « пространство имен » определяет интерфейс, для которого был определен этот файл сопоставления.
Тег <insert /> определяет, что операция имеет тип вставки. Значение свойства « id » указывает имя функции, для которой определен оператор SQL. Здесь это « saveUser ». Свойство « parameterType » определяет параметр метода того или иного типа. Мы использовали псевдоним для класса User здесь. Псевдоним будет настроен в файле конфигурации MyBatis позже. Затем мы должны определить оператор SQL. # {id} определяет, что свойство « id » класса User будет передано в качестве параметра в SQL-запрос.
Тег <resultMap /> используется для определения соответствия между классом User и таблицей пользователя. id <resultMap /> — это уникальное имя для определения сопоставления. Под этим тегом мы определяем различные свойства и какой столбец ограничен каким свойством.
Тег <select /> используется для указания оператора SQL выбора. Значение свойства « id » указывает имя функции, для которой определен оператор SQL.
Атрибут resultMap используется для определения типа возврата оператора SQL как коллекции.
MyBatis 3 Конфигурационный файл
Ниже приведен наш файл конфигурации для MyBatis:
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 | <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN"<configuration>    <settings>        <!-- changes from the defaults -->       <settingname="lazyLoadingEnabled"value="false"/>    </settings>    <typeAliases>        <typeAliastype="com.raistudies.domain.User"alias="user"/>    </typeAliases></configuration> | 
Как видите, мы не определили некоторые очень важные свойства здесь:
- Свойства подключения к базе данных.
- Свойства, связанные с транзакциями.
- А также не определили конфигурацию картографов.
MyBatis 3 — это очень мощная среда отображения SQL с автоматической генерацией классов доступа к базе данных с использованием прокси-реализации служб, определенных пользователями. Мы осознаем, что это настоящая сила, если вы интегрируете MyBatis 3 со средой Spring и используете эти прокси-реализации. Это сократит работу нашей базы данных на 80%. Ниже мы увидим, как интегрировать MyBatis 3 со средой Spring 3. Ранее мы создавали службу базы данных CRUD для класса User с использованием MyBatis 3. Теперь мы интегрируем службы данных, реализованные с использованием MyBatis, со средой Spring.
Используемые инструменты:
- c3p0-0.9.1.2.jar — для обеспечения соединения с базой данных в пуле.
- mybatis-spring-1.0.0.jar — для интеграции MyBatis с Spring (предоставлено командой MyBatis)
- Spring JDBC и базовая библиотека
Чтобы объединить эти две структуры, мы должны выполнить следующие шаги:
  Шаг 1. Определение источника данных как бина Spring 
  Поскольку мы будем использовать поставщика источника данных c3po, мы должны определить bean-компонент источника данных в Spring.  Ниже приведен фрагмент конфигурации: 
| 1 2 3 4 5 6 | <!-- Declare a datasource that has pooling capabilities --><beanid="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close"p:driverClass="${app.jdbc.driverClassName}"p:jdbcUrl="${app.jdbc.url}"p:user="${app.jdbc.username}"p:password="${app.jdbc.password}"p:acquireIncrement="10"p:idleConnectionTestPeriod="60"p:maxPoolSize="100"p:maxStatements="50"p:minPoolSize="10"/> | 
Здесь мы создали пружинный компонент с идентификатором dataSource класса com.mchange.v2.c3p0.ComboPooledDataSource, который предоставляется библиотекой c3p0 для объединенного источника данных.
Мы установили некоторые свойства в бобе. Ниже приведено описание свойств, определенных в bean-компоненте:
- driverClass : класс драйвера, который будет использоваться для подключения к базе данных.
- jdbcUrl : URL-адрес jdbc, определяющий строку подключения к базе данных.
- user : имя пользователя базы данных
- пароль : пароль пользователя базы данных.
- acquIncrement : сколько соединений будет создано в то время, когда будет нехватка соединений.
- idleConnectionTestPeriod : после какой задержки соединение будет закрыто, если оно больше не используется.
- maxPoolSize : максимальное количество соединений, которые могут быть созданы.
- maxStatements : максимальное количество операторов SQL, которые будут выполнены в соединении.
- minPoolSize : минимальное количество создаваемых соединений.
Мы использовали Spring EL для определения многих значений свойств, которые будут взяты из файла свойств.
Определение менеджера транзакций в Spring
Мы будем использовать Transaction Manager, предоставляемый средой Spring JDBC, и для определения уровней транзакций будем использовать аннотации. Ниже приведена конфигурация для менеджера транзакций:
| 1 2 3 4 5 6 7 | <!-- Declare a transaction manager --><beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"p:dataSource-ref="dataSource"/><!-- Enable annotation style of managing transactions --><tx:annotation-driventransaction-manager="transactionManager"/> | 
Определение MyBatis SqlSessionFactory и MapperScanner
| 01 02 03 04 05 06 07 08 09 10 | <!-- define the SqlSessionFactory, notice that configLocation is not needed when you use MapperFactoryBean --><beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">    <propertyname="dataSource"ref="dataSource"/>    <propertyname="configLocation"value="WEB-INF/mybatis/sqlmap-config.xml"/></bean><!-- scan for mappers and let them be autowired --><beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer">    <propertyname="basePackage"value="${MapperInterfacePackage}"/></bean> | 
Компонент SqlSessionFactory будет предоставлять экземпляры SessionFactory MyBatis. Чтобы настроить SqlSessionFactory, нам нужно определить два свойства. Сначала источник данных, который будет использоваться MyBatis для создания базы данных соединений и имя файла конфигурации MyBatis для настройки среды MyBatis.
MapperScannerConfigurer используется для публикации интерфейсов службы данных, определенных для MyBatis для настройки в качестве Spring Beans. Мы просто должны предоставить пакет, в котором определены интерфейсы и их файлы XML отображения. Мы можем указать более одного пакета, используя общее разделение или точку с запятой. После этого мы сможем получить экземпляры UserService с помощью аннотации @Autowired. Нам не нужно реализовывать интерфейс, так как MyBatis предоставит для этого прокси-реализацию.
  Spring конфигурационный файл как вместе 
  Вот наш jdbc-context.xml вместе: 
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | <?xmlversion="1.0"encoding="UTF-8"?>xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation=""><context:property-placeholderlocation="/WEB-INF/jdbc.properties,/WEB-INF/mybatis/mybatis.properties"/>    <!-- Enable annotation style of managing transactions -->    <tx:annotation-driventransaction-manager="transactionManager"/>    <!-- Declare a datasource that has pooling capabilities -->    <beanid="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource"    destroy-method="close"p:driverClass="${app.jdbc.driverClassName}"    p:jdbcUrl="${app.jdbc.url}"p:user="${app.jdbc.username}"p:password="${app.jdbc.password}"    p:acquireIncrement="10"p:idleConnectionTestPeriod="60"p:maxPoolSize="100"    p:maxStatements="50"p:minPoolSize="10"/>    <!-- Declare a transaction manager -->    <beanid="transactionManager"    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"    p:dataSource-ref="dataSource"/>    <!-- define the SqlSessionFactory, notice that configLocation is not needed when you use MapperFactoryBean -->    <beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">        <propertyname="dataSource"ref="dataSource"/>        <propertyname="configLocation"value="WEB-INF/mybatis/sqlmap-config.xml"/>    </bean>    <!-- scan for mappers and let them be autowired -->    <beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer">        <propertyname="basePackage"value="${MapperInterfacePackage}"/>    </bean></beans> | 
файл jdbc.properties
| 1 2 3 4 5 | # database propertiesapp.jdbc.driverClassName=com.mysql.jdbc.Driverapp.jdbc.url=jdbc:mysql://localhost/mybatis-exampleapp.jdbc.username=rootapp.jdbc.password=password | 
файл mybatis.properties
| 1 | MapperInterfacePackage=com.raistudies.persistence | 
Ссылка: Создание службы CRUD с использованием MyBatis 3 Mapping Framework — Часть 1 и Интеграция MyBatis 3 и Spring Framework — Часть 2 от нашего партнера JCG