Объект сбора списков инкапсулируется в программе, а затем объекты в сборе должны быть вставлены в базу данных. Поскольку проект использует конфигурацию Spring+Mybatis, планируется использовать пакетную вставку Mybatis. Поскольку ранее не было вставки пакетов, я наконец -то реализовал ее после поиска некоторой информации в Интернете и опубликовал подробный процесс.
Структура TrainRecord Class Class Class заключается в следующем:
Public Class TrainRecord реализует Serializable {Private Static Final Long SerialVersionUID = -1206960462117924923L; частный длинный идентификатор; частная длинная активность; частный длинный империст; частный флаг Int; частная строка addtime; // setter and getter} Соответствующий mapper.xml определяется следующим образом:
<resultMap type = "trainRecord" id = "trainRecordResultMap"> <id column = "id" property = "id" jdbctype = "bigint" /> <result column = "add_time" property = "addtime" jdbctype = "varchar" /> <result column = "emp_id" emplim Column = "Activity_id" Property = "ActivityId" jdbctype = "bigint" /> <result column = "activity_id" property = "activityid" jdbctype = "bigint" /> <result column = "flag" property = "jdbctype =" varchar " /> < /> resultmap>
Определение метода вставки партии в mapper.xml выглядит следующим образом:
<insert id="addTrainRecordBatch" useGeneratedKeys="true" parameterType="java.util.List"> <selectKey resultType="long" keyProperty="id" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> insert into t_train_record (add_time,emp_id,activity_id,flag) values <foreach collection="list" item = "item" index = "index" sepreator = ","> (#{item.addtime},#{item.empid},#{item.activityid},#{item.flag}) </foreach> </insert>Объяснение тега Foreach упоминается в Интернете, следующим образом:
Foreach в основном используется в строительстве в условиях, он может итерации над коллекцией в заявлениях SQL. Атрибуты элемента Foreach в основном включают в себя элемент, индекс, коллекцию, открытый, сепаратор и закрытие. Элемент представляет псевдоним, когда каждый элемент в коллекции является итерацией. Индекс указывает имя, чтобы представить положение, до которой достигается каждая итерация во время итерационного процесса. Open представляет то, что начинается с утверждения, сепаратор представляет то, что символы используются в качестве разделителей между каждой итерацией, и закрыть представляет то, что заканчивается. Наиболее важной и наиболее подверженной ошибкам при использовании Foreach является атрибут коллекции. Этот атрибут должен быть указан, но в разных случаях значение атрибута отличается. Есть три основные ситуации:
1. Если передача в одном параметре и тип параметра является списком, значение атрибута коллекции - список
2. Если передача в одном параметре и тип параметра является массивом, значение свойства сбора - массив
3. Если есть несколько параметров, нам нужно инкапсулировать их в карту. Конечно, один параметр также может быть инкапсулен в карту.
Я не буду перечислять конкретные примеры о Foreach здесь. Я могу привести пример каждой ситуации, если у меня будет возможность в будущем.
Mysqlbasedao:
Общедоступный класс mysqlbasedao Extends sqlSessionDaosupport { /*** Вставка: вставка операция. <br/> * * @author chenzhou * @param метод метод Имя операции вставки * @param partity Query Parameter или класс объектов * @return возвращает количество рядов, затронутых * @since jdk 1.6 */ public int insert (строка метод, объект объекта) {return this.getSqlSession (). insert (метод, Entity); } // другие методы опущены} TrainRecordDao, соответствующий классу сущности TrainRecord, определяется следующим образом:
Public Class TrainRecordDao Extens MySQLBASEDAO { /*** addTrainRecordBatch: Patch Insert Training Records. <br/> * * @author Chenzhou * @param trainRecordlist Список учебных записей коллекции списков * @return Количество строк, затронутых * @since JDK 1.6 */ public int addTrainRecordbatch (list <drainrecord> trainRecordlist) {return this.insert ("addTrainRecordbatch", trainRecordList); } // Опустить оставшиеся методы} Затем напрямую вызовите метод AddTrainRecordBatch в TrainRecordDao, и вы можете вставить его партиями.
Особенно отмечено, что я столкнулся с ошибкой без речи, когда я попробовал ее, и мне потребовалось почти час, чтобы решить ее. Когда я определяю метод вставки в mapper.xml, я обычно использую тег <!
<! [Cdata [select * from t_train_record t, где t.activity_id =#{ActivityId}]]> Это в основном потому, что в XML -элементах «<» и «&» незаконны. «<» создает ошибку, потому что анализатор интерпретирует символ как начало нового элемента. «&» также создает ошибку, потому что анализатор интерпретирует символ как начало сущности символов. Перед «<» или «&» может существовать в операторе SQL или сценарии. Чтобы избежать ошибок, оператор SQL может быть определена как CDATA. Все в разделе CDATA игнорируется парсером.
В то время я также использовал это использование в методе AddTrainRecordBatch:
<! [Cdata [insert in to_train_record (add_time, emp_id, activity_id, flag) значения <foreach collection = "list" item = "item" index = "index" sepreator = ","> (#{item.addtime},#{item.empid},#{item.activityid},#{item.flag}) </for} </for} </for} </for} </for}) </empid}) </empid},#eact.В результате программа всегда сообщает об ошибке при выполнении: com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception. При просмотре сообщения об ошибке, передаваемые параметры являются нулевыми. После долгого времени путаницы я понял, что <! [CDATA []]> включил тег <Foreach> в XML и непосредственно обрабатывал тег как строку. После удаления внешнего <! [Cdata []]> он может быть выполнен нормально.