前言
这段时间项目中需要写一些api,我负责其中的几个,也是第一次真正意义上的使用mybatis,所以我认为有必要作一个总结来反映我学习的成果。
首先我们应该都知道,mybatis的sql语句要么是写在xml文件中,要么直接使用@select
注解在mapper类中写。但我个人偏向于写在xml文件中,因为有时候sql语句比较长、比较复杂,直接用注解的话可能一眼看过去并不知道是实现了什么功能,相反xml文件中使用特有的标签能帮助我们理解语句完成的功能。
1. 动态sql
mybatis写动态sql真的非常非常方便简洁了,好用到想为它疯狂打call!!!
例如有三个可选的条件,那么sql语句可以这么写:
SELECT
A.authorName,A.country,B.bookName
FROM author AS A
LEFT OUTER JOIN book AS B ON (A.author_id = B.author_id AND A.book_id = B.book_id)
<where>
<if test="authorName!=null"></if>
A.author_name = #{authorName}
<if test="bookName!=null">
AND B.bookName = #{bookName}
</if>
<if test="publicTime!=null">
AND B.public_time = #{publicTime}
</if>
</where>
GROUP BY A.authorName
在这个例子中,需要使用到几个知识点:
a.表与表的连接
b.动态条件判断语句的使用
c.<if>
元素中,如果包括变量,不需要写成#{varName}的形式,而是直接写它的变量名就可以了。(我就是在这个地方吃了亏的,调试很久才发现,希望看到的读者不要踩这个雷。)
2. 多张表连接的写法
SELECT A.id,A.app_id,A.app_name,B.menu ,C.author_name
FROM user_collection_app AS A
LEFT OUTER JOIN app AS B ON A.app_id = B.app_id
LEFT OUTER JOIN auth_user AS C ON B.author_id = C.author_id
WHERE A.user_id = #{userId} GROUP BY A.app_id
3. 可以定义一个公共的接口实现基本的增删改查
如果经常需要使用基本的增删改查方法,为了减少每次书写语句的工作量,可以定义一个通用接口,让其他的接口去继承它,那么每次要使用的时候,就能直接去调用了,这可以节约不少时间跟精力。
例如:
public interface MyService<T> {
void save(T model);//持久化
void save(List<T