У нас есть класс домена для пользователя и таблица базы данных для хранения информации о пользователе в базе данных. В нашем примере мы будем использовать модель конфигурации 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
|
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, для которого мы должны предоставлять услуги базы данных.
Наша таблица базы данных
Ниже приведена таблица нашей базы данных:
|
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. Ниже приведен интерфейс для нашего примера:
|
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
|
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:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configurationPUBLIC "-//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> |
Как видите, мы не определили некоторые очень важные свойства здесь:
- Свойства подключения к базе данных.
- Свойства, связанные с транзакциями.
- А также не определили конфигурацию картографов.
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 --><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, и для определения уровней транзакций будем использовать аннотации. Ниже приведена конфигурация для менеджера транзакций:
|
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
|
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 вместе:
|
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"?>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-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
|
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