mybatis3通过provider注解结合动态sql实现增删改查,不再依赖xml成为可能
2017-09-24 13:58
756 查看
大家都知道,传统的mybatis实现数据库的增删改查都是依赖xml写sql语句,外层的mapper接口暴露出来调用,xml实现接口,然后通过调用接口操作数据库。虽然目的实现了,但是有一点麻烦的是,数据库增加一张表,就要对应增加一套mappe接口和xml文件,如果数据库表比较多的话,对应的文件就会很多,那这就很麻烦。所以我一直在想有没有方法可以不用写那些复杂的sql就可以实现对数据库的操作呢?带着这个疑问,我摸索好多天,查了好多资料,最后得到了答案:mybatis3以上提供了**provid
4000
er注解,合理利用这些注解就可以不用sql啦。下面回归正题:
mybatis3提供了4个**provider注解,分别对应增删改查,分别是:InsertProvider、DeleteProvider、UpdateProvider、SelectProvider;如何使用这些注解呢?
1.这些注解都有统一的2个入参,一个是type,一个是method。type参数的值是你动态sql的类(A)class文件,method是类(A)中的方法名。当然,这些方法都是动态sql,至于动态sql怎么实现,这就可以发挥你的java基础能力,我是结合了自定义注解和java反射基础知识实现了动态sql。下面结合代码讲解一下实现过程。
2.首先你需要定义一个接口类,这个类提供各种各样的增删改查方法。
其中的BaseSqlProvider就是我动态的sql实现类,MapperSqlMethod是我的一个常量类。save方法的userinfo是我参数类。save顾名思义就是保存一条数据;同理,deleteById就是根据ID删除一条数据;其中参数UserInfo定义如下
接下来看看我的的动态sql类:
这里我使用了注解,结合反射实现了参数的获取。其中save的的入参位object,这里对应接口中save方法的实参:userInfo;然后通过SQL类实现sql的动态拼接;
3.接口有了,动态sql实现类有了,接下来就是通过provider注解的参数将两者结合起来。type传这个动态sql的class文件,method传保存数据的动态sql方法名,为了代码规范,定义一个常量类,值为动态sql的方法名:
然后接口引用常量类关联动态slq实现类的方法名;
4.最重要的一点:动态sql实现类必须提供无参的构造函数,且提供的sql语句方法必须是public的,返回值必须为string。为什么需要无参呢?有了解反射知识的同学很容易联想到,我们提供了类class文件和方法名,很明显,provider内部实现肯定是通过实例化对象,在调用方法,所以需要无参构造函数,然后也就解释了为什么需要public方法,这样才能调用的到啊。。。
5.只有一个参数或者无参可以这样实现,但要是需要多个参数呢,就不能这样实现。如下是多个参数的实现方式:
实参需要使用@param指定参数的key,形参用map接收,key对应实参的@param,为了规范化,最好使用常量类。
6.增,改,删返回的参数是int,成功执行几条。而查询返回的是实体类。
7.java基础设施有了,接下来就是配置xml文件了:
需要配置mybstis的configLocation参数,这个参数接收接口的扫描路径,所以在spring-mybatis配置接口的路径,然后configLocation引用spring-mybstis文件。
8.按照上述步骤配置后,即可实现mybatis不依赖xml写sql文件操作数据库啦。。。
最后稍作总结一下:
由于时间关系,我只是简单的实现了数据库单表的操作,有兴趣的同学可以去拓展一下,比如:我们知道,hibernate也是通过注解实现数据库的单表操作,那我们可以思考下,有没有办法实现对多表的操作呢?答案是有的,那就是还是利用自定义注解,具体怎么实现留给读者自己拓展,后续有时间,我也会去研究这问题。
4000
er注解,合理利用这些注解就可以不用sql啦。下面回归正题:
mybatis3提供了4个**provider注解,分别对应增删改查,分别是:InsertProvider、DeleteProvider、UpdateProvider、SelectProvider;如何使用这些注解呢?
1.这些注解都有统一的2个入参,一个是type,一个是method。type参数的值是你动态sql的类(A)class文件,method是类(A)中的方法名。当然,这些方法都是动态sql,至于动态sql怎么实现,这就可以发挥你的java基础能力,我是结合了自定义注解和java反射基础知识实现了动态sql。下面结合代码讲解一下实现过程。
2.首先你需要定义一个接口类,这个类提供各种各样的增删改查方法。
其中的BaseSqlProvider就是我动态的sql实现类,MapperSqlMethod是我的一个常量类。save方法的userinfo是我参数类。save顾名思义就是保存一条数据;同理,deleteById就是根据ID删除一条数据;其中参数UserInfo定义如下
接下来看看我的的动态sql类:
这里我使用了注解,结合反射实现了参数的获取。其中save的的入参位object,这里对应接口中save方法的实参:userInfo;然后通过SQL类实现sql的动态拼接;
3.接口有了,动态sql实现类有了,接下来就是通过provider注解的参数将两者结合起来。type传这个动态sql的class文件,method传保存数据的动态sql方法名,为了代码规范,定义一个常量类,值为动态sql的方法名:
然后接口引用常量类关联动态slq实现类的方法名;
4.最重要的一点:动态sql实现类必须提供无参的构造函数,且提供的sql语句方法必须是public的,返回值必须为string。为什么需要无参呢?有了解反射知识的同学很容易联想到,我们提供了类class文件和方法名,很明显,provider内部实现肯定是通过实例化对象,在调用方法,所以需要无参构造函数,然后也就解释了为什么需要public方法,这样才能调用的到啊。。。
5.只有一个参数或者无参可以这样实现,但要是需要多个参数呢,就不能这样实现。如下是多个参数的实现方式:
实参需要使用@param指定参数的key,形参用map接收,key对应实参的@param,为了规范化,最好使用常量类。
6.增,改,删返回的参数是int,成功执行几条。而查询返回的是实体类。
7.java基础设施有了,接下来就是配置xml文件了:
需要配置mybstis的configLocation参数,这个参数接收接口的扫描路径,所以在spring-mybatis配置接口的路径,然后configLocation引用spring-mybstis文件。
8.按照上述步骤配置后,即可实现mybatis不依赖xml写sql文件操作数据库啦。。。
最后稍作总结一下:
由于时间关系,我只是简单的实现了数据库单表的操作,有兴趣的同学可以去拓展一下,比如:我们知道,hibernate也是通过注解实现数据库的单表操作,那我们可以思考下,有没有办法实现对多表的操作呢?答案是有的,那就是还是利用自定义注解,具体怎么实现留给读者自己拓展,后续有时间,我也会去研究这问题。
相关文章推荐
- SpringBoot入门-21(springboot集成mybatis注解形式增删查改properties配置,利用@Provider实现动态SQL)
- SpringBoot入门-19(springboot集成mybatis注解形式增删查改properties配置,利用《script》实现动态SQL)
- mybatis04(注解实现一对一动态sql 的增删改查)
- SpringBoot入门-20(springboot集成mybatis注解形式properties配置,利用@Provider实现动态SQL)
- JAVAWEB开发之mybatis详解(一)——mybatis的入门(实现增删改查操作)、自定义别名、抽取代码块以及动态SQL的使用
- mybatis注解实现动态sql
- mybatis03(配置文件实现一对一动态sql 的增删改查)
- mybatis使用注解替代xml配置,动态生成Sql
- MyBatis mapper 注解过程中通过 LanguageDriver 实现动态 SQL
- JAVAWEB开发之mybatis详解(一)——mybatis的入门(实现增删改查操作)、自定义别名、抽取代码块以及动态SQL的使用
- Intellij Mybatis连接Mysql数据库,并且实现动态sql,增删改查等
- 怎么编写mybatis.xml文件,实现sql增删改查
- mybatis实现增删改查xml配置和后端Java编程完整教程
- 自己动手实现mybatis动态sql
- mybatis的xml文件l,动态sql编写语法
- oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert
- MyBatis中的动态SQL,实现不确定条件的CRUD-----使用Map来传递查询的参数
- 由浅入深分析mybatis通过动态代理实现拦截器(插件)的原理
- 由浅入深分析mybatis通过动态代理实现拦截器(插件)的原理
- SSM框架day02-MyBatis——066——动态SQL查询、067 MyBatis注解-动态SQL增删改、068 MyBatis注解-动态SQL的SQL类