利用myBATIS框架,批量插入数据,测试总是跳出The expression 'msgs' evaluated to a null value异常.
package com.cweb.iot.entity;
import java.sql.Timestamp;
/**
* 短信信息类
* 用于存储所有短信信息
* @author liuhui
*
*/
public class MsgSmsInfo {
//短信信息ID
private int smsId;
//收信人电话
private String receivePhone;
//发信息人电话
private String sendPhone;
//短信内容
private String msgContent;
//发送人类型(默认为0 系统)
private int senderType;
//发送时间(默认为系统当前时间)
private Timestamp sendDate;
//短信类型(默认为群发 3)
private int smsType;
//审核状态(默认为未审核 0)
private int aduitType;
//发送状态(默认为待发送 0)
private int smsState;
//短信类别
private int bizType;
//短信类别的名字
private String bizName;
//此条短信发送多少次
private int sms_count;
//发送人
private String sendName="宁夏农业物联网";
//发送字符长度
private long sms_length;
//用户名
private String userName;
/**
* 短信信息ID
* @return
*/
public int getSmsId() {
return smsId;
}
/**
* 短信信息ID
* @param smsId
*/
public void setSmsId(int smsId) {
this.smsId = smsId;
}
/**
* 收信人电话
* @return
*/
public String getReceivePhone() {
return receivePhone;
}
/**
* 收信人电话
* @param receivePhone
*/
public void setReceivePhone(String receivePhone) {
this.receivePhone = receivePhone;
}
/**
* 发信息人电话
* @return
*/
public String getSendPhone() {
return sendPhone;
}
/**
* 发信息人电话
* @param sendPhone
*/
public void setSendPhone(String sendPhone) {
this.sendPhone = sendPhone;
}
/**
* 短信内容
* @return
*/
public String getMsgContent() {
return msgContent;
}
/**
* 短信内容
* @param msgContent
*/
public void setMsgContent(String msgContent) {
this.msgContent = msgContent;
}
/**
* 发送人类型(默认为0 系统)
* @return
*/
public int getSenderType() {
return senderType;
}
/**
* 发送人类型(默认为0 系统)
* @param senderType
*/
public void setSenderType(int senderType) {
this.senderType = senderType;
}
/**
* 发送时间(默认为系统当前时间)
* @return
*/
public Timestamp getSendDate() {
return sendDate;
}
/**
* 发送时间(默认为系统当前时间)
* @param sendDate
*/
public void setSendDate(Timestamp sendDate) {
this.sendDate = sendDate;
}
/**
* 短信类型(默认为群发 3)
* @return
*/
public int getSmsType() {
return smsType;
}
/**
* 短信类型(默认为群发 3)
* @param smsType
*/
public void setSmsType(int smsType) {
this.smsType = smsType;
}
/**
* 审核状态(默认为未审核 0)
* @return
*/
public int getAduitType() {
return aduitType;
}
/**
* 审核状态(默认为未审核 0)
* @param aduitType
*/
public void setAduitType(int aduitType) {
this.aduitType = aduitType;
}
/**
* 发送状态(默认为待发送 0)
* @return
*/
public int getSmsState() {
return smsState;
}
/**
* 发送状态(默认为待发送 0)
* @param smsState
*/
public void setSmsState(int smsState) {
this.smsState = smsState;
}
/**
* 短信类别
* @return
*/
public int getBizType() {
return bizType;
}
/**
* 短信类别
* @param bizType
*/
public void setBizType(int bizType) {
this.bizType = bizType;
}
/**
* 短信类别名字
* @return
*/
public String getBizName() {
return bizName;
}
/**
* 短信类别名字
* @param bizName
*/
public void setBizName(String bizName) {
this.bizName = bizName;
}
public int getSms_count() {
return sms_count;
}
public void setSms_count(int smsCount) {
sms_count = smsCount;
}
public String getSendName() {
return sendName;
}
public void setSendName(String sendName) {
this.sendName = sendName;
}
/**
* 获取字符长度
* @return
*/
public long getSms_length() {
if(sms_length != 0 && msgContent != ""){
this.sms_length=msgContent.length();
}
return sms_length;
}
/**
* 设置发送字符长度
* @param smsLength
*/
public void setSms_length(long smsLength) {
sms_length = smsLength;
}
/**
* 获得发送短信的用户名
*/
public String getUserName() {
return userName;
}
/**
* 设置发送短信的用户名
*/
public void setUserName(String userName) {
this.userName = userName;
}
}
这是我的Mapper.xml里面的配置
<select id="bathInsertMsgSmsInfo" parameterType="java.util.List">
insert into
msg_smsInfo
(smsId,receivePhone,sendPhone,msgContent,senderType,sendDate,smsType,aduitType,smsState,bizType,sms_count)
values
<foreach collection="msgs" item="item" index="index" separator=",">
(#{item.smsId,jdbcType=VARCHAR},seq_msg_smsInfo.nextval,#{item.receivePhone,jdbcType=VARCHAR},#{item.sendPhone,jdbcType=VARCHAR},
#{item.msgContent,jdbcType=VARCHAR},#{item.senderType,jdbcType=INTEGER},#{item.sendDate,jdbcType=DATE},
#{item.smsType,jdbcType=INTEGER},#{item.aduitType,jdbcType=INTEGER},#{item.smsState,jdbcType=INTEGER},
#{item.bizType,jdbcType=INTEGER},#{item.sms_count,jdbcType=INTEGER})
</foreach>
</select>
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import com.cweb.iot.entity.MsgSmsInfo;
import com.cweb.iot.service.MsgSmsInfoService;
import com.cweb.iot.service.impl.MsgSmsInfoServiceImpl;
import com.cweb.iot.util.BeanLocator;
public class bathSaveMsgTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<MsgSmsInfo> msgs=new ArrayList<MsgSmsInfo>();
MsgSmsInfo msg = null;
for (int i = 0; i < 6; i++) {
msg=new MsgSmsInfo();
msg.setSendPhone("13912345568");
msg.setReceivePhone("18634567827");
msg.setMsgContent("您好!我是西部电子公司!"+i);
Timestamp t=new Timestamp(System.currentTimeMillis());
msg.setSendDate(t);
msg.setSenderType(14);
msg.setSmsState(1);
msg.setSmsType(3);
msg.setBizType(23);
msg.setSms_count(10);
msgs.add(msg);
}
MsgSmsInfoService ms = (MsgSmsInfoServiceImpl)BeanLocator.getBean("msgSmsInfoService");
try {
ms.bathSaveMeg(msgs);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
异常信息:
log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).
log4j:WARN Please initialize the log4j system properly.
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.mapping.SqlMapperException: The expression 'msgs' evaluated to a null value.
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:358)
at $Proxy0.selectOne(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:155)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:75)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:25)
at $Proxy7.bathInsertMsgSmsInfo(Unknown Source)
at com.cweb.iot.service.impl.MsgSmsInfoServiceImpl.bathSaveMeg(MsgSmsInfoServiceImpl.java:75)
at com.cweb.iot.test.service.bathSaveMsgTest.main(bathSaveMsgTest.java:42)
Caused by: org.apache.ibatis.mapping.SqlMapperException: The expression 'msgs' evaluated to a null value.
at org.apache.ibatis.builder.xml.dynamic.ExpressionEvaluator.evaluateIterable(ExpressionEvaluator.java:30)
at org.apache.ibatis.builder.xml.dynamic.ForEachSqlNode.apply(ForEachSqlNode.java:36)
at org.apache.ibatis.builder.xml.dynamic.MixedSqlNode.apply(MixedSqlNode.java:14)
at org.apache.ibatis.builder.xml.dynamic.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:22)
at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:198)
at org.apache.ibatis.executor.BaseExecutor.createCacheKey(BaseExecutor.java:142)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:112)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:72)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:79)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:73)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:350)
... 7 more
我在网上找了一个上午
有人说这样可以解决:
{
解决了,放到map里就好了,不知道为什么
Map<String, Object> paraMap = new HashMap<String, Object>();
}
但是我试过了,测试类却报出org.apache.ibatis.mapping.SqlMapperException:这个异常
这个难题,真不知道如何解决???
哪位高手有办法解决啊,小弟在这里谢谢各位了????
相关推荐
MyBatis Plus 批量数据插入功能,yyds
既已说到spring cloud alibaba,那对于整个微服务架构,如果想要进一步地向上提升自己,到底应该掌握哪些核心技能呢?就个人而言,对于整个微服务架构,像RPC、Dubbo、Spring Boot、Spring Cloud Alibaba、Docker、kubernetes、Spring Cloud Netflix、Service Mesh等这些都是最最核心的知识,架构师必经之路!下图,是自绘的微服务架构路线体系大纲,如果有还不知道自己该掌握些啥技术的朋友,可根据小编手绘的大纲进行一个参考。
Mybatis+Oracle批量插入方法总结
最近因为处理Oracle 12c GBK字符集情况下特殊符号(如Ø等)的问题,无法使用mabatisPlus的saveBatch方法,需要在mapper.xml中手写方法,又受框架所限,有些语法不支持,耗费了几天时间,最终通过下面地第一种方式实现,特在此总结一下。
【雷达信号处理】数字下变频(DDC)(Matlab代码实现)
内容概要:本文介绍了基于MATLAB的雷达信号处理中数字下变频(DDC)技术的实现方法,重点阐述了DDC在雷达接收机前端信号处理中的关键作用。通过将高频回波信号下变频至基带,便于后续进行数字化处理与目标信息提取。文中提供了完整的MATLAB代码实现,涵盖混频、低通滤波、抽取等核心步骤,帮助读者理解DDC的工作原理与工程实现细节。; 适合人群:具备一定信号与系统、数字信号处理基础知识,从事雷达、通信或电子工程相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于教学演示,加深对数字下变频原理的理解;②作为雷达或通信系统仿真项目的基础模块;③辅助科研人员快速搭建信号处理链路,进行算法验证与性能分析。; 阅读建议:建议结合数字信号处理教材中的混频、奈奎斯特采样及多速率信号处理理论进行学习,动手运行并调试代码,尝试调整参数(如本振频率、滤波器阶数、抽取因子)以观察对输出信号的影响,从而深入掌握DDC的设计要点与实际应用。
福建省福州新区矢量面数据-02坐标-geojson格式.json
福州新区区划面数据,geojson格式,02坐标
量化数据笔记第2篇:外盘期货历史高频tick数据涵盖主流交易所的活跃合约,以逐笔成交记录为主 字段通常包含品种代码、交易所、日期、精确到毫秒的时间戳、成交价格、成交量、持仓量变化,以及盘口买卖一档挂单
量化数据笔记第2篇:外盘期货历史高频tick数据涵盖主流交易所的活跃合约,以逐笔成交记录为主。字段通常包含品种代码、交易所、日期、精确到毫秒的时间戳、成交价格、成交量、持仓量变化,以及盘口买卖一档挂单价与挂单量。数据保留了原始行情序列,反映微观价格变动与流动性瞬时变化。 数据源:CMES金融数据库


