В данной статье я хочу описать возможности которых нет в туториале, но которые могут оказаться полезны в реальных приложениях.
Все описанные примеры проверены с использованием базы данных 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, которые я использовал на своих проектах. По мере обнаружения других подобных возможностей статья будет дополняться.
спасибо!
ОтветитьУдалить