Недавно из-за потребностей бизнеса в системе электронной коммерции мне нужно вернуться к идентификатору продукта после вставки информации о продукте. Вначале я столкнулся с некоторыми подводными камнями, поэтому я сделал заметки здесь, чтобы предотвратить его забыть в будущем.
Получите вставленный первичный ключ, как следующий код
Пользователь пользователь = новый пользователь (); user.setusername ("chenzhou"); user.setpassword ("xxxx"); user.SetComment («Проверьте функцию вставки данных для возврата первичного ключа»); System.out.println («Первичный ключ перед вставкой:»+user.getUserid ()); userdao.insertandgetid (user); // вставить систему операции.После запроса онлайн -информации я обнаружил, что есть примерно два способа.
Метод 1:
В файле сопоставления класса класса «*mapper.xml» написан так:
<INSERT ID = "INSERTANDGEID" useGeneratedKeys = "true" keyProperty = "userId" parameterType = "com.chenzhou.mybatis.user"> вставьте в пользователь (username, пароль, комментарий)
Советы:
Использовать GeneratedKeys = "true" означает установить самоотражение для первичного ключа
KeyProperty = "userId" означает назначение растущего идентификатора в поле пользователя в классе объектов.
ParameterType = "com.chenzhou.mybatis.user" Это свойство указывает на класс предприятия с пропущенным параметром
Вот напоминание о том, что нет атрибута ResultType в <SINSERT> </INSERT>, поэтому не добавляйте его случайным образом.
Уэрид в классе сущности должен иметь getter () и setter (); метод
Поскольку я уже установил самочувствие поля при создании таблиц в базе данных MySQL, я наконец выбрал второй метод.
Второй метод:
Также в файле отображения «*mapper.xml» класса объекта, но он должен быть написан так:
<!-Вставьте продукт-> <insert id = "insertproduct" parametertype = "domain.model.productbean"> <selectkeke resultype = "java.lang.long" order = "После" keyProperty = "productId"> Select_insert_id () </select> Insert в t_product (productname, productdesrcible, merchantid) значения (#{productname},#{productDesrcible},#{merchantid}); </insert>Советы:
Нет атрибута ResultType в <Insert> </insert>, но есть тег <selectKey> </selectKey>.
Order = "После" означает, что оператор INSERT выполняется сначала, а затем выполняется оператор запроса.
Может быть установлен на до или после.
Если установлено ранее, он сначала выберет первичную клавишу, установите KeyProperty, а затем выполните оператор INSERT.
Если сначала установлена после того, как выполните оператор INSERT, а затем элемент SelectKey - аналогично базе данных Oracle, вы можете встроить вызовы последовательности в оператор INSERT, как в базе данных Oracle.
KeyProperty = "userId" означает назначение растущего идентификатора в поле пользователя в классе объектов.
Выберите Last_insert_ID () означает, что только что идентификатор самооттрагивания записи, который только что был вставлен, запрашивается в синтаксисе MySQL.
Уэрид в классе сущности должен иметь getter () и setter (); метод
Чтобы достичь требований, вышеупомянутое достаточно.
Если вы здесь заинтересованы, пожалуйста, продолжайте послушать меня о возможной ошибке в Mybatis.
Почему модификация метода добавления в Mybatis имеет возвратное значение, хотя в нем предполагается, что база данных вставки успешна, а вставленные данные можно прочитать, но когда вы открываете базу данных, вы не можете увидеть вставленные данные?
Если вы хотите вставить и вернуть первичный ключ при реализации вышеуказанных требований, помните, чтобы не писать таким образом.
@Override public long insertproduct (ProductBean ProductBean) {// TODO Автогенерированный метод STUB SQLSESSION SESSION = mybatisjdbcutil.currentsession (); ProforctIdao ProcoryIDAO = SESSION.GETMAPPER (ProformIDAO.CLASS); // Здесь *.class // он должен соответствовать уровню интерфейса DAO return ProductIdao.insertProduct (ProductBean); }Почему?
Потому что, если вы пишете, как указано выше, возврат первичного идентификатора ключа, который вы хотите после выполнения, не является количеством затронутых строк после выполнения оператора базы данных.
Более того, после того, как вы выполните, вы обнаружите, что подсказка успешна при внедрении, и вы также можете прочитать вставленные данные с кодом, но всегда есть только одна запись.
Более того, когда вы откроете базу данных, вы обнаружите, что в базе данных не было вставлено никакие данные.
Я был в депрессии здесь в течение долгого времени и, наконец, обнаружил ключевой момент.
Разница между наличием возврата и отсутствием возвращаемого значения составляет:
Возвратное значение заключается только для доступа к режиму только для чтения базы данных, и не будет никаких изменений в данных базы данных, таких как различные методы запроса.
Если нет возвращаемого значения, доступ к базе данных будет доступна в режиме чтения и записи, а данные в базе данных будут изменены, такие как удаление или добавление.
Кроме того, согласно личному пониманию, Mybatis должен сначала кэшировать его с построенной сеанс-коллекцией при выполнении оператора INSERT, а затем вызовать основной драйвер для работы и изменения базы данных.
session.commit (); Mybatisjdbcutil.closesession ();
Два вышеупомянутых оператора не возвращаются, что означает, что только после выполнения этих двух операторов они будут действительно выполнены и вставлены в базу данных и изменят данные в базе данных.
Напротив, если существует возвратное значение, эти два оператора не выполняются, поэтому оператор добавления выполняется только в сеансе, построенном сам по себе, но оно не представлено в базу данных, поэтому в базе данных нет записи.
Это объясняет, почему после изменения метода добавления в Mybatis иметь возвращаемое значение, хотя он предполагает, что база данных успешно вставлена, вы не можете увидеть вставленные данные при открытии базы данных.
Метод вставки в Mybatis не должен иметь возврата, так как написание, подобное этому, является правильным.
@Override public void insertProduct (ProductBean ProductBean) {// TODO Автогенерированный метод STUB SQLSESSION SESSION = mybatisjdbcutil.currentsession (); ProforctIdao ProforctIDAO = SESSION.GETMAPPER (ProforctIDAO.CLASS); // Здесь *.class // он должен соответствовать интерфейсному уровню DAO ProcoryAdo.InsertProduct (ProductBean); session.commit (); Mybatisjdbcutil.closesession (); }Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.