mybatis3通过provider注解结合动态sql实现增删改查

大家都知道,传统的mybatis实现数据库的增删改查都是依赖xml写sql语句,外层的mapper接口暴露出来调用,xml实现接口,然后通过调用接口操作数据库。虽然目的实现了,但是有一点麻烦的是,数据库增加一张表,就要对应增加一套mappe接口和xml文件,如果数据库表比较多的话,对应的文件就会很多,那这就很麻烦。所以我一直在想有没有方法可以不用写那些复杂的sql就可以实现对数据库的操作呢?带着这个疑问,我摸索好多天,查了好多资料,最后得到了答案:mybatis3以上提供了**provider注解,合理利用这些注解就可以不用sql啦。下面回归正题:

        mybatis3提供了4个**provider注解,分别对应增删改查,分别是:InsertProvider、DeleteProvider、UpdateProvider、SelectProvider;如何使用这些注解呢?

       1.这些注解都有统一的2个入参,一个是type,一个是method。type参数的值是你动态sql的类(A)class文件,method是类(A)中的方法名。当然,这些方法都是动态sql,至于动态sql怎么实现,这就可以发挥你的java基础能力,我是结合了自定义注解和java反射基础知识实现了动态sql。下面结合代码讲解一下实现过程。

       2.首先你需要定义一个接口类,这个类提供各种各样的增删改查方法。

mybatis3通过provider注解结合动态sql实现增删改查_第1张图片

  其中的BaseSqlProvider就是我动态的sql实现类,MapperSqlMethod是我的一个常量类。save方法的userinfo是我参数类。save顾名思义就是保存一条数据;同理,deleteById就是根据ID删除一条数据;其中参数UserInfo定义如下

mybatis3通过provider注解结合动态sql实现增删改查_第2张图片

接下来看看我的的动态sql类:

mybatis3通过provider注解结合动态sql实现增删改查_第3张图片

mybatis3通过provider注解结合动态sql实现增删改查_第4张图片
这里我使用了注解,结合反射实现了参数的获取。其中save的的入参位object,这里对应接口中save方法的实参:userInfo;然后通过SQL类实现sql的动态拼接;

3.接口有了,动态sql实现类有了,接下来就是通过provider注解的参数将两者结合起来。type传这个动态sql的class文件,method传保存数据的动态sql方法名,为了代码规范,定义一个常量类,值为动态sql的方法名:

mybatis3通过provider注解结合动态sql实现增删改查_第5张图片

然后接口引用常量类关联动态slq实现类的方法名;

4.最重要的一点:动态sql实现类必须提供无参的构造函数,且提供的sql语句方法必须是public的,返回值必须为string。为什么需要无参呢?有了解反射知识的同学很容易联想到,我们提供了类class文件和方法名,很明显,provider内部实现肯定是通过实例化对象,在调用方法,所以需要无参构造函数,然后也就解释了为什么需要public方法,这样才能调用的到啊。。。

5.只有一个参数或者无参可以这样实现,但要是需要多个参数呢,就不能这样实现。如下是多个参数的实现方式:

mybatis3通过provider注解结合动态sql实现增删改查_第6张图片

mybatis3通过provider注解结合动态sql实现增删改查_第7张图片

实参需要使用@param指定参数的key,形参用map接收,key对应实参的@param,为了规范化,最好使用常量类。

6.增,改,删返回的参数是int,成功执行几条。而查询返回的是实体类。

7.java基础设施有了,接下来就是配置xml文件了:
mybatis3通过provider注解结合动态sql实现增删改查_第8张图片

mybatis3通过provider注解结合动态sql实现增删改查_第9张图片

需要配置mybstis的configLocation参数,这个参数接收接口的扫描路径,所以在spring-mybatis配置接口的路径,然后configLocation引用spring-mybstis文件。

8.按照上述步骤配置后,即可实现mybatis不依赖xml写sql文件操作数据库啦。。。

 

最后稍作总结一下:

由于时间关系,我只是简单的实现了数据库单表的操作,有兴趣的同学可以去拓展一下,比如:我们知道,hibernate也是通过注解实现数据库的单表操作,那我们可以思考下,有没有办法实现对多表的操作呢?答案是有的,那就是还是利用自定义注解,具体怎么实现留给读者自己拓展,后续有时间,我也会去研究这问题。

你可能感兴趣的:(mybatis)