FoxBase!
msgbartop
Блог Oracle разработчика
msgbarbottom
foxbase

21.08.2011 Загрузка данных в MyBatis. Часть 1

В этой статье будет обобщен мой небольшой опыт по работе с довольно известным в определенных кругах фреймворком на Java под названием MyBatis. Который раньше назывался iBatis. При этом на MyBatis документация мягко говоря не очень. В смысле она есть, но не очень понятная. На iBatis она тоже есть и ее больше. Но хрен редьки не слаще. Вернемся к нашему MyBatis-у.
Создан этот фреймворк для того, чтобы отвязать Java классы от всяких там СУБД. Т.е. идея такова – описываем преобразование или маппинг таблиц базы данных или запросов в атрибуты Java классов посредством XML файла и, делая вызовы соответствующих методов MyBatis-а, просто заполняем данными эти Java классы. Все смеются и все счастливы…
Свои сомнения по поводу такого рода опенсорсных разработок я уже озвучивал, но не пропадать же временному просветлению в мозгах после недельного знакомства с этим чудом? Следовательно запишем все это на бумаге, а то боюсь просветление скоро может закончится, а вдруг когда-нибудь еще эти знания пригодятся? 
Эта статья будет построена по принципу пошаговых инструкций с пояснениями для выполнения вполне понятных практических задач. Простые манипуляции по загрузке данных сможет выполнить даже тот, кто никогда не видел ни MyBatis, ни Eclipse. Для расширения своих знаний по MyBatis-у в дальнейшем читайте официальную документацию. 
Итак, поставим себе довольно простую задачку. Есть таблица базы данных в Oracle, требуется написать Java класс, который умеет загружать атрибуты заданной записи из этой таблицы и выводить их на экран. В дальнейшем будем усложнять эту задачу.
Прежде всего у вас должен быть установлен сам MyBatis для Java, который можно скачать вот по этой ссылке с официального сайта.  На момент написания статьи использовалась версия 3.0.4.
Для демонстрации работы создадим проект в также опенсорсном построителе разнообразных проектов под названием Eclipse. Это имя знают все, мало-мальски знакомые с миром Java. Не потому, что Eclipse это очень уж хорошо, а потому что попса, знаете ли…

Создание тестового проекта

Делаем в Eclipse File->New->Project, далее все по умолчанию, вводим имя проекта как MyBatisTest, жмем Finish
Eclipse MyBatis
Получаем пустой тестовый проект.  Далее  создаем класс с именем startFile->New->Class. Не забываем отметить галочку “public static void main…
Eclipse MyBatis
Должно получиться все, как на картинке. Вписываем в тело метода main строку:

System.out.println("started");
Затем нажимаем клавишу F11, и видим такой вопрос:
Eclipse java application
Выбираем Java Application, после чего в консоли вывода можем наблюдать результаты работы нашей простой пока программы:
eclipse application console

Настройка библиотек

Нам потребуется сам MyBatis в виде файла mybatis-3.0.4.jar, который мы возьмем с официального сайта, а также Oracle jdbc в виде файла ojdbc6.jar, который можно найти на официальном сайте Oracle. Скопируйте эти файлы в каталог вашего проекта, например в каталог с именем lib. Если вы добавили каталог внутри проекта – не забудьте сделать Refresh (F5) проекта, чтобы Eclipse увидел новый каталог.
Далее выделяем верхний узел нашего проекта, далее Properties, затем в окне в левом списке выделяем Java Build Path. Далее выбираем вкладку Libraries и добавляем  эти библиотеки (Add JARs…). В результате должна получиться следующая картинка:
eclipse jre
Также в дереве проекта должен появиться новый узел:
eclipse library
Все, теперь мы готовы что-то делать из Eclipse, чтобы достучаться до СУБД Oracle посредством MyBatis. Но для этого давайте подготовим тестовые таблицы и данные.

Создание тестовых таблиц в Oracle

Подразумевается, что у вас должен быть доступ к серверу Oracle. Для экспериментов можно создать новую схему данных, можно использовать существующую. Создадим две простые тестовые таблицы с именами Master и Detail, смысл которых очевиден их названия. 

CREATE TABLE MASTER
(ID NUMBER(32),
 NAME VARCHAR2(256));

ALTER TABLE MASTER
  ADD CONSTRAINT PK_MASTER PRIMARY KEY (ID)
  USING INDEX;

CREATE TABLE DETAIL
(ID NUMBER(32),
 MASTER_ID NUMBER(32),
 NAME VARCHAR2(256));

ALTER TABLE DETAIL
  ADD CONSTRAINT PK_DETAIL PRIMARY KEY (ID)
  USING INDEX;

ALTER TABLE DETAIL
  ADD CONSTRAINT FK_DETAIL_MASTER foreign KEY (MASTER_ID)
  references MASTER (ID);
Заполним таблицы некоторыми тестовыми данными:

INSERT INTO MASTER VALUES (1,'First master');
INSERT INTO MASTER VALUES (2,'Second master');

INSERT INTO DETAIL VALUES (1, 1, 'First detail for first master');
INSERT INTO DETAIL VALUES (2, 1, 'Second detail for first master');
INSERT INTO DETAIL VALUES (3, 2, 'First detail for second master');
INSERT INTO DETAIL VALUES (4, 2, 'Second detail for second master');

Настройка MyBatis 

Следующим шагом необходимо настроить MyBatis для использования в нашем тестовом проекте, для чего необходимо создать конфигурационный XML файл. Выполняем File->New->Other… и выбираем XML:
eclipse xml
Помещаем вновь создаваемый XML файл в корневой каталог нашего проекта. Назовет этот файл, например, conf.xml. Его содержание должно быть примерно таким:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
   "http://mybatis.org/dtd/mybatis-3-config.dtd">  
<configuration>
  <properties resource="config.properties" />
  <environments default="development">
      <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="master.xml"/>
  </mappers>
</configuration>
В этом файле мы указали jdbc драйвер, через который мы будем работать с базой данных, а также определили ряд свойств, отвечающих за логин к базе данных. Сами значения этих свойств будут храниться в файле config.properties, который также необходимо создать в нашем проекте в каталоге src  (New->File):

driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
username=user
password=pass
Параметры в нашем случае коннекта к СУБД Oracle задаются в стандартной jdbc нотации для thin драйвера.
В файле config.properties также определен раздел mappers, который указывает на ресурс master.xml. Это именно тот файл маппинга к таблице MASTER, которую мы создали выше. 
В результате для каждой таблицы (или запроса или группе связанных запросов) нам потребуется создать два файла. Один файл будет Java классом для хранения атрибутов записи таблицы MASTER, другой файл будет XML файлом маппинга, в котором и будет в нотации MyBatis-а описано соответствие атрибутов таблицы и атрибутов Java класса, а также  в нем будет записан SQL запрос, извлекающий требуемую запись из базы данных.
Java класс должен быть написан в виде POJO (или с некоторой натяжкой JavaBean), т.е. его свойства должны быть доступны на чтение через так называемые getters (методы, читающие свойства класса), а на запись через setters (методы, записывающие значения свойств). Названия методов должны подчиняться следующим правилам: в начале имени метода идет префикс (set или get), затем название самого свойства. 
Текст класса Master.java приведен ниже.

public class Master {
  private Integer Id;
  private String Name;

 
  public Integer getId() {
    return Id;
  }
  public void setId(Integer val) {
    Id = val;
  }

  public String getName() {
    return Name;
  }

  public void setName(String val) {
    Name = val;
  }

 
}
Код класса тривиален и не требует дальнейших пояснений. Текст файла master.xml  (должен быть создан в каталоге проекта src):

<?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 namespace="masterMapper">

  <resultMap id="masterResult" type ="Master">
   

<result property="id" column="ID" jdbcType="NUMERIC"/>
   

<result property="name" column="NAME" jdbcType="VARCHAR"/>
  </resultMap>  
 
  <select id="selectCtx" parameterType="int" resultMap="masterResult">  
    select * from MASTER where ID = #{id}
  </select>
 
</mapper>
В этом файле определен так называемый resultMap, в котором прописано соответствие свойств Java класса именам столбцов, которые должен возвращать SQL запрос. Как видно, resultMap имеет имя и тип, имя которого четко соответствует имена Java класса, свойства которого он писывает.
В следующей секции XML файла определен SQL запрос (ключевое свойство select). Запрос характеризуется именем, типом параметра (пока что у нас одиночный целочисленный параметр int) и resultMap-ом, который мы определили выше. 
Принципы описания простого маппинга хорошо понятны из приведенного выше простого примера.

Загрузка данных и просмотр результатов.

Следующим этапом нам необходимо загрузить данные в наш Java класс и как-то вывести результаты на консоль.  Реализация приведена ниже в классе start.

import java.io.Reader;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class start {

  public static void main(String[] args) {
    System.out.println("started");
    try {
      // Считываем конфигурационный файл    

      Reader reader = org.apache.ibatis.io.Resources.getResourceAsReader("conf.xml");
      // Инициализируем SqlSessionFactory
      SqlSessionFactory sqlSessionFactory =  new SqlSessionFactoryBuilder().build(reader);
      // Инициализируем сессию
      SqlSession session = sqlSessionFactory.openSession();
      // Выполняем запрос
      Master master = (Master) session.selectOne("masterMapper.selectMaster",1);
      // Выводим результаты на консоль
      System.out.println("ID: "+master.getId()+", Name: "+master.getName());
    }
    catch(Exception e){
      e.printStackTrace();
    }
  }
}
Если теперь мы запустим наш проект (F11)  то увидим следующие результаты:

started
ID: 1, Name: First master
Как видно из примера, мы выбрали строку из таблицы MASTER с идентификатором  1 и вывели на консоль содержимое полей ID и NAME
В итоге мы написали простейшее приложение, которое  посредством MyBatis-а выполняет простой SQL запрос и загружает запись таблицы в Java класс. В следующих статьях мы научимся делать нечто большее.

www.foxbase.ru


Смотрите также:



Комментарии читателей

  1. |

    Bag: id=»selectCtx» modify id=»selectMaster»

  2. |

    Спасибо! Очень наглядно!



Оставьте свой комментарий

Вы должны быть авторизированны, чтобы оставить комментарий.