七、Mybatis之容易混淆的概念和常见问题解析

(一)Mybatis之容易混淆的概念

1、resultMap和resultType:当配置resultType时,就不需要配置resultMap,看似resultType方便,但是会被受限制,没有resultMap开放多。
相同点:都是表示查询结果集的类型。
不同点:
resultMap需要手动配置映射关系,而resultType是直接指定java类型或者自定义的实体类型,查询结果集的列名必须和实体属性名称一致(实体类:名称大小写可以忽略;java类型,如Map集合的key大小写要一致,尽量都大小写规范,如果不放心可以select ID id,…)。
优缺点:
(1)resultType结果集列名要与java属性名一样,但是resultMap不受限制,因为resultMap有column来规定。
(2)由于SQL类型与Java中类型部分不匹配,resultMap可以通过typeHandler=”“来匹配(如:SQL中的0和1来表示java中的false和true;Date类型的转换),但是resultType无能为力。

2、parameterMap和patameterType:
表示传入参数的对应关系,前者不推荐使用,只是mybatis为了适应以前的版本。
提示:看到Map字眼的想到映射关系,看到Type字眼的想到类型。

3、#{}和${}:
相同点:都是用来作为占位符。
不同点:#{}在预编译的时候会呗替换为,而${}在预编译的时候直接将变量的值替换进去,而且没有单引号(所以还要加上“'${...}'”),故一般都是用前者,个别情况会使用后者:如需进行排序,且排序字段为参数时可以使用${}(order by后面不喜欢被预编译,所以使用${}更为恰当)。

4、#{}和ognl:
在#{}中如果是基本类型,其中的名称可以随便写(不推荐),但一般都用_parameter,因为值唯一,而ognl中必须写成_parameter的方式。

(二)Mybatis之常见问题解析

1、获取自增主键值:

 //解析:添加数据(在主外键的关系中)可以使用 useGeneratedKeys="true",可获取自增长的id,并配合keyProperty="id"(java中实体类的属性名)指定该对象的主键值。
 <insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="com.imooc.bean.Command"> 
     //sql语句
</insert> 

2、找不到namespace.id的异常原因:
异常为:Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for Command.queryCommandList
(1)在Configuration.xml没有配置;
(2)在1的配置中或selectList(“Message.queryMessageList”,message);中,名字写错。

3、排查SQL语法错误:如果控制台出现SQL语句问题,复制到SQL软件上执行,若有参数,手动写上并执行。

4、不要过度使用${}。

5、乱码问题:
(1)servlet传参时的编码:request.setCharacterEncoding(“utf-8”);或直接使用过滤器;
(2) Java文件本身的编码;
(3)连接数据库的参数中,设定编码方式:jdbc:mysql://192.168.1.1:3306/cms?characterEncoding=utf-8
(4)数据库、表的编码;
(5) 展示页面的编码:<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
(6)浏览器编码问题等。
(7)tomcat编码未设置为“utf-8”

6、执行“增删改”没有报错,却没有生效
Mybatis只有查询是自动提交事务,其他都需要手动提交事务:

    sqlSession.commit();

猜你喜欢

转载自blog.csdn.net/panchang199266/article/details/80267763