понедельник, 9 марта 2015 г.

Некоторые малоизвестные возможности MyBatis 3

MyBatis (ранее iBatis) - фреймворк для java приложений для работы с базами данных. Он менее популярен чем Hibernate, однако все же используется в достаточно большом количестве проектов и имеет свои области применения. Туториал достаточно полно описывающий основной функционал MyBatis доступен по ссылке https://mybatis.github.io/mybatis-3/.
В данной статье я хочу описать возможности которых нет в туториале, но которые могут оказаться полезны в реальных приложениях.
Все описанные примеры проверены с использованием базы данных Oracle.


1. Возвращение значения id вставленной записи для insert запросов.

В случае если генерация id для вставляемой записи производится триггером может быть использован insert следующего вида

    
<insert id="createEmployee" keycolumn="ID" keyproperty="idWrapper.id" usegeneratedkeys="true">
   insert into employee(first_name, last_name) values (#{firstName}, #{lastName})
</insert>
Здесь значение атрибута keyColumn равно названию колонки содержащей id, keyProperty - названию поля куда будет записан id.
Сигнатура метода в интерфейсе DAO.

public void createEmployee(@Param("senderAccountId") int senderAccountId,@Param("messageSubject") String messageSubject, @Param("idWrapper")IdWrapper idWrapper);
Класс IdWrapper это класс с единственным полем Integer id, в которое будет записан id вставленной записи после выполнения запроса.


2. Определение и использование процедур внутри запросов myBatis.

Внутри myBatis запросов возможно определять и использовать свои процедуры. Ниже приведен пример такой процедуры для БД Oracle.
    
<insert id="deleteCTSession">
{call
    declare
      --declaration block
    begin
      --procedure code
      insert into employee(first_name, last_name) values (#{firstName}, #{lastName});
    end
}        
</insert>
В процедурах в MyBatis разрешен и должен использоваться символ ; для завершения sql предложения, в то время как в обычных MyBatis блоках использование данного символа приведет к ошибке выполнения запроса.


3. Возвращение значений из процедур myBatis в Oracle
<insert id="createEmployee" statementType="CALLABLE">
   {call
   declare
      n_employee_id employee.id%type := null;
   begin
      insert into employee(first_name, last_name) values (#{firstName}, #{lastName}) 
      returning id into n_employee_id;

      #{idWrapper.id, javaType=Integer, jdbcType=NUMERIC, mode=OUT} := n_employee_id;
   end}
</insert>
Здесь обязательно следует использовать атрибут statementType="CALLABLE".
Также для возвращаемого значение должно быть указано mode=OUT.

Сигнатура метода в интерфейсе DAO точно такая же как в п.1.
После выполнения метода id вставленной записи будет записан в idWrapper.id.


4. Возможность использования sql фрагментов глобально.

В MyBatis имеется возможность использовать sql фрагменты объявленные в каком либо файле DAO в любых других файлах DAO.
Например, пусть у нас имеется фрагмент getUTCSysDateFragment объявленный в файле CommonFragmentsDAO.xml c namespace="CommonFragmentsDAO".
<mapper namespace="CommonFragmentsDAO">
    <sql id="getUTCSysDate">
        CAST(sys_extract_utc(SYSTIMESTAMP) AS DATE)
    </sql>
</mapper>

Мы можем воспользоваться этим фрагментом в любом другом DAO сославшись на него с указанием namespace.
    
<insert id="createEmployee" keycolumn="ID" keyproperty="idWrapper.id" usegeneratedkeys="true">
   insert into employee(first_name, last_name, utc_create_date) 
   values (#{firstName}, #{lastName}, <include refid="CommonFragmentsDAO.getUTCSysDate"/> )
</insert>


В данной статье я описал некоторые не очевидные возможности MyBatis, которые я использовал на своих проектах. По мере обнаружения других подобных возможностей статья будет дополняться.

1 комментарий:

Ярлыки

java (31) оптимизация (7) CPanel (5) svn (5) windows xp (5) ошибка (5) свой сервер (5) файлы и папки (5) gui (4) регулярные выражения (4) jacoco (3) redmine (3) windows (3) автоматизация (3) защита данных (3) резервное копирование (3) сервер (3) JavaScript (2) Oracle SQL (2) adsl модем (2) apache maven (2) apache tomcat (2) coverage (2) dropbox (2) excel (2) firewall (2) netbeans (2) office 2007 (2) samsung (2) system tray (системный трей) (2) xerox (2) вирусы (2) принтер (2) сериализация (2) удаленный рабочий стол (2) HTML (1) JFileChooser (1) MySQL (1) Nokia (1) Ovi (1) P660R-T1 (1) WakeOnLan (1) blogger.com (1) ctfmon.exe (1) email (1) flash память (1) ftp (1) integration testing (1) ip (1) jQuery (1) jvisualWm (1) log4j (1) look and feel (1) myBatis (1) php (1) serialVersionUID (1) skype (1) smtp (1) ssh (1) swing (1) torrents (1) unit-testing (1) unix (1) vpn (1) windows 7 (1) xStarter (1) zip (1) безопасность (1) вход в систему (1) дизайн (1) документация (1) заправка (1) интернет (1) логирование (1) мышь (1) патч (1) перенос (1) печать (1) плагины (1) почтовые сообщения (1) программирование (1) процессы (1) прошивка (1) сеть (1) сеть. ошибка (1) скрытые файлы (1) списки (1) фильтрация (1) фокус (1) часовые пояса (1) шифрование (1) экран (1)