`

Mybatis错误和知识总结

    博客分类:
  • java
阅读更多

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 [id=1  name=ert]

出现这种情况的原因就是 我把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中重复注册了映射文件,去掉重复的就可以了

  • 大小: 6.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics