# m-orm **Repository Path**: mogaoyong/m-orm ## Basic Information - **Project Name**: m-orm - **Description**: M-ORM是基于Spring-Jdbc的半自动化ORM框架,采用自动生成通用SQL与手工书写SQL相结合的方式,快速完成对数据库的CRUD操作。 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2018-06-04 - **Last Updated**: 2020-12-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 1、概述 M-ORM是基于Spring-Jdbc的半自动化ORM框架,采用自动生成通用SQL与手工书写SQL相结合的方式,快速完成对数据库的CRUD操作。 # 2、快速开始 ## 2.1、添加maven依赖 ``` com.moolbuy m-orm-spring-boot-starter 1.0.2 com.alibaba druid-spring-boot-starter 1.1.0 ``` ## 2.2、配置数据源和框架信息 在Spring-Boot工程的application.yml文件中添加如下配置: ``` #数据源配置 datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/ims?useUnicode=true&characterEncoding=utf-8 username: root password: 123456 # 初始化大小,最小,最大 initialSize: 5 minIdle: 5 maxActive: 20 #defaultAutoCommit: false # 配置获取连接等待超时的时间 maxWait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false # 打开PSCache,并且指定每个连接上PSCache的大小 poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 filters: stat,wall,log4j # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 connectionProperties: stat.mergeSql=true;stat.slowSqlMillis=5000 # 合并多个DruidDataSource的监控数据 useGlobalDataSourceStat: true #ORM框架配置 moolbuy: orm: sqlGeneratorClass: com.moolbuy.orm.sqlgenerator.MySQLSpringNamedSqlGenerator #为每个集群节点分配唯一的id workerId: 1 #数据中心id datacenterId: 1 ``` ## 2.3、开发Dao层 #Entity类 ``` package com.zoomlion.ims.rest.entity; import javax.persistence.Column; import javax.persistence.Table; import org.springframework.stereotype.Component; @Component @Table(name="sys_user") public class User extends BaseEntity{ /** * */ private static final long serialVersionUID = 1L; //帐号 private java.lang.String username; //姓名 private java.lang.String name; //性别 private java.lang.String sex; //联系电话 private java.lang.String phone; //电子邮箱 private java.lang.String email; //状态 private java.lang.Integer status; //密码 @Column(name="password", updatable = false) private java.lang.String password; //加密盐 @Column(name="salt", updatable = false) private java.lang.String salt; //照片地址 private java.lang.String avarta; //用户类型 private java.lang.String type; //第三方平台唯一标识 private java.lang.String openid; //用户所属平台 private java.lang.String plateform; //来源 private java.lang.String source; //排序码 private java.lang.Integer orders; public java.lang.String getUsername() { return this.username; } public void setUsername(java.lang.String username) { this.username = username; } public java.lang.String getName() { return this.name; } public void setName(java.lang.String name) { this.name = name; } public java.lang.String getSex() { return this.sex; } public void setSex(java.lang.String sex) { this.sex = sex; } public java.lang.String getPhone() { return this.phone; } public void setPhone(java.lang.String phone) { this.phone = phone; } public java.lang.String getEmail() { return this.email; } public void setEmail(java.lang.String email) { this.email = email; } public java.lang.Integer getStatus() { return this.status; } public void setStatus(java.lang.Integer status) { this.status = status; } public java.lang.String getPassword() { return this.password; } public void setPassword(java.lang.String password) { this.password = password; } public java.lang.String getSalt() { return this.salt; } public void setSalt(java.lang.String salt) { this.salt = salt; } public java.lang.String getAvarta() { return this.avarta; } public void setAvarta(java.lang.String avarta) { this.avarta = avarta; } public java.lang.String getType() { return this.type; } public void setType(java.lang.String type) { this.type = type; } public java.lang.String getOpenid() { return this.openid; } public void setOpenid(java.lang.String openid) { this.openid = openid; } public java.lang.String getPlateform() { return this.plateform; } public void setPlateform(java.lang.String plateform) { this.plateform = plateform; } public java.lang.String getSource() { return this.source; } public void setSource(java.lang.String source) { this.source = source; } public java.lang.Integer getOrders() { return this.orders; } public void setOrders(java.lang.Integer orders) { this.orders = orders; } } ``` #UserDao接口 package com.zoomlion.ims.rest.dao; import com.moolbuy.orm.dao.EntityManager; import com.zoomlion.ims.rest.entity.User; public interface UserDao extends EntityManager { } #BaseDao类 ``` import java.io.Serializable; import javax.annotation.Resource; import com.moolbuy.orm.dao.EntityManagerConfig; import com.moolbuy.orm.dao.SpringJdbcEntityManager; import com.moolbuy.orm.dao.support.Page; import com.zoomlion.ims.rest.entity.BaseEntity; import com.zoomlion.ims.rest.entity.OrderEntity; public class BaseDao extends SpringJdbcEntityManager { @Resource(name="entityManagerConfig") public void setEntityManagerConfig(EntityManagerConfig entityManagerConfig){ this.entityManagerConfig = entityManagerConfig; } } ``` #UserDao实现 ``` package com.zoomlion.ims.rest.dao.impl; import org.springframework.stereotype.Component; import com.zoomlion.ims.rest.dao.UserDao; import com.zoomlion.ims.rest.entity.User; @Component public class UserDaoImpl extends BaseDao implements UserDao{ } ``` 至此,一个具新增、修改、查询、分页、删除功能的基础Dao层搭建完成。 # 3、 通用API说明 通用API是指任意一个基于M-ORM框架开发的Dao都具备的基础功能API。 ## 3.1、根据主键查找对象 ``` /** * 根据主键查找 * @param id 主键 * @return 对象实例 * @throws DataAccessException */ public E getById(PK id) throws DataAccessException; ``` ## 3.2、新增对象 新增对象可以通过对象的@ GenericGenerator注解指定主键策略: * 1、 GenerationType.GUID:根据snowflake算法生成18位数字的主键,默认策略 * 2、 GenerationType. ASSIGNED:由开发者分配注解 * 3、 GenerationType. UUID:使用GUID作为主键 * 4、 GenerationType. AUTOINCREMENT:使用数据库的自增ID,适用Mysql和Sql Server数据库 * 5、 GenerationType. DB2Sequence:使用数据库Sequence生成主键,适用DB2数据库 * 6、 GenerationType. ORACLESEQUENCE:使用数据库Sequence生成主键,适用Oracle数据库 ``` /** * 插入新对象 * @param entity 对象实例 * @throws DataAccessException */ public void save(E entity) throws DataAccessException; ``` ## 3.3、更新对象 ``` /** * 更新对象 * @param entity 对象实例 * @throws DataAccessException */ public void update(E entity) throws DataAccessException; ``` ## 3.4、新增更新对象 根据对象的主键查询对象是否已存在,如不存在则新增,已存在则修改。调用此API须确保对象对应的表有主键。由于需要进行一次额外的查询,通常情况下不建议使用。 ``` /** * 根据主键查找对象是否存在,不存在则插入,存在则更新 * @param entity * @throws DataAccessException */ public void saveOrUpdate(E entity) throws DataAccessException; ``` ## 3.5、根据主键删除对象(逻辑删除) 此API仅修改表的删除标识字段(is_active)的值为N,不物理删除数据 ``` /** * 根据主键删除 (逻辑删除) * @param id 主键 * @throws DataAccessException */ public void deleteById(PK id) throws DataAccessException; ``` ## 3.6、根据主键删除对象 ``` /** * 根据主键删除 * @param id * @param physical 是否物理删除 * @throws DataAccessException */ public void deleteById(PK id, boolean physical) throws DataAccessException; ``` ## 3.7、删除对象(逻辑删除) 此API仅修改表的删除标识字段(is_active)的值为N,不物理删除数据 ``` /** * 删除实体对象(逻辑删除) * @param entity */ public void delete(E entity); ``` ## 3.8、删除对象(逻辑删除) ``` /** * 删除实体对象 * @param entity * @param physical */ public void delete(E entity, boolean physical); ``` ## 3.9、根据属性判断对象是否唯一 ``` /** *根据属性判断对象是否唯一 * @param entity 对象实例 * @param propertyNames 属性名称(可传多个属性) * @return Boolean 查询到唯一对象或未查到均返回true,否则返回false * @throws DataAccessException */ public boolean isUnique(E entity, String... propertyNames) throws DataAccessException; ``` ## 3.10、查询全部 ``` /** * 查出所有对象 * @return 对象列表 * @throws DataAccessException */ public List findAll() throws DataAccessException; ``` ## 3.11、查询全部并排序 ``` /** * 查出所有对象 * @param orderByProperty 排序属性 * @return * @throws DataAccessException */ public List findAll(String orderByProperty) throws DataAccessException; ``` # 3.12、查询全部并指定排序方式 ``` /** * 查出所有对象 * @param orderByProperty 排序属性 * @param order 排序方式 asc desc * @return */ public List findAll(String orderByProperty, String order); ``` ## 3.13、分页查询 通过设置Page对象的pageNo、pageSize、orderBy、order属性和调用addFilter方法增加查询参数,可实现按条件查询分页数据,支持精确查询、模糊查询和排序。 ``` /** * 分页查询对象 * @param page 分页对象 * @return 分页对象 */ public Page pageQuery(Page page); ``` ## 3.14、根据SQL查询列表 ``` /** * 查询对象列表 * @param query 查询sql * @param queryFilter 查询条件 * @return 对象列表 */ public List listQuery(String query, QueryFilter queryFilter ); ``` ## 3.15、根据SQL查询列表(自定义RowMapper) ``` /** * 查询对象列表 * @param query 查询sql * @param queryFilter 查询条件 * @param rowMapper RowMapper * @return 对象列表 */ public List listQuery(String query, QueryFilter queryFilter, RowMapper rowMapper ); ``` ## 3.16、查询对象 ``` /** * 查询对象 * @param queryFilter 查询条件 * @return 对象 */ public E objectQuery(QueryFilter queryFilter); ``` ## 3.17、查询列表 ``` /** * 查询对象列表 * @param queryFilter查询条件 * @return 对象列表 */ public List 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] ~/ ```