Статьи

MyBatis 3 — руководство по интеграции Spring

В качестве первого шага этого руководства, примера CRUD Spring MVC 3 с MyBatis 3, мы определим сервис MyBatis, который поможет нам выполнить операцию CRUD над базой данных.

У нас есть класс домена для пользователя и таблица базы данных для хранения информации о пользователе в базе данных. В нашем примере мы будем использовать модель конфигурации xml для определения команд SQL, которые будут выполнять операции CRUD.

Класс нашего домена

Example Code Sample
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.raistudies.domain;
 
import java.io.Serializable;
 
public class User implements Serializable{
 
    private static final long serialVersionUID = 3647233284813657927L;
 
    private String id;
    private String name = null;
    private String standard = null;
    private String age;
    private String sex = null;
 
    //setter and getter have been omitted to make the code short
 
    @Override
    public String toString() {
        return "User [name=" + name + ", standard=" + standard + ", age=" + age
        + ", sex=" + sex + "]";
    }
}

У нас есть пять свойств в нашем доменном классе, который называется User, для которого мы должны предоставлять услуги базы данных.

Наша таблица базы данных

Ниже приведена таблица нашей базы данных:

Example Code Sample
1
2
3
4
5
6
7
8
CREATE TABLE `user` (
    `id` varchar(36) NOT NULL,
    `name` varchar(45) DEFAULT NULL,
    `standard` varchar(45) DEFAULT NULL,
    `age` varchar(45) DEFAULT NULL,
    `sex` varchar(45) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Создание интерфейса для операций CRUD

Для определения операции базы данных CRUD с использованием MyBatis 3 мы должны указать методы, которые будут использоваться для выполнения операции CRUD. Ниже приведен интерфейс для нашего примера:

Example Code Sample
01
02
03
04
05
06
07
08
09
10
11
12
13
package com.raistudies.persistence;
 
import java.util.List;
 
import com.raistudies.domain.User;
 
public interface UserService {
 
    public void saveUser(User user);
    public void updateUser(User user);
    public void deleteUser(String id);
    public List<User> getAllUser();
}

У нас есть четыре метода для выполнения операций создания, обновления, удаления и получения из базы данных.

Файл сопоставления XML для интерфейса UserService

Example Code Sample
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
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
<mapper namespace="com.raistudies.persistence.UserService">
 
    <resultMap id="result" type="user">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="standard" column="standard"/>
        <result property="age" column="age"/>
        <result property="sex" column="sex"/>
    </resultMap>
 
    <select id="getAllUser" parameterType="int" resultMap="result">
        SELECT id,name,standard,age,sex
        FROM user;
    </select>
 
    <insert id="saveUser" parameterType="user">
        INSERT INTO user (id,name,standard,age,sex)
        VALUE (#{id},#{name},#{standard},#{age},#{sex})
    </insert>
 
    <update id="updateUser" parameterType="user">
        UPDATE user
        SET
        name = #{name},
        standard = #{standard},
        age = #{age},
        sex = #{sex}
        where id = #{id}
    </update>
 
    <delete id="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:

Example Code Sample
01
02
03
04
05
06
07
08
09
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 
<configuration>
    <settings>
        <!-- changes from the defaults -->
       <setting name="lazyLoadingEnabled" value="false" />
    </settings>
    <typeAliases>
        <typeAlias type="com.raistudies.domain.User" alias="user"/>
    </typeAliases>
</configuration>

Как видите, мы не определили некоторые очень важные свойства здесь:

  1. Свойства подключения к базе данных.
  2. Свойства, связанные с транзакциями.
  3. А также не определили конфигурацию картографов.

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. Ниже приведен фрагмент конфигурации:

Example Code Sample
1
2
3
4
5
6
<!-- Declare a datasource that has pooling capabilities -->
<bean id="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, и для определения уровней транзакций будем использовать аннотации. Ниже приведена конфигурация для менеджера транзакций:

Example Code Sample
1
2
3
4
5
6
7
<!-- Declare a transaction manager -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource" />
 
<!-- Enable annotation style of managing transactions -->
<tx:annotation-driven transaction-manager="transactionManager" />

Определение MyBatis SqlSessionFactory и MapperScanner

Example Code Sample
01
02
03
04
05
06
07
08
09
10
<!-- define the SqlSessionFactory, notice that configLocation is not needed when you use MapperFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="WEB-INF/mybatis/sqlmap-config.xml" />
</bean>
 
<!-- scan for mappers and let them be autowired -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="${MapperInterfacePackage}" />
</bean>

Компонент SqlSessionFactory будет предоставлять экземпляры SessionFactory MyBatis. Чтобы настроить SqlSessionFactory, нам нужно определить два свойства. Сначала источник данных, который будет использоваться MyBatis для создания базы данных соединений и имя файла конфигурации MyBatis для настройки среды MyBatis.

MapperScannerConfigurer используется для публикации интерфейсов службы данных, определенных для MyBatis для настройки в качестве Spring Beans. Мы просто должны предоставить пакет, в котором определены интерфейсы и их файлы XML отображения. Мы можем указать более одного пакета, используя общее разделение или точку с запятой. После этого мы сможем получить экземпляры UserService с помощью аннотации @Autowired. Нам не нужно реализовывать интерфейс, так как MyBatis предоставит для этого прокси-реализацию.

Spring конфигурационный файл как вместе
Вот наш jdbc-context.xml вместе:

Example Code Sample
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
<?xml version="1.0" encoding="UTF-8"?>
xsi:schemaLocation="
 
 
 
 
 
 
 
">
 
<context:property-placeholder location="/WEB-INF/jdbc.properties,/WEB-INF/mybatis/mybatis.properties" />
 
    <!-- Enable annotation style of managing transactions -->
    <tx:annotation-driven transaction-manager="transactionManager" />
 
    <!-- Declare a datasource that has pooling capabilities -->
    <bean id="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 -->
    <bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
    p:dataSource-ref="dataSource" />
 
    <!-- define the SqlSessionFactory, notice that configLocation is not needed when you use MapperFactoryBean -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="WEB-INF/mybatis/sqlmap-config.xml" />
    </bean>
 
    <!-- scan for mappers and let them be autowired -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="${MapperInterfacePackage}" />
    </bean>
 
</beans>

файл jdbc.properties

Example Code Sample
1
2
3
4
5
# database properties
app.jdbc.driverClassName=com.mysql.jdbc.Driver
app.jdbc.url=jdbc:mysql://localhost/mybatis-example
app.jdbc.username=root
app.jdbc.password=password

файл mybatis.properties

Example Code Sample
1
MapperInterfacePackage=com.raistudies.persistence

Ссылка: Создание службы CRUD с использованием MyBatis 3 Mapping Framework — Часть 1 и Интеграция MyBatis 3 и Spring Framework — Часть 2 от нашего партнера JCG