利用myBATIS框架,批量插入数据,测试总是跳出The expression 'msgs' evaluated to a null value异常.

u011013470 2013-06-09 01:36:49
这是我的实体类
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:这个异常

这个难题,真不知道如何解决???



哪位高手有办法解决啊,小弟在这里谢谢各位了????
...全文
4908 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuhouqingchen_2648 2014-08-19
  • 打赏
  • 举报
回复
引用 3 楼 zhangjian_xue 的回复:
collection="msgs" msgs 改成 list 就可以了, mybatis中collection的值不代表你传入参数的名字而是一种类型, 官方文档里给出了list和array两种方式
正解,如果paramterType为list或者array,那么mybatis会自动将list结构转换为map结构,其中Map的key为list或者array,value为你这里的msgs或者其他,使用时#{list}
mylaughing 2014-01-16
  • 打赏
  • 举报
回复
楼主是用的什么数据库呢。mysql?
gaofuqi 2013-06-15
  • 打赏
  • 举报
回复
如果是数据库是oracle则改成下面的试试。

<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="list" item="item" separator="union all"> 
select (#{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}) from dual 
 </foreach>
</select>


meisei81 2013-06-14
  • 打赏
  • 举报
回复
改成#3楼说的试试看。
zhangjian_xue 2013-06-14
  • 打赏
  • 举报
回复
collection="msgs" msgs 改成 list 就可以了, mybatis中collection的值不代表你传入参数的名字而是一种类型, 官方文档里给出了list和array两种方式
chujingbin 2013-06-09
  • 打赏
  • 举报
回复
xml为什么是<select>标签,而不是<insert>标签? 另外这样写不对吧: MsgSmsInfo msg = null; for (int i = 0; i < 6; i++) { msg=new MsgSmsInfo(); msgs.add(msg); } 应该是 for (int i = 0; i < 6; i++) { MsgSmsInfo msg=new MsgSmsInfo(); msgs.add(msg); }
tony4geek 2013-06-09
  • 打赏
  • 举报
回复
type 定义成实体可以不?

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧