Слияние кода завершено, страница обновится автоматически
mvn clean install -P central-publishing
jade.config.indexVariableKey=_index
- 注:编译时需要启动-parameters (javac -parameters .....);Maven项目配置parameters,请查看下方案例
- 注:如果编译时未开启parameters,则可以通过 arg0,arg1,arg2 ... 的方式获取参数值
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>8</source>
<target>8</target>
<compilerArgs>
<arg>-parameters</arg> <!-- 启用参数名称保存 -->
</compilerArgs>
</configuration>
</plugin>
import net.paoding.rose.jade.annotation.DAO;
import net.paoding.rose.jade.annotation.SQL;
@DAO
public class TestDao {
/**
* 注:此处未使用 @SqlParam 注解对参数名进行标注,可以直接根据参数名获取到对应的参数值
* @param id
* @return
*/
@SQL("select * from tb_user where id =:id")
public TbUser findById(Long id);
}
jade:
datasource:
fetch-size: 200
//-----------
@SQL(value="select * from tb_address")
Stream<?> findAll();
优化 Dao 注解的扫描方式
<dependency>
<groupId>cn.zhangfusheng</groupId>
<artifactId>paoding-rose-jade</artifactId>
<version>4.01</version>
</dependency>
2.启用禁用
// # 使用注解
@EnablePaodingRoseJade
1. 支持jade 原生的语法 具体用法请参考 1.0 语法支持
2. 支持 条件语句封装 具体用法参考 2.0 ,[想象MyBatis 的xml一样,自动的添加 关键字]
3. 支持Option返回值 参考3.0
4. 通过EnablePaodingRoseJade注解启用,版本号 > 4.0.7
5. 支持jpa方式查询,具体参考 4.0.版本号 >= 5.0.2(该版本不能使用,存在严重的bug,在5.0.3版本修复)
6. 支持jpa排序和分页,具体参考 4.0.版本号 >= 5.0.3
文档中还存在 1=1 的情况也在 2.0.1 version 中解决,具体请参考文档中的2.0
@SQL("SELECT user_id, device_token FROM test_table LIMIT :limit")
public List<Test> getTests(@SQLParam("limit") int limit);
@SQL("SELECT user_id, device_token FROM test_table LIMIT :1")
public List<Test> getTests(int limit);
@SQL("SELECT user_id, device_token FROM test_table where user_name = :1.userName")
public List<Test> getTests(User user);
@SQL("SELECT user_id, device_token FROM test_##(:tableName) where user_name = :user.userName")
public List<Test> getTests(@SQLParam("tableName") String tableName, @SQLParam("user")User user);
// #if(){}
@SQL("SELECT user_id, device_token FROM test_user #if(:user!=null){ where user_name = :user.userName}")
public List<Test> getTests(@SQLParam("user")User user);
// #if(){}#else{}
@SQL("SELECT user_id, device_token FROM test_user #if(:user!=null){ where #if(:user.userName!=null){ user_name = :user.userName }#else{ id=:user.id }}")
public List<Test> getTests(@SQLParam("user")User user);
@SQL("SELECT user_id, device_token FROM test_##(:partition) where user_id in(:ids)")
public List<Test> getTestsByIds(@SQLParam("partition") int partition, @SQLParam("ids") List<Integer> ids);
@SQL("SELECT user_id, device_token FROM test_user where user_name like CONCAT('%',:userName,'%')")
public List<Test> getTestsByIds(@SQLParam("userName") String userName);
package cn.zhangfusheng.base.server.dao;
import cn.zhangfusheng.base.page.PageRequest;
import cn.zhangfusheng.base.page.SortBy;
import net.paoding.rose.jade.annotation.ReturnGeneratedKeys;
import net.paoding.rose.jade.annotation.SQL;
import net.paoding.rose.jade.annotation.SQLParam;
import net.paoding.rose.jade.annotation.SQLType;
import java.util.*;
/**
* @ClassName: BaseDao
* @author ZFS
* @Date: 2018/11/26 16:12
*/
public interface BaseDao<T> {
public static final String SELECT_SQL = "select $SELECT_COLUMN from `$TABLE_NAME` ";
public static final String COUNT_SQL = "select count(1) from `$TABLE_NAME` ";
public static final String DELETE_SQL = "delete from `$TABLE_NAME` ";
/**
* 根据id查询
* @param id 主键id
* @return T
*/
@SQL(SELECT_SQL + "where id = :id")
T queryById(@SQLParam("id") Integer id);
/**
* 根据条件查询
* @param queryMap 查询条件
* @return
*/
@SQL(SELECT_SQL + "#if(:m != null){#for(key in :m.keySet()){#if(:_index==0){where}#else{#if(:_index!=0){and}} `##(:key)`=#(:m[:key]) }}")
List<T> queryByAll(@SQLParam("m") Map<String, Object> queryMap);
/**
* 查询并排序
* @param queryMap 查询条件
* @param sortBy 排序方式
* @return
*/
@SQL(SELECT_SQL + "#if(:m != null){#for(key in :m.keySet()){#if(:_index==0){where}#else{#if(:_index!=0){and}} `##(:key)`=#(:m[:key]) }}" +
" #if(:s != null && :s.columnName!=null && :s.sortOrder!=null){order by ##(:s.columnName) ##(:s.sortOrder)}")
List<T> queryForSort(@SQLParam("m") Map<String, Object> queryMap, @SQLParam("s") SortBy sortBy);
/**
* 分页查询
* @param queryMap 查询条件
* @param pageRequest 分页数据
* @param sortBy 排序方式
* @return
*/
@SQL(SELECT_SQL + "#if(:m != null){#for(key in :m.keySet()){#if(:_index==0){where}#else{#if(:_index!=0){and}} `##(:key)`=#(:m[:key]) }}" +
" #if(:s != null && :s.columnName!=null && :s.sortOrder!=null){order by ##(:s.columnName) ##(:s.sortOrder)}" +
" #if(:pageRequest != null){LIMIT :pageRequest.startNum,:pageRequest.pageSize}")
List<T> queryForPage(
@SQLParam("m") Map<String, Object> queryMap, @SQLParam("pageRequest") PageRequest pageRequest, @SQLParam("s") SortBy sortBy);
/**
* 根据条件只能查询出一条结果
* @param queryMap
* @return
*/
@SQL(SELECT_SQL + "#if(:m != null){#for(key in :m.keySet()){#if(:_index==0){where}#else{#if(:_index!=0){and}} `##(:key)`=#(:m[:key]) }}")
T queryOne(@SQLParam("m") Map<String, Object> queryMap);
/**
* 统计个数
* @param queryMap
* @return int
*/
@SQL(COUNT_SQL + "#if(:m != null){#for(key in :m.keySet()){#if(:_index==0){where}#else{#if(:_index!=0){and}} `##(:key)`=#(:m[:key]) }}")
int baseCount(@SQLParam("m") Map<String, Object> queryMap);
/**
* 根据id 更新
* @param keyValue 可以调用cn.slhz.base.bean.BaseBean.beanTOMap(Object object) 方法,将对象转换成map
* @param id 主键id
* @return 更新的个数 == 1
*/
@SQL("UPDATE $TABLE_NAME SET #for(key in :m.keySet()){#if(:_index!=0){,} `##(:key)` = #(:m[:key]) } WHERE id = :id")
Integer updateById(@SQLParam("m") Map<String, Object> keyValue, @SQLParam("id") int id);
/**
* 插入一条数据 该表必须包含id字段
* @param keyValue 可以调用cn.slhz.base.bean.BaseBean.beanTOMap(Object object) 方法,将对象转换成map
* @return 主键id
*/
@ReturnGeneratedKeys
@SQL("INSERT INTO $TABLE_NAME" +
" (#for(key in :keyValue.keySet()){#if(:_index!=0){,} `##(:key)`})" +
" VALUES" +
" (#for(key in :keyValue.keySet()){#if(:_index!=0){,}'##(:keyValue[:key])'})")
int insert(@SQLParam("keyValue") Map<String, Object> keyValue);
/**
* 批量保存
* @param keyValue
* @return
*/
@SQL("INSERT INTO $TABLE_NAME ( ##(:keyValue.filedName) ) VALUES ##(:keyValue.filedValue) ")
int insertAll(@SQLParam("keyValue") Map<String, Object> keyValue);
/**
* 批量删除
* @param ids
* @return
*/
@SQL("DELETE FROM $TABLE_NAME WHERE id in (:ids)")
int delete(@SQLParam("ids") List<Integer> ids);
/**
* 根据id单个删除
* @param id
* @return
*/
@SQL("DELETE FROM $TABLE_NAME WHERE id = :id")
int deleteById(@SQLParam("id") int id);
/**
* 根据条件删除
* @param queryMap
* @return
*/
@SQL("DELETE FROM $TABLE_NAME #if(:m != null){#for(key in :m.keySet()){#if(:_index==0){where}#else{#if(:_index!=0){and}} `##(:key)`=#(:m[:key]) }}")
int delete(@SQLParam("m") Map<String, Object> queryMap);
/**
* 先查询 如果不存在 则 插入
* @param keyValue
* @return
*/
@ReturnGeneratedKeys
@SQL(type = SQLType.WRITE,
value = "INSERT INTO $TABLE_NAME (#if(:_index!=0){,}#for(key in :m.keySet()){#if(:_index!=0){,}`##(:key)`}) select #for(key in :m.keySet()){#if(:_index!=0){,}'##(:m[:key])'} from dual where not exists (select id from $TABLE_NAME #if(:m != null){#for(key in :m.keySet()){#if(:_index==0){where}#else{#if(:_index!=0){and}} `##(:key)`=#(:m[:key]) }}})")
Integer selectInsert(@SQLParam("m") Map<String, Object> keyValue);
}
package cn.zhangfusheng.base.page;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
/**
* @author fusheng.zhang
* @Description
* @create 2019-11-05 11:36:00
*/
@Data
@Accessors(chain = true)
public class PageRequest {
/**
* 每页的大小
*/
@ApiModelProperty("分页大小")
private int pageSize;
/**
* 开始页数
*/
@ApiModelProperty("第几页")
private int pageNumber;
/**
* 开始条数
*/
@ApiModelProperty(hidden = true)
private int startNum;
/**
* 结束页数
*/
@ApiModelProperty(hidden = true)
private int endPage;
/**
* 总条数
*/
@ApiModelProperty(hidden = true)
private int count;
/**
* 总条数
*/
@ApiModelProperty(hidden = true)
private int total;
/**
* 总页数
*/
@ApiModelProperty(hidden = true)
private int totalPage;
public synchronized <T> PageResponse<T> pageResponse() {
return new PageResponse<>();
}
public synchronized <T> PageResponse<T> pageResponse(List<T> data, Integer count) {
PageResponse<T> tPageResponse = new PageResponse<>();
tPageResponse.setData(data).setCount(count);
return tPageResponse;
}
public int getPageNumber() {
return Math.max(pageNumber, 1);
}
public int getStartNum() {
return startNum = pageNumber <= 1 ? 0 : (pageNumber - 1) * getPageSize();
}
public int getPageSize() {
return pageSize = pageSize == 0 ? 10 : pageSize;
}
public int getEndPage() {
return endPage = count % getPageSize() == 0 ? count / getPageSize() : count / getPageSize() + 1;
}
public int getCount() {
return count;
}
public int getTotalPage() {
return count % pageSize == 0 ? count / pageSize : count / pageSize + 1;
}
public int getTotal() {
total = count == 0 ? 1 : count;
return total;
}
}
package cn.zhangfusheng.base.page;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
/**
* @author fusheng.zhang
* @Description
* @create 2019-11-05 11:37:00
*/
@EqualsAndHashCode(callSuper = true)
@Data
@Accessors(chain = true)
@ApiModel("分页响应")
public class PageResponse<T> extends PageRequest {
public PageResponse(int pageSize, int pageNumber, int total) {
super.setPageSize(pageSize).setPageNumber(pageNumber).setTotal(total);
}
public PageResponse(PageRequest pageRequest) {
super.setPageSize(pageRequest.getPageSize())
.setPageNumber(pageRequest.getPageNumber())
.setStartNum(pageRequest.getStartNum())
.setEndPage(pageRequest.getEndPage())
.setCount(pageRequest.getCount())
.setTotal(pageRequest.getTotal())
.setTotalPage(pageRequest.getTotalPage());
}
/**
* 分页数据
*/
private List<T> data;
public PageResponse<T> setData(List<T> data) {
if (CollectionUtils.isEmpty(data)) {
this.data = new ArrayList<T>(0);
} else {
this.data = data;
}
return this;
}
public List<T> getData() {
if (CollectionUtils.isEmpty(data)) {
return new ArrayList<T>(0);
}
return data;
}
}
package cn.zhangfusheng.base.page;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author fusheng.zhang
* @Description
* @create 2020-04-13 16:29:00
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("排序")
public class SortBy {
public static final String DESC = "desc";
public static final String ASC = "asc";
@ApiModelProperty("排序字段,多个字段采用逗号拼接")
private String columnName;
@ApiModelProperty(value = "排序方式 asc desc", allowableValues = "desc,asc")
private String sortOrder = DESC;
}
// SELECT_SQL 为BaseDAO中提取的公共的sql模板
final static String TABLE_NAME = "tb_user";
final static String SELECT_COLUMN = "`id`,`user_name`,`phone`,`password`,`head_img`,`province_id`,`province_name`,`city_id`,`city_name`,`area_id`,`area_name`,`address`,`status`,`create_time`,`update_time`";
/**
* 产生sql:
* select `id`,`user_name`,`phone`,`password`,`head_img`,`province_id`,`province_name`,`city_id`,`city_name`,`area_id`,`area_name`,`address`,`status`,`create_time`,`update_time`
* from `tb_user`
* where user_name = '123' and phone = '456' and id in (1001) or province_id=1 or (province_id=1 or id in (1001))
* @param tbUser
* @return
*/
@SQL(
value = SELECT_SQL,
condition = {
@SQLCondition("#if(:vo.userName!=null){user_name = :vo.userName}"),
@SQLCondition("#if(:vo.phone!=null){phone = :vo.phone}"),
@SQLCondition("#if(:vo.id!=null){id in (:vo.id)}"),
@SQLCondition(value = "#if(:vo.provinceId!=null){province_id=:vo.provinceId}", condition = "or"),
@SQLCondition(value = "#if(:vo.provinceId!=null){(province_id=:vo.provinceId or id in (:vo.id))}", condition = "or"),
}
)
List<TbUser> find(@SQLParam("vo") TbUser tbUser);
/**
* 产生sql
* select
* `id`,`user_name`,`phone`,`password`,`head_img`,`province_id`,`province_name`,`city_id`,`city_name`,`area_id`,`area_name`,`address`,`status`,`create_time`,`update_time`
* from `tb_user`
* where id in (1,2,3,4,5)
* @param ids
* @return
*/
@SQL(
value = SELECT_SQL, condition = {
@SQLCondition("#if(:1!=null){id in (:1)}"),
})
List<TbUser> findByIds(List<Integer> ids);
/**
* 产生sql:
* select
* `id`,`user_name`,`phone`,`password`,`head_img`,`province_id`,`province_name`,`city_id`,`city_name`,`area_id`,`area_name`,`address`,`status`,`create_time`,`update_time`
* from `tb_user`
* where
* user_name in ('1','2','3','4','5')
* @param names
* @return
*/
@SQL(
value = SELECT_SQL, condition = {
@SQLCondition("#if(:1!=null){user_name in (:1)}"),
})
List<TbUser> findByNames(List<String> names);
/**
* 产生sql:
* select
* `id`,`user_name`,`phone`,`password`,`head_img`,`province_id`,`province_name`,`city_id`,`city_name`,`area_id`,`area_name`,`address`,`status`,`create_time`,`update_time`
* from `tb_user`
* where
* id in (1,2,3,4,5) and id in (1,2,3,4,5) and user_name in ('1','2','3','4','5')
* @param names
* @param ids
* @return
*/
@SQL(
value = SELECT_SQL,
condition = {
@SQLCondition(value = "#if(:2!=null){id in (:2)}", values = {"#if(:2!=null){id in (:2)}", "#if(:1!=null){user_name in (:1)}"})
}
)
List<TbUser> findByNamesAndId(List<String> names, List<Integer> ids);
/**
* 分页 或者排序
* @param departmentVo
* @param pageRequest
* @return
*/
@SQL(value = SELECT_SQL,
condition = {
@SQLCondition("#if(:vo.companyId!=null){company_id=:vo.companyId}"),
@SQLCondition("#if(:vo.name!=null){department_name like CONCAT('%',:vo.name,'%')}"),
@SQLCondition(value = "id", condition = "order by", appendWhere = false),
@SQLCondition(value = "#if(:pageRequest != null){:pageRequest.startNum,:pageRequest.pageSize}", condition = "LIMIT", appendWhere = false),
}
)
List<TbDepartment> find(@SQLParam("vo") QueryDepartmentVo departmentVo, @SQLParam("pageRequest") PageRequest pageRequest);
@SQL(SELECT_SQL + "where id = :id")
Optional<T> queryById(@SQLParam("id") Integer id);
具体使用模拟jpa的使用即可
=5.0.3 支持 orderBy 和 分页
* 当使用jpa的方式的时候.要注意一下内容
* 方法上存在注解 SqlJpa 时,将使用注解配置的要查询的字段和表,此配置优先级最高.
* 方法上不存在注解 SqlJpa 时,将会读取接口内的常量字段 TABLE_NAME 和 SELECT_COLUMN
* 必须通过 注解(SqlJpa) 或 常量字段(TABLE_NAME) 配置要查询的表
* 要查询的字段如果不配置,将使用 '*' 替代
* 已经支持jpa大部分关键字,部分关键字未支持,如下
* IS_EMPTY NOT_CONTAINING CONTAINING NEAR WITHIN REGEX EXISTS
* 支持分页查询,但是还未支持返回总条数的查询
@DAO(catalog = UserServerConstant.SERVER_NAME)
public interface TbUserDao extends BaseDao<TbUser> {
final static String TABLE_NAME = "tb_user";
final static String SELECT_COLUMN = "`id`,`name`,`nick_name`,`status`,`create_time`,`update_time`";
TbUser findByIdAndName(String id, String name);
@SqlJpa(columns = "id,name", tableName = "tb_user")
TbUser findByIdAndNameAndStatus(String id, String name, int status);
@SqlJpa(columns = "id,name", tableName = "tb_user")
TbUser findByIdAndNameAndStatusOrderByIdDescAgeAsc(String id, String name, int status);
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )