Mybatis 个人整理

2019-07-22  本文已影响0人  榷奕

1. 动态sql相关

(1)首先只有select和update这两个需要动态sql

删除的话自然不必说,根本就不涉及到元素的事情,直接删了就行。

insert是因为使用了动态sql和不使用效果是一样的。如果用了的话,最后简化出来的sql可能是
insert into table_name(xxxx,xxxx) values(xxxx,xxxx),
如果不使用动态sql简化,那写出来的就是
insert into table_name(xx,xx,xx,xx,xx) values(xx,xx,null,null,null),
而这两种最终插入到数据库里面的结果当然是一样的,往数据库里面插入的时候,如果没有传值自动赋值就是null。

这里还是漏了一点!

如果使用了动态sql判断插入的值是不是非空,
在values的括号里面做非空判断,如果为null的话,就可以把它变成空字符串插到数据库里面去,就避免了往数据库里面插入null值的问题。

(2)动态sql的用法

<if test=" "></if>
这个估计就没什么可写的了,略过去

另一个拼装的就是trim,这个其实跟<set>,<where>这些都是一样的,另外两个可能就是把这个封装了一下。

/*
这里面也就写四个配置,中间就是<if test="">表达式。
这四个配置都是只针对最前面或者最后面的两头进行配置的,中间的逗号或者and、or这些东西都是自己加的。、
有两个是在最前面和最后面加什么东西(where、set之类的),另两个是最前面或者最后面如果有就去掉什么东西(and逗号之类的)。
*/
<trim prefix="("  suffix=")" prefixOverrides="AND |OR " suffixOverrides=",">
  ...
</trim>

2. Mybatis的结果映射

Mapper里面写的配置虽然多,但最有用的估计也就是resultMap和resultType。

(1)避免输出null的问题

首先要对Mybatis查询的过程有一定的了解。
Mybatis运行sql语句然后得到,假设只搜到了一条记录,然后这条记录有column_name还有value值,Mybatis就把这些映射成map存起来,用column_name做key存成map。存的时候肯定有遍历过值的,value是null的就不存了,所以存进这个map里面的都是value不为null的。

有一个设置就是如果value是null也存进map

<setting name="callSettersOnNulls" value="true"></setting>

而我们给前端输出的值有null值,是因为String没有被初始化,对象赋初值就是null。

(2)ResultMap和ResultType

如果是非常简单的类和数据库表结构完全对应的情况(目前全是这种情况),这样的映射关系就是数据库的列名和类的属性名完全按照驼峰映射一一对应,只要设置开了驼峰,然后名字对上了,直接就ResultType就行了。
然后你写了ResultType之后,框架会自动帮你生成ResultMap,ResultMap里面理解的核心,每行都是数据库里面列名是什么,java类里面的属性名是什么。这个自动生成的ResultMap每一行写的那两个就是驼峰对应的那两个。

如果直接写ResultMap的话,
一对一和一对多,一对一是在一个对象里面封装了另一个对象,一对多是一个对象里面封装了另一个对象组成的list。
还有多表查询。
这三种情况基本上不太可能直接对应上去,多半都要上ResultMap。

至于把Map里面的在封装成association 、collection 这之类的暂时就别想吧,老实写简单的算了。

(3)自动映射

数据库的列名和java类的属性名能完成驼峰对应的,在ResultMap里面就可以不写,框架会帮你自动补上的。也就是ResultType会生成的那些,如果你没写的话,就会帮你补上。
所以只写那些名字实在不一样,或者里面封装了对象、队列这种的,没办法了才自己写。

上一篇下一篇

猜你喜欢

热点阅读