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