В настоящее время в нашей базе данных есть триггеры, которые выдают uuid для каждой вставляемой записи. Когда я вставляю записи с помощью mybatis, я хотел бы вернуть этот uuid вместо количества вставленных строк.

Из предыдущего поста я прочитал, что могу сделать это с

useGeneratedKeys="true" keyProperty="id"

Но мы храним наш uuid как двоичные файлы, поэтому я хотел бы получить недвоичный uuid обратно из вставки. Когда мы вставляем что-то, мы используем такие функции, как 'uuid2bin' и 'bin2uuid', поэтому я надеялся использовать такую ​​функцию для извлечения вновь сгенерированного uuid из базы данных (MySQL).

Любые предложения о том, как я могу вернуть вновь созданный uuid?

3
Marco 26 Авг 2011 в 17:28

3 ответа

Лучший ответ

Я могу придумать два варианта: 1) выполнить преобразование на Java с помощью MyBatis TypeHandler или 2) обернуть вставку хранимой процедурой, которая возвращает отформатированный UUID.

Проблема с №1 заключается в том, что вы перемещаете нагрузку из БД в свое приложение, что может повлиять на производительность, если MySql удален.

С # 2 вам нужно использовать <select> в MyBatis. Но вам нужно убедиться, что он действительно фиксируется. Кроме того, если вы используете кэширование MyBatis, вам также необходимо установить flushCache=true в <select>.

1
AngerClown 26 Авг 2011 в 17:35

Я бы использовал тег <selectKey> внутри тега <insert>

<insert>
   <selectKey keyProperty="pk" resultType="Type" order="AFTER">
     select myDBFunction( (select triggerGeneratedColumnInBinary from myTable where pk = triggerLogicToRetrieveLastGenerated(...) ) );
   </selectKey>
   ...procedure call or insert...
</insert>

Если вы отправляете объект, а не Hashmap, этот код установит результат вашей функции интерпретатора с помощью столбца, сгенерированного триггером, после вставки. Метод по-прежнему будет возвращать количество строк, но у вашего объекта будет ключ.

System.out.println(myObject.getPk()); //0
int rows = myMapper.insertMyClass(myObject); // sets the pk
System.out.println(myObject.getPK()); //324

UseGeneratedKeys вам не поможет, потому что он сообщает MyBatis использовать метод JDBC getGeneratedKeys для извлечения ключей, сгенерированных внутри базы данных (например, автоматическое увеличение полей в СУБД, таких как MySQL или SQL Server).

0
corlaez 23 Авг 2015 в 03:35

Метод возвращает значение - количество обновленных строк. Id входящего параметра - это id вставляемой строки. Следующим образом:

 <insert id="insertSelectiveReturnKey" parameterType="com.test.dal.model.CostDO" useGeneratedKeys="true" keyProperty="id">
        insert into cost
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="id != null">
                id,
            </if>
            <if test="name != null">
                name,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="id != null">
                #{id,jdbcType=BIGINT},
            </if>
            <if test="name != null">
                #{name,jdbcType=TIMESTAMP},
            </if>
        </trim>
    </insert>


 CostDO costDO = new CostDO();
 costDO.setName("test");
 int updateNum = productMapper.insertSelectiveReturnKey(costDO);
 // updateNum is the number of updated rows.

productMapper.insertSelectiveReturnKey(costDO);
int id = costDO.getId();
// id is the id of insertd row
0
jack 1 Июл 2019 в 03:23