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中重复注册了映射文件,去掉重复的就可以了