Mybatis为什么会从数据库读取出NULL来

渴望死亡的小丑 2016-05-16 12:22:47
数据库用
SELECT * FROM verycd.bbs_ip where addr='浙江省';
语句查询是没问题的
结果如下
8502 36.16.64.0 36.16.127.255 浙江省 电信
8507 36.17.0.0 36.17.63.255 浙江省 电信
8512 36.17.192.0 36.18.127.255 浙江省 电信
8518 36.19.32.0 36.19.127.255 浙江省 电信
8520 36.19.192.0 36.21.255.255 浙江省 电信
8551 36.22.128.0 36.22.255.255 浙江省 电信
Mybatis测试的时候明明用的是一样的语句,但是中间的两个IP却给我返回了NULL,这是什么原理
USERMAPPER.XML
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 为这个mapper指定一个唯一的namespace,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的
例如namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(userMapper.xml文件去除后缀)
-->
<mapper namespace="mapping.userMapper">
<!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getUser,id属性值必须是唯一的,不能够重复
使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型
resultType="me.gacl.domain.User"就表示将查询结果封装成一个User类的对象返回
User类就是users表所对应的实体类
-->
<!--
根据id查询得到一个user对象
-->
<select id="getUser"
resultType="crawlergzd.Ip">
select * from bbs_ip where addr='浙江省';
</select>
</mapper>

输出的结果是这样的
247688nullnull移动浙江省
247690nullnull移动浙江省
248016nullnull移动浙江省
248031nullnull移动浙江省
248039nullnull移动浙江省
248043nullnull移动浙江省
248044nullnull移动IDC机房浙江省
248045nullnull移动浙江省
249368nullnull广电网浙江省
384433nullnull联通浙江省
384435nullnull联通浙江省
384437nullnull联通浙江省
384440nullnull联通浙江省
384455nullnull联通浙江省
384460nullnull联通浙江省
391586nullnull联通浙江省

真的很奇怪啊,为什么有的值正常输出了,但是有两个却返回了NULL?
...全文
863 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
IP.java
package crawlergzd;

public class Ip {
    private Integer id;

    private String ipStart;

    private String ipEnd;

    private String operator;

    private String addr;
    
    public String toString(){
    	return id+ipStart+ipEnd+operator+addr;
    }
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getIpStart() {
        return ipStart;
    }

    public void setIpStart(String ipStart) {
        this.ipStart = ipStart == null ? null : ipStart.trim();
    }

    public String getIpEnd() {
        return ipEnd;
    }

    public void setIpEnd(String ipEnd) {
        this.ipEnd = ipEnd == null ? null : ipEnd.trim();
    }

    public String getOperator() {
        return operator;
    }

    public void setOperator(String operator) {
        this.operator = operator == null ? null : operator.trim();
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr == null ? null : addr.trim();
    }
}
Ipexert.java
package crawlergzd;

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.LinkedList;
import java.util.List;

import crawlergzd.Ip;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class Ipexert {

    public static void main(String[] args) throws IOException {
        //mybatis的配置文件
        String resource = "conf.xml";
        //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
        InputStream is = Ipexert.class.getClassLoader().getResourceAsStream(resource);
        //构建sqlSession的工厂
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
        //使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)
        //Reader reader = Resources.getResourceAsReader(resource); 
        //构建sqlSession的工厂
        //SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //创建能执行映射文件中sql的sqlSession
        SqlSession session = sessionFactory.openSession();
        /**
         * 映射sql的标识字符串,
         * me.gacl.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,
         * getUser是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
         */
        String statement = "mapping.userMapper.getUser";//映射sql的标识字符串
        //执行查询返回一个唯一user对象的sql
        //Ip user = session.selectOne(statement, 1);
        List<Ip> ips=session.selectList(statement);
        for(int i=0;i<ips.size();i++){
        System.out.println(ips.get(i).toString());
        }
        //System.out.println(user);
    }
}
范海辛o 2016-05-16
  • 打赏
  • 举报
回复
引用 4 楼 aaaawwwwssssdsaw 的回复:
[quote=引用 3 楼 jingconner 的回复:] 你把 USERMAPPER.XML 换成这样试试.
<mapper namespace="mapping.userMapper">
	  <resultMap type="crawlergzd.Ip" id="IpResult">
	  	<id column="ID" javaType="INTEGER" property="id" />
	  	<result column="IPSTART" javaType="VARCHAR" property="ipStart" />
	  	<result column="IPEND" javaType="VARCHAR" property="ipEnd" />
	  	<result column="OPERATOR" javaType="VARCHAR" property="operator" />
	  	<result column="ADDR" javaType="VARCHAR" property="addr" />
	  </resultMap>
	  
	  <select id="getUser" 
	         resultType="IpResult">
	         select * from bbs_ip where addr='浙江省';
	  </select>
  </mapper>
引用 3 楼 jingconner 的回复:
你把 USERMAPPER.XML 换成这样试试.
<mapper namespace="mapping.userMapper">
	  <resultMap type="crawlergzd.Ip" id="IpResult">
	  	<id column="ID" javaType="INTEGER" property="id" />
	  	<result column="IPSTART" javaType="VARCHAR" property="ipStart" />
	  	<result column="IPEND" javaType="VARCHAR" property="ipEnd" />
	  	<result column="OPERATOR" javaType="VARCHAR" property="operator" />
	  	<result column="ADDR" javaType="VARCHAR" property="addr" />
	  </resultMap>
	  
	  <select id="getUser" 
	         resultType="IpResult">
	         select * from bbs_ip where addr='浙江省';
	  </select>
  </mapper>
感谢,把自动生成的result Map放上去之后问题解决了,新手刚接触Mybatis,问下为什么之前我那个写法会出现有几列数据能够获得但是有几列不能,是什么原理呢[/quote]使用 resultType返回类型时, 数据库字段和实体类的名称要一致, null 值的地方列名和实体类定义的名称你检查一下是不是一样的?
  • 打赏
  • 举报
回复
引用 3 楼 jingconner 的回复:
你把 USERMAPPER.XML 换成这样试试.
<mapper namespace="mapping.userMapper">
	  <resultMap type="crawlergzd.Ip" id="IpResult">
	  	<id column="ID" javaType="INTEGER" property="id" />
	  	<result column="IPSTART" javaType="VARCHAR" property="ipStart" />
	  	<result column="IPEND" javaType="VARCHAR" property="ipEnd" />
	  	<result column="OPERATOR" javaType="VARCHAR" property="operator" />
	  	<result column="ADDR" javaType="VARCHAR" property="addr" />
	  </resultMap>
	  
	  <select id="getUser" 
	         resultType="IpResult">
	         select * from bbs_ip where addr='浙江省';
	  </select>
  </mapper>
引用 3 楼 jingconner 的回复:
你把 USERMAPPER.XML 换成这样试试.
<mapper namespace="mapping.userMapper">
	  <resultMap type="crawlergzd.Ip" id="IpResult">
	  	<id column="ID" javaType="INTEGER" property="id" />
	  	<result column="IPSTART" javaType="VARCHAR" property="ipStart" />
	  	<result column="IPEND" javaType="VARCHAR" property="ipEnd" />
	  	<result column="OPERATOR" javaType="VARCHAR" property="operator" />
	  	<result column="ADDR" javaType="VARCHAR" property="addr" />
	  </resultMap>
	  
	  <select id="getUser" 
	         resultType="IpResult">
	         select * from bbs_ip where addr='浙江省';
	  </select>
  </mapper>
感谢,把自动生成的result Map放上去之后问题解决了,新手刚接触Mybatis,问下为什么之前我那个写法会出现有几列数据能够获得但是有几列不能,是什么原理呢
范海辛o 2016-05-16
  • 打赏
  • 举报
回复
你把 USERMAPPER.XML 换成这样试试.
<mapper namespace="mapping.userMapper">
	  <resultMap type="crawlergzd.Ip" id="IpResult">
	  	<id column="ID" javaType="INTEGER" property="id" />
	  	<result column="IPSTART" javaType="VARCHAR" property="ipStart" />
	  	<result column="IPEND" javaType="VARCHAR" property="ipEnd" />
	  	<result column="OPERATOR" javaType="VARCHAR" property="operator" />
	  	<result column="ADDR" javaType="VARCHAR" property="addr" />
	  </resultMap>
	  
	  <select id="getUser" 
	         resultType="IpResult">
	         select * from bbs_ip where addr='浙江省';
	  </select>
  </mapper>
卖水果的net 2016-05-16
  • 打赏
  • 举报
回复
mapper文件也贴上来。 应该是定义resultmap时,少了两列,或定义有误。

67,550

社区成员

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

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