微服务开发的入门级框架Spring Boot详解(五)
2018-01-14 14:11
906 查看
通过第四章的介绍,大家可能更能理解使用SpringBoot开发是多么爽并且快捷的了。
比如使用SSM框架开发写一个HelloWord,会经过以下几个步骤:
写POM文件,下载依赖包。
配置Spring MVC,视图解析器等
配置Spring,开启注解扫描器等(发现配置了一大堆,还没开始写真正的业务逻辑)
写Controller,实现HellWord
配置容器
应用打WAR包
放到容器里跑
以上步骤甚是繁琐,而使用Spring Boot呢?你只需以下几步就可以实现:
写POM文件,下载依赖包。
写Controller,实现HellWord
启动程序
对比后,我来说今天真正的主题,如何使用注解写动态SQL
@Select
@Update
@Delete
@Insert
而是对应 以下四个注解:
@SelectProvider
@UpdateProvider
@DeleteProvider
@InsertProvider
注解没有太多可解释的,说一下里面都写的啥吧!代码例子如下 :
type:声明类。method:声明方法。
那么声明的是什么类?什么方法呢?往下看!
以上这个叫Userdao的内部类的类名就是上一节Type对应的值,上节method中的方法就是次内部类中要调用的方法。
解释一下方法中参数和代码的含义:
方法中传入的参数就是从Service层传来的参数(可以理解为你要查询的全部条件)。
定义的String对象写的字符串内容是你SQL公用的部分(其实就是拼接SQL语句的字符串)。
if判断你的哪些条件为空,然后拼接成你想要的语句。
最后把拼接好的字符串return回去 。
这就是第一种实现方式,贴一个完整代码:
注意:@SelectProvide中type参数指定的Class类,必须要能够通过无参的构造函数来初始化。
@SelectProvide中method参数指定的方法,必须是public的,返回值必须为String,可以为static。
注意:方法的返回值也必须为String
selectPersonLike方法中的“SELECT”“FROM”“WHERE”等,均为方法!!!具体解释如下:
这篇文章个人感觉写的不是特别清楚,但我已经将全部代码贴出,只要照猫画虎就可以,如果有什么不懂的或者文章有什么错误,都欢迎在评论指出!!
比如使用SSM框架开发写一个HelloWord,会经过以下几个步骤:
写POM文件,下载依赖包。
配置Spring MVC,视图解析器等
配置Spring,开启注解扫描器等(发现配置了一大堆,还没开始写真正的业务逻辑)
写Controller,实现HellWord
配置容器
应用打WAR包
放到容器里跑
以上步骤甚是繁琐,而使用Spring Boot呢?你只需以下几步就可以实现:
写POM文件,下载依赖包。
写Controller,实现HellWord
启动程序
对比后,我来说今天真正的主题,如何使用注解写动态SQL
1、动态SQL注解详解
写动态SQL使用的注解不再是:@Select
@Update
@Delete
@Insert
而是对应 以下四个注解:
@SelectProvider
@UpdateProvider
@DeleteProvider
@InsertProvider
注解没有太多可解释的,说一下里面都写的啥吧!代码例子如下 :
@SelectProvider(type=Userdao.class,method="findUserByInput") public List<UserList> selectAllUser(String Department,String RealName,Integer StartNo);
type:声明类。method:声明方法。
那么声明的是什么类?什么方法呢?往下看!
2、动态SQL实现
其实使用注解实现动态SQL有三种方法,我只写两种个人比较喜欢的方式。(第三种也确实不太好)2.1、第一种方式(个人感觉就是拼接字符串,条件判断,然后返回拼接好的字符串)
在DAO层的接口中定义一个内部类,代码如下:package cn.yy.dao; @Mapper public interface UserDao { class Userdao{ public String findUserNumByInput(String Department,String RealName) { String sql="SELECT COUNT(*) from users"+"" ; if(Department != null && RealName != null){ sql += " where Department='"+Department+"' and RealName like '%"+RealName+"%';"; return sql; }else if( Department != null ){ sql += " where Department = '"+Department; return sql; } else if( RealName != null){ sql += " where RealName like '%"+RealName+"%'"; return sql; } return sql; } }
以上这个叫Userdao的内部类的类名就是上一节Type对应的值,上节method中的方法就是次内部类中要调用的方法。
解释一下方法中参数和代码的含义:
方法中传入的参数就是从Service层传来的参数(可以理解为你要查询的全部条件)。
定义的String对象写的字符串内容是你SQL公用的部分(其实就是拼接SQL语句的字符串)。
if判断你的哪些条件为空,然后拼接成你想要的语句。
最后把拼接好的字符串return回去 。
这就是第一种实现方式,贴一个完整代码:
package cn.yy.dao; @Mapper public interface UserDao { @SelectProvider(type=Userdao.class,method="findUserNumByInput") public Integer selectUserNum(String Department,String RealName); class Userdao{ public String findUserNumByInput(String Department,String RealName) { String sql="SELECT COUNT(*) from users"+"" ; if(Department != null && RealName != null){ sql += " where Department='"+Department+"' and RealName like '%"+RealName+"%';"; return sql; }else if( Department != null ){ sql += " where Department = '"+Department; return sql; } else if( RealName != null){ sql += " where RealName like '%"+RealName+"%'"; return sql; } return sql; } }
注意:@SelectProvide中type参数指定的Class类,必须要能够通过无参的构造函数来初始化。
@SelectProvide中method参数指定的方法,必须是public的,返回值必须为String,可以为static。
2.2、 第二种方式(推荐)
MyBatis 3提供了方便的工具类。使用SQL类创建一个实例来调用方法生成SQL语句。比起第一种方式来说减少了重复的SQL字符串的拼接。完整代码如下:package cn.yy.dao; public class UserDao { @SelectProvider(type=Userdao .class,method="selectPersonLike") public List<Person> selectPerson(String id,String firstName,String lastName); clas Userdao{ public String selectPersonLike(final String id, final String firstName, final String lastName) { return new SQL() {{ SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME"); FROM("PERSON P"); if (id != null) { WHERE("P.ID like #{id}"); } if (firstName != null) { WHERE("P.FIRST_NAME like #{firstName}"); } if (lastName != null) { WHERE("P.LAST_NAME like #{lastName}"); } ORDER_BY("P.LAST_NAME"); }}.toString(); } } }
注意:方法的返回值也必须为String
selectPersonLike方法中的“SELECT”“FROM”“WHERE”等,均为方法!!!具体解释如下:
方法 | 描述 |
---|---|
SELECT(String) SELECT(String...) | 开始或插入到 SELECT子句。 可以被多次调用,参数也会添加到 SELECT子句。 参数通常使用逗号分隔的列名和别名列表,但也可以是数据库驱动程序接受的任意类型。 |
SELECT_DISTINCT(String) SELECT_DISTINCT(String...) | 开始或插入到 SELECT子句, 也可以插入 DISTINCT关键字到生成的查询语句中。 可以被多次调用,参数也会添加到 SELECT子句。 参数通常使用逗号分隔的列名和别名列表,但也可以是数据库驱动程序接受的任意类型。 |
FROM(String) FROM(String...) | 开始或插入到 FROM子句。 可以被多次调用,参数也会添加到 FROM子句。 参数通常是表名或别名,也可以是数据库驱动程序接受的任意类型。 |
JOIN(String) JOIN(String...) INNER_JOIN(String) INNER_JOIN(String...) LEFT_OUTER_JOIN(String) LEFT_OUTER_JOIN(String...) RIGHT_OUTER_JOIN(String) RIGHT_OUTER_JOIN(String...) | 基于调用的方法,添加新的合适类型的 JOIN子句。 参数可以包含由列命和join on条件组合成标准的join。 |
WHERE(String) WHERE(String...) | 插入新的 WHERE子句条件, 由AND链接。可以多次被调用,每次都由AND来链接新条件。使用 OR() 来分隔OR。 |
OR() | 使用OR来分隔当前的 WHERE子句条件。 可以被多次调用,但在一行中多次调用或生成不稳定的SQL。 |
AND() | 使用AND来分隔当前的 WHERE子句条件。 可以被多次调用,但在一行中多次调用或生成不稳定的SQL。因为 WHERE 和 HAVING 二者都会自动链接 AND, 这是非常罕见的方法,只是为了完整性才被使用。 |
GROUP_BY(String) GROUP_BY(String...) | 插入新的 GROUP BY子句元素,由逗号连接。 可以被多次调用,每次都由逗号连接新的条件。 |
HAVING(String) HAVING(String...) | 插入新的 HAVING子句条件。 由AND连接。可以被多次调用,每次都由AND来连接新的条件。使用 OR() 来分隔OR. |
ORDER_BY(String) ORDER_BY(String...) | 插入新的 ORDER BY子句元素, 由逗号连接。可以多次被调用,每次由逗号连接新的条件。 |
DELETE_FROM(String) | 开始一个delete语句并指定需要从哪个表删除的表名。通常它后面都会跟着WHERE语句! |
INSERT_INTO(String) | 开始一个insert语句并指定需要插入数据的表名。后面都会跟着一个或者多个VALUES() or INTO_COLUMNS() and INTO_VALUES()。 |
SET(String) SET(String...) | 针对update语句,插入到"set"列表中 |
UPDATE(String) | 开始一个update语句并指定需要更新的表明。后面都会跟着一个或者多个SET(),通常也会有一个WHERE()。 |
VALUES(String, String) | 插入到insert语句中。第一个参数是要插入的列名,第二个参数则是该列的值。 |
相关文章推荐
- 微服务开发的入门级框架Spring Boot详解(二)
- 微服务开发的入门级框架Spring Boot详解:集成Mybatis
- 微服务开发的入门级框架Spring Boot详解(四)
- 微服务开发的入门级框架Spring Boot详解:注解
- 微服务开发的入门级框架Spring Boot详解(四)
- 微服务开发的入门级框架Spring Boot详解:属性配置
- 微服务开发的入门级框架Spring Boot详解(三)
- 微服务开发的入门级框架Spring Boot详解(二)
- 微服务开发的入门级框架Spring Boot详解(三)
- 微服务开发的入门级框架Spring Boot详解(四)
- 微服务开发的入门级框架Spring Boot详解(三)
- 微服务开发的入门级框架Spring Boot详解(五)
- 微服务开发的入门级框架Spring Boot详解(二)
- 【项目搭建】使用spring-boot进行REST风格的微服务开发入门
- 微服务开发之Springboot入门
- Springboot微服务开发教程系列:开发入门