chenjiali 发表于 2016-11-25 09:15:38

Mybatis错误和知识总结

  1.功能正常,但是读出来的数据是null
  原因: Mapper.xml中的select语句写错,或者查错了表
  比如我要查的表时student
  结果我的sql语句是 select * from teacher where id=#{id};
  2.报错invalid types () or values ()解决方法 
  原因:
  1) Bean函数中的get/set方法与成员变量不一。
  2) 构造函数被重载过,但是没有空的构造函数。
  3) 最好不要使用简单类型,如int, long等,改用对象模式Integer, Long等。在写条件查询时会用到判断<if xxx !  = null > … </if>的
  根据网上的解答,我发现自己犯了第二条错误, 构造函数被重载过,但是没有空的构造函数。
  那么为什么会这样呢?
  因为mybatis执行sql语句后,会根据反射机制返回一个对象,反射默认是根据空构造函数来构造一个对象的,如果重载了有参数的构造函数,那么缺省空构造函数就没有了,就报错
  3. Mapped Statements collection does not contain value for : 
错误原因有几种: 
3.1、mapper.xml中没有加入namespace 
3.2、mapper.xml中的方法和接口mapper的方法不对应 
3.3、mapper.xml没有加入到mybatis-config.xml中(即总的配置文件),例外:配置了mapper文件的包路径的除外 
3.4、mapper.xml文件名和所写的mapper名称不相同。
  4.查询一个数据用selectOne,查询一堆数据用selectList
  5.用接口和注解的方式,不用写映射文件,但是还是要注册!!!
  6.一对一关联表查询的时候,出现了
  Could not set property 'teacher' of 'class s1.Classes' with value 'teacher
  出现这种情况的原因就是 我把Classes类中的teacher定义成了int类型
  错误:    private int id;                  正确  private int id;  
           private String name;                 private String name;
           private int teacher;                   private Teacher teacher;
  7.一对一关联表查询的时候,一定要在数据库中先关联表!!!
    代码示例: 
  ALTER TABLE class ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(t_id);
  8.为mybatis配置log4j.properties的方法:
  只要在src目录下创建一个log4j.properties文件,然后设置好代码就好了,非常简单,目录结构如下图
  

 
  9.log4j.properties文件的配置代码:

log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
  10. mybatis中,一个session对应一个数据库会话,
  在SqlSessionFactory.openSession(true)  //true表示自动提交,false表示关闭自动提交
  所以session有 session.commit()
  session.close()
  session.rollback()
  11.在一次简单查询中,根据日志记录,发现能查到数据,但是myeclipse中显示的结果是null
  后来找了很多资料才发现,实体类的属性名和数据库中字段名不对应,需要告诉编译器
  有2种方式: 
  第一种:
  //注意 顺序很重要,先写字段名,再写属性名, 下面例子中,order_id是表的字段名,id是实体类的属性名
  select order_id id,order_name name,order_price from student where order_id=#{id} 
  第二种:
  方法2: 
 
 <select id="getAllStudent" resultMap="s1.Student">    //将resultType改成resultMap
         select * from student
     </select>
 
  <resultMap type="order" id="getOrderMap">
          <id property="id" column="order_id"  />           //主键用id标示
         <result  property="name" column="order_name"  />    //一般字段用result
         <result  property="price" column="order_price"  /> 
     </resultMap>
  12.mybatis中Mapper.xml中namespace的作用:外部调用需要知道它的namespace,根据namespace找到对应的Mapper.xml,再根据MybatisConfig.xml(Mybatis全局配置文件),找到Mapper的路径,读取其中的内容
  13.报错内容:Type interface s1.MyMapper is already known to the MapperRegistry.
  就是congfi.xml中重复注册了映射文件,去掉重复的就可以了
页: [1]
查看完整版本: Mybatis错误和知识总结