listQuery(QueryFilter queryFilter);
```
#3.18、生成GUID
通过snowflake算法生成18数字ID
···
/**
* 生成GUID
* @return GUID
*/
public String getGUID();
# 3.19、生成UUID
```
/**
* 生成UUID
* @return UUID
*/
public String getUUID();
```
# 4、SQL生成器
当遇到通用API无法完成的业务场景时,可通过SQL生成器生成通用SQL并结合手工编写业务SQL完成复杂SQL的编写,然后通过Spring-Jdbc执行SQL实现更高级的业务需求。通过Dao的getSqlGenerator()方法获取该Dao对应的SqlGenerator接口生成表相关的SQL。以下以UserDao(实体对象为User,对应的表为user)为示例分别说明SqlGenerator的相关方法。用户表定义如下
```
---------------------------------------------
字段名称 | 字段类型 | 字段说明
---------------------------------------------
user_id | varchar(20) | 用户ID,主键
---------------------------------------------
user_name | varchar(50) | 用户名
---------------------------------------------
pwd | varchar(50) | 密码
---------------------------------------------
create_date| datetime | 创建日期
---------------------------------------------
```
## 4.1、生成新增SQL
```
/**
* 生成新增SQL
*
* INSERT user (user_id,user_name,pwd,create_date) VALUES ( :userId,:userName,:pwd, :createDate)
*
*/
public String getInsertSql();
```
## 4.2、生成根据主键更新SQL
```
/**
* 生成更新SQL,单主键的表,使用主键来作为参数,联合主键则使用各自的column propertyName作为命名参数
*
*
* 单主键: UPDATE user SET (user_id = :userId,user_name = :username, pwd = :pwd, create_date = :creatDate ) WHERE user_id = :userId
* 联合主键: UPDATE user SET (user_id = :userId,user_name = :userName, pwd = :pwd, create_date = :createDate ) WHERE user_id = :userId AND user_name = :userName
*
*/
public String getUpdateByPkSql();
```
## 4.3、生成不带条件的更新SQL
```
/**
* 生成不带条件的更新SQL
*
* UPDATE user SET (user_id = :userId,user_name = :username, pwd = :pwd, create_date = :createDate )
*
*/
public String getUpdateSql();
```
## 4.4、生成逻辑删除SQL
```
/**
*
* 生成逻辑删除SQL,单主键的表,使用固定的"?"来作为参数,联合主键则使用各自的column propertyName作为命名参数
*
*
* 单主键: UPDATE user SET IS_ACTIEVE = 'N' WHERE user_id = ?
* 联合主键: UPDATE user SET IS_ACTIEVE = 'N' WHERE user_id = :userId AND user_name = :userName
*
*/
public String getLogicalDeleteByPkSql();
```
## 4.5、生成物理删除SQL
```
/**
*
* 生成删除SQL,单主键的表,使用固定的"?"来作为参数,联合主键则使用各自的column propertyName作为命名参数
*
*
* 单主键: DELETE FROM user WHERE user_id = ?
* 联合主键: DELETE FROM user WHERE user_id = :userId AND user_name = :userName
*
*/
public String getDeleteByPkSql();
```
## 4.6、生成根据主键查询SQL
```
/**
* 生成主键查询SQL,单主键的表,使用固定的"?"来作为参数,联合主键则使用各自的column propertyName作为命名参数
*
*
* 单主键: SELECT user_id,user_name,pwd,create_date FROM user WHERE user_id = ?
* 联合主键: SELECT user_id ,user_name,pwd,create_date FROM user WHERE user_id = :userId AND user_name = :userName
*
*/
public String getSelectByPkSql();
```
## 4.7、生成不带查询条件的查询SQL
```
/**
* 生成不带查询条件的查询SQL
*
* SELECT user_id ,user_name,pwd,create_date FROM user
*
*/
public String getSelectSql();
```
## 4.8、生成不带查询条件的统计条目数SQL
```
/**
* 生成不带查询条件的统计条目数SQL
* SELECT COUNT(*) FROM user
*/
public String getCountSql();
```
## 4.9、生成不带查询条件的关联查询SQL
```
/**
* 生成不带查询条件的查询SQL,支持注解JoinTable、JoinTables注解
*
* SELECT user_id ,user_name,pwd,create_date FROM user inner join user_org on user.user_id = user_org.user_id inner join org on org.org_id user_org.org_id
*
*/
public String getAnnotationSelectSql();
```
## 4.10、生成包含表所有列的查询SQL片段
```
/**
* 生成包含表所有列的查询SQL片段,用于其它sql的拼接查询
*
* user_id ,user_name, pwd, create_date
*
*/
public String getSelectColumnsFragment();
```
## 4.11、生成包含表所有列并带前缀的查询SQL片段
```
/**
* 生成包含表所有列并带前缀的查询SQL片段,用于其它sql的拼接查询
*
* prefix.user_id ,prefix.user_name, prefix.pwd, prefix.create_date
*
* @param prefix 前缀
*/
public String getSelectColumnsFragment(String prefix);
```
## 4.12、生成查询SQL
此SQL非标准的可执行SQL,需要通过框架里的XsqlBuilder进行编译后才能执行。编译时会将/~ ~/占位符里的内容与查询参数做匹配,只有查询参数里有的属性才会出现在最终的SQL语句里。例如:针对/~ AND user_id = [userId] ~/这个占位符,只有查询参数里有userId这个查询条件时,才会将占位符编译为user_id = :userId,如果查询参数里没有userId这个查询条件,整个占位符就会被丢弃,编译后的SQL里就没有user_id = :userId这个查询条件。
```
/**
* 生成查询的SQL,默认主键用"=",非主键用like,日期类型会根据数据库类型自动转换为相应的日期格式
*
* SELECT user_id ,user_name, pwd, create_date FROM user WHERE 1=1 /~ AND user_id = [userId] ~//~ AND user_name like '%[userName]%' ~//~ AND pwd like '%[pwd]%' ~//~ AND date_format(create_date,'%Y-%m-%d %H-%i-%s')" + " like '%[createDate]%' ~/ /~ order by [sortColumns] ~/
*
*/
public String getQuerySql();
```
## 4.13、生成查询SQL(自定义匹配方式)
可通过filters里的Operator制定查询条件匹配方式,包含=、>=、like、in、isNull、isNotNull等。
```
/**
* 生成列带前缀查询的SQL
*
* SELECT user_id , user_name, pwd, create_date FROM user WHERE 1=1 /~ AND user_id = {userId} ~//~ AND user_name like '%[userName]%' ~//~ AND pwd like '%[pwd]%' ~//~ AND date_format(create_date,'%Y-%m-%d %H-%i-%s')" + " like '%[createDate]%' ~/ /~ order by [sortColumns] ~/
*
* @param filters包含每个列查询关系的集合(>,=,like,<>...)
*/
public String getQuerySql(Map filters);
```
## 4.14、生成带前缀查询SQL
```
/**
* 生成带前缀查询的SQL,默认主键用"=",非主键用like,日期会根据数据库类型自动转换为相应的日期格式
*
* SELECT prefix.user_id ,prefix.user_name, prefix.pwd, prefix.create_date FROM user WHERE 1=1 /~ AND prefix.user_id = {userId} ~//~ AND prefix.user_name like '%[userName]%' ~//~ AND prefix.pwd like '%[pwd]%' ~//~ AND date_format(prefix.create_date,'%Y-%m-%d %H-%i-%s')" + " like '%[createDate]%' ~/ /~ order by [sortColumns] ~/
*
* @param prefix 前缀
*/
public String getQuerySql(String prefix);
```
## 4.15、生成带前缀查询SQL(自定义匹配方式)
```
/**
* 生成带前缀查询的SQL
*
* SELECT prefix.user_id ,prefix.user_name ,prefix.pwd, prefix.create_date FROM user WHERE 1=1 /~ AND prefix.user_id = {userId} ~//~ AND prefix.user_name like '%[userName]%' ~//~ AND prefix.pwd like '%[pwd]%' ~//~ AND date_format(prefix.create_date,'%Y-%m-%d %H-%i-%s')" + " like '%[createDate]%' ~/
*
* @param prefix 前缀
* @param filters 包含每个列查询关系的集合(>,=,like,<>...)
*/
public String getQuerySql(String prefix, Map filters);
```
## 4.16、生成查询条件(where之后的部分)
```
/**
* 生成查询查询条件(where之后的部分),用于拼接SQL
*
* /~ AND user_id = {userId} ~//~ AND user_name like '%[userName]%' ~//~ AND pwd like '%[pwd]%' ~//~ AND date_format(create_date,'%Y-%m-%d %H-%i-%s')" + " like '%[createDate]%' ~/ /~ order by [sortColumns] ~/
*
*/
public String getQueryWhereFragment();
```
## 4.17、生成查询条件(where之后的部分,自定义匹配方式)
```
/**
* 生成查询查询条件(where之后的部分)
*
* /~ AND user_id = {userId} ~//~ AND user_name like '%[userName]%' ~//~ AND pwd like '%[pwd]%' ~//~ AND date_format(create_date,'%Y-%m-%d %H-%i-%s')" + " like '%[createDate]%' ~//~ order by [sortColumns] ~/
*
* @param filters包含每个列查询关系的集合(>,=,like,<>...)
*/
public String getQueryWhereFragment(Map filters);
```
## 4.18、生成带前缀查询条件(where之后的部分,自定义匹配方式)
```
/**
* 生成带前缀的查询查询条件(where之后的部分)
*
* /~ AND prefix.user_id = {userId} ~//~ AND prefix.user_name like '%[userName]%' ~//~ AND prefix.pwd like '%[pwd]%' ~//~ AND date_format(prefix.create_date,'%Y-%m-%d %H-%i-%s')" + " like '%[createDate]%' ~//~ order by [sortColumns] ~/
*
* @param prefix 前缀
*/
public String getQueryWhereFragment(String prefix);
```
## 4.19、生成带前缀查询条件(where之后的部分,自定义匹配方式)
```
/**
* 生成带前缀的查询查询条件(where之后的部分)
*
* /~ AND prefix.user_id = {userId} ~//~ AND prefix.user_name like '%[userName]%' ~//~ AND prefix.pwd like '%[ pwd]%' ~//~ AND date_format(prefix.create_date,'%Y-%m-%d %H-%i-%s')" + " like '%[createDate]%' ~/ /~ order by [sortColumns] ~/
*
* @param prefix 前缀
* @param filters包含每个列查询关系的集合(>,=,like,<>...)
*/
public String getQueryWhereFragment(String prefix, Map filters);
```
## 4.20、生成带前缀查询条件(where之后的部分,自定义日期格式)
```
/**
* 生成带前缀的查询查询条件(where之后的部分,自定义日期格式,)
*
* /~ AND prefix.user_id = {userId} ~//~ AND prefix.user_name like '%[userName]%' ~//~ AND prefix.pwd like '%[pwd]%' ~//~ AND date_format(prefix.create_date,'%Y-%m-%d')" + " like '%[createDate]%' ~/ /~ order by [sortColumns] ~/
*
* @param prefix 前缀
* @param dateFormat 日期格式(如:%Y-%m-%d)
*/
public String getQueryWhereFragment(String prefix, String dateFormat);
```
## 4.21、生成带前缀查询条件(where之后的部分,自定义匹配方式和日期格式)
```
/**
* 生成带前缀的查询查询条件(where之后的部分)
*
* /~ AND prefix.user_id = {userId} ~//~ AND prefix.user_name like '%[userName]%' ~//~ AND prefix.pwd like '%[pwd]%' ~//~ AND date_format(prefix.create_date,'%Y-%m-%d')" + " like '%[createDate]%' ~/ /~ order by [sortColumns] ~/
*
* @param prefix 前缀
* @param dateFormat 日期格式(如:%Y-%m-%d)
* @param filters 包含每个列查询关系的集合(>,=,like,<>...)
*/
public String getQueryWhereFragment(String prefix, String dateFormat, Map filters);
```
## 4.22、生成BETWEEN查询条件的SQL片段
```
/**
* 生成BETWEEN查询条件的SQL片段
*
* /~ AND user_id BETWEEN [userIdBegin] AND [userIdEnd] ~/
*
* @param propertyName 类型的属性名称
* @param type 列对应的字段类型
*/
public String getBetweenFragment(String propertyName, int type);
```
## 4.23、生成带别名BETWEEN查询条件的SQL片段
```
/**
* 生成BETWEEN查询条件的SQL片段
*
* /~ AND user_id BETWEEN [uidBegin] AND [uidEnd] ~/
*
* @param propertyName 类型的属性名称
* @param alias 列别名
* @param type 列对应的字段类型
*/
public String getBetweenFragment(String propertyName, String alias, int type);
```
# 4.24、生成带前缀和别名BETWEEN查询条件的SQL片段
```
/**
* 生成BETWEEN查询条件的SQL片段
*
* /~ AND prefix.user_id BETWEEN [uidBegin] AND [uidEnd] ~/
*
* @param prefix 前缀
* @param propertyName 类型的属性名称
* @param alias 列别名
* @param type 列对应的字段类型
*/
public String getBetweenFragment(String prefix, String propertyName, String alias, int type);
```
## 4.25、生成带别名BETWEEN查询条件的SQL片段(自定义日期格式)
```
/**
* 生成BETWEEN查询条件的SQL片段
*
* /~ AND date_format(create_date,'%Y-%m-%d %H-%i-%s') BETWEEN [createDateBegin] AND [createDateEnd] ~/
*
* @param propertyName 类型的属性名称
* @param alias 列别名
* @param type 列对应的字段类型
* @param dateFormat 日期格式(如:%Y-%m-%d %H-%i-%s)
*/
public String getBetweenFragment(String propertyName, String alias, int type, String dateFormat);
```
## 4.26、生成带前缀和别名BETWEEN查询条件的SQL片段(自定义日期格式)
```
/**
* 生成BETWEEN查询条件的SQL片段
*
* /~ AND date_format(prefix.create_date,'%Y-%m-%d %H-%i-%s') BETWEEN [createDateBegin] AND [createDateEnd] ~/
*
* @param prefix 前缀
* @param propertyName 类型的属性名称
* @param alias 列别名
* @param type 列对应的字段类型
* @param dateFormat 日期格式(如:"%Y-%m-%d %H-%i-%s)
*/
public String getBetweenFragment(String prefix, String propertyName, String mapKey, int type, String dateFormat);
```
## 4.27、获取前缀
```
/**
* 获取前缀
* @return
*/
public String getPrefix();
```
## 4.28、获取表对象
```
/**
* 获取表对象
* @return
*/
public Table getTable();
```
# 5、SQL生成器使用场景
有用户表、部门表、用户部门关系表三张表,表定义别如下:
用户表(user)
```
字段名称 | 字段类型 | 字段说明
-----------------------------------------------
user_id |varchar(20) |用户ID,主键
-----------------------------------------------
user_name |varchar(50) |用户名
-----------------------------------------------
pwd |varchar(50) |密码
-----------------------------------------------
create_date |datetime |创建日期
-----------------------------------------------
```
部门表(department)
```
字段名称 |字段类型 |字段说明
-----------------------------------------------
department_id |varchar(20) |部门ID,主键
-----------------------------------------------
department_name |varchar(50) |部门名称
-----------------------------------------------
```
用户部门关系表(user_department)
```
字段名称 |字段类型 |字段说明
-----------------------------------------------
user_id |varchar(20) |用户ID
-----------------------------------------------
department_id |varchar(20) |部门ID
-----------------------------------------------
```
根据部门名称查询部门的用户:
```
String sql = "select " + getSqlGenerator().getSelectColumnsFragment() + " from user inner join user_department on user.user_id = user_department.user_id inner join department on user_department.department_id = deparment.id where 1=1 /~ and department.department_name like '%[departmentName]%' ~/" + getSqlGenerator().getQueryWhereFragment();
```
生成的SQL为:
```
select user_id, username, pwd, create_date from user inner join user_department on user.user_id = user_department.user_id inner join department on user_department.department_id = deparment.id where 1=1 /~ and department.department_name like '%[departmentName]%'//~ AND user_id = {userId} ~//~ AND user_name like '%[userName]%' ~//~ AND pwd like '%[pwd]%' ~//~ AND date_format(create_date,'%Y-%m-%d %H-%i-%s')" + " like '%[createDate]%' ~/ /~ order by [sortColumns] ~/
```
# 6、注解说明
框架中使用的注解包括JPA的标准注解和部分自定义注解。
## 6.1、@Table
javax.persistence.Table注解,用在Entity对象上,建立对象和表之间的对应关系。
## 6.2、@Column
javax.persistence.Column注解,用在Entity对象的属性上,如果在属性上不使用@Cloumn注解,默认通过将属性名称转成下划线作为表的列名。
## 6.3、@ GenericGenerator
com.moolbuy.orm.annotation. GenericGenerator注解,用在Entity对象上,定义主键生成策略,见3.2章。
## 6.4、@ JoinTable
com.moolbuy.orm.annotation. JoinTable注解,用在Entity对象的属性上,以该属性与其他表做join查询。
```
String table();//需要关联查询的表名称
String alias() default "";//需要关联查询的表别名
JoinType joinType() default JoinType.INNER;//关联列类型,left、inner、rigth,默认左连接
String left(); //主表的关联查询字段
String right() default ""; //关联表的查询字段
String[] columns() default {};//需要查询出的关联表的列
```
使用示例:
```
@JoinTable(table="sys_wechat", alias="wechat", joinType= JoinType.LEFT, left="openid", right="openid")
private java.lang.String openid;
```
在生成此Entity的查询SQL时,会与此属性的@JoinTable注解里的table做关联,生成的SQL如下:
```
Select user.user_id, user.user_name, user.pwd, user.create_date, wechat. nick_name from user left join sys_wechat wechat on user.openid = wechat.openid where 1=1 /~ AND user_id = {userId} ~//~ AND user_name like '%[userName]%' ~//~ AND pwd like '%[pwd]%' ~//~ AND date_format(create_date,'%Y-%m-%d %H-%i-%s')" + " like '%[createDate]%' ~/ /~ order by [sortColumns] ~/
```