Compare commits

..

2 Commits

Author SHA1 Message Date
ZhouXY108 33e1c14755 1. 删除 DateTimeTools 中的格式化器的缓存,应由调用方执行负责维护;
2. 新增 toYearString 和 toMonthString 方法。
2024-12-23 00:38:20 +08:00
ZhouXY108 fbef9bd005 格式化 SQL Builder 相关代码 2024-12-23 00:36:01 +08:00
5 changed files with 89 additions and 110 deletions

View File

@ -18,6 +18,8 @@ package xyz.zhouxy.plusone.commons.sql;
import java.util.Collection; import java.util.Collection;
import xyz.zhouxy.plusone.commons.util.StringTools;
public class JdbcSql extends SQL<JdbcSql> { public class JdbcSql extends SQL<JdbcSql> {
JdbcSql() { JdbcSql() {
@ -33,40 +35,38 @@ public class JdbcSql extends SQL<JdbcSql> {
return this; return this;
} }
public static String IN(String col, Collection<?> c) { public static String IN(String col, Collection<?> c) { // NOSONAR
return IN(col, c.size()); return IN(col, c.size());
} }
public static <T> String IN(String col, T[] c) { public static <T> String IN(String col, T[] c) { // NOSONAR
return IN(col, c.length); return IN(col, c.length);
} }
private static String IN(String col, int length) { private static String IN(String col, int length) { // NOSONAR
return col + " IN (" + String.valueOf(buildQuestionsList(length)) + ')'; if (length == 0) {
return "false";
}
return col + " IN (" + buildQuestionsList(length) + ')';
} }
public static String NOT_IN(String col, Collection<?> c) { public static String NOT_IN(String col, Collection<?> c) { // NOSONAR
return NOT_IN(col, c.size()); return NOT_IN(col, c.size());
} }
public static <T> String NOT_IN(String col, T[] c) { public static <T> String NOT_IN(String col, T[] c) { // NOSONAR
return NOT_IN(col, c.length); return NOT_IN(col, c.length);
} }
private static String NOT_IN(String col, int length) { private static String NOT_IN(String col, int length) { // NOSONAR
return col + " NOT IN (" + String.valueOf(buildQuestionsList(length)) + ')'; if (length == 0) {
return "true";
}
return col + " NOT IN (" + buildQuestionsList(length) + ')';
} }
private static char[] buildQuestionsList(int times) { private static String buildQuestionsList(int times) {
char[] arr = new char[times * 3 - 2]; final int length = times <= 0 ? 0 : (times * 3 - 2);
int i = 0; return StringTools.repeat("?, ", times, length);
for (int t = 1; t <= times; t++) {
arr[i++] = '?';
if (t < times) {
arr[i++] = ',';
arr[i++] = ' ';
}
}
return arr;
} }
} }

View File

@ -41,11 +41,11 @@ public class MyBatisSql extends SQL<MyBatisSql> {
return this; return this;
} }
public static String IN(String col, String paramName) { public static String IN(String col, String paramName) { // NOSONAR
return " " + col + " IN" + buildForeach(col, paramName); return " " + col + " IN" + buildForeach(col, paramName);
} }
public static String NOT_IN(String col, String paramName) { public static String NOT_IN(String col, String paramName) { // NOSONAR
return col + " NOT IN" + buildForeach(col, paramName); return col + " NOT IN" + buildForeach(col, paramName);
} }

View File

@ -34,14 +34,14 @@ public abstract class SQL<T> extends AbstractSQL<T> {
return new MyBatisSql(withScript); return new MyBatisSql(withScript);
} }
public T WHERE(boolean condition, String sqlCondition) { public T WHERE(boolean condition, String sqlCondition) { // NOSONAR
if (condition) { if (condition) {
return WHERE(sqlCondition); return WHERE(sqlCondition);
} }
return getSelf(); return getSelf();
} }
public T WHERE(boolean condition, String ifSqlCondition, String elseSqlCondition) { public T WHERE(boolean condition, String ifSqlCondition, String elseSqlCondition) { // NOSONAR
return WHERE(condition ? ifSqlCondition : elseSqlCondition); return WHERE(condition ? ifSqlCondition : elseSqlCondition);
} }
} }

View File

@ -21,19 +21,17 @@ import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalTime; import java.time.LocalTime;
import java.time.Month; import java.time.Month;
import java.time.Year;
import java.time.YearMonth; import java.time.YearMonth;
import java.time.ZoneId; import java.time.ZoneId;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter; import java.time.chrono.IsoChronology;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.TimeZone; import java.util.TimeZone;
import javax.annotation.Nonnull; import com.google.common.base.Strings;
import com.google.common.collect.Range;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import xyz.zhouxy.plusone.commons.time.Quarter; import xyz.zhouxy.plusone.commons.time.Quarter;
import xyz.zhouxy.plusone.commons.time.YearQuarter; import xyz.zhouxy.plusone.commons.time.YearQuarter;
@ -45,89 +43,32 @@ import xyz.zhouxy.plusone.commons.time.YearQuarter;
*/ */
public class DateTimeTools { public class DateTimeTools {
/**
*
*/
private static final LoadingCache<String, DateTimeFormatter> DATE_TIME_FORMATTER_CACHE = CacheBuilder.newBuilder()
.maximumSize(20)
.build(new CacheLoader<String, DateTimeFormatter>() {
@Override
public DateTimeFormatter load(@Nonnull String pattern) throws Exception {
return DateTimeFormatter.ofPattern(pattern);
}
});
/**
*
*
* @param pattern
* @return
*/
public static DateTimeFormatter getDateTimeFormatter(String pattern) {
return DATE_TIME_FORMATTER_CACHE.getUnchecked(pattern);
}
// #region - toString // #region - toString
/** public static String toYearString(int year) {
* return Integer.toString(year);
*
* @param pattern
* @param dateTime
* @return
*/
public static String toString(String pattern, ZonedDateTime dateTime) {
return getDateTimeFormatter(pattern).format(dateTime);
} }
/** public static String toYearString(Year year) {
* 使 return year.toString();
*
* @param pattern
* @param instant
* @return
*/
public static String toString(String pattern, Instant instant) {
ZonedDateTime dateTime = instant.atZone(ZoneId.systemDefault());
return toString(pattern, dateTime);
} }
/** public static String toMonthString(int monthValue) {
* 使 return Strings.padStart(Integer.toString(monthValue), 2, '0');
*
* @param pattern
* @param instant
* @param zone
* @return
*/
public static String toString(String pattern, Instant instant, ZoneId zone) {
ZonedDateTime dateTime = instant.atZone(zone);
return toString(pattern, dateTime);
} }
// #endregion public static String toMonthString(int monthValue, boolean padStart) {
return padStart ? toMonthString(monthValue) : Integer.toString(monthValue);
// #region - nowStr
/**
*
*
* @param pattern
* @return
*/
public static String nowStr(String pattern) {
return toString(pattern, ZonedDateTime.now());
} }
/** public static String toMonthString(Month month) {
* 使 final int monthValue = month.getValue();
* return Strings.padStart(Integer.toString(monthValue), 2, '0');
* @param pattern }
* @param zone
* @return public static String toMonthString(Month month, boolean padStart) {
*/ final int monthValue = month.getValue();
public static String nowStr(String pattern, ZoneId zone) { return padStart ? toMonthString(month) : Integer.toString(monthValue);
return toString(pattern, Instant.now().atZone(zone));
} }
// #endregion // #endregion
@ -708,6 +649,42 @@ public class DateTimeTools {
// #endregion // #endregion
// ================================
// #region - others
// ================================
public static LocalDate startDateOfYear(int year) {
return LocalDate.ofYearDay(year, 1);
}
public static LocalDate endDateOfYear(int year) {
return LocalDate.of(year, 12, 31);
}
public static LocalDateTime startOfNextDate(LocalDate date) {
return date.plusDays(1L).atStartOfDay();
}
public static ZonedDateTime startOfNextDate(LocalDate date, ZoneId zone) {
return date.plusDays(1L).atStartOfDay(zone);
}
public static Range<LocalDateTime> toDateTimeRange(LocalDate date) {
return Range.closedOpen(date.atStartOfDay(), startOfNextDate(date));
}
public static Range<ZonedDateTime> toDateTimeRange(LocalDate date, ZoneId zone) {
return Range.closedOpen(date.atStartOfDay(zone), startOfNextDate(date, zone));
}
public static boolean isLeapYear(int year) {
return IsoChronology.INSTANCE.isLeapYear(year);
}
// ================================
// #endregion - others
// ================================
/** /**
* *
*/ */

View File

@ -20,6 +20,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.Month;
import java.time.ZoneId; import java.time.ZoneId;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
@ -32,13 +33,6 @@ class DateTimeToolsTests {
private static final Logger log = LoggerFactory.getLogger(DateTimeToolsTests.class); private static final Logger log = LoggerFactory.getLogger(DateTimeToolsTests.class);
@Test
void testLocalNowStr() {
String nowStr = DateTimeTools.nowStr("yyyy/MM/dd HH:mm:ss.SSS");
log.info(nowStr);
assertEquals(23, nowStr.length());
}
@Test @Test
void testToJoda() { void testToJoda() {
LocalDateTime dt = LocalDateTime.of(2008, 8, 8, 20, 18, 59, 108000000); LocalDateTime dt = LocalDateTime.of(2008, 8, 8, 20, 18, 59, 108000000);
@ -55,7 +49,8 @@ class DateTimeToolsTests {
void testToInstant() { void testToInstant() {
ZonedDateTime dt = ZonedDateTime.of(2008, 1, 8, 10, 23, 50, 108000000, ZoneId.systemDefault()); ZonedDateTime dt = ZonedDateTime.of(2008, 1, 8, 10, 23, 50, 108000000, ZoneId.systemDefault());
Instant instant = DateTimeTools.toInstant(dt.toInstant().toEpochMilli()); Instant instant = DateTimeTools.toInstant(dt.toInstant().toEpochMilli());
String str = DateTimeTools.toString("yy-M-d HH:mm:ss.SSS", instant); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yy-M-d HH:mm:ss.SSS");
String str = formatter.format(instant.atZone(ZoneId.systemDefault()));
log.info(str); log.info(str);
assertEquals("08-1-8 10:23:50.108", str); assertEquals("08-1-8 10:23:50.108", str);
} }
@ -107,4 +102,11 @@ class DateTimeToolsTests {
log.info("{}", formatter); log.info("{}", formatter);
log.info("{}", formatter2); log.info("{}", formatter2);
} }
@Test
void testToString() {
assertEquals("04", DateTimeTools.toMonthString(Month.APRIL));
assertEquals("04", DateTimeTools.toMonthString(Month.APRIL, true));
assertEquals("4", DateTimeTools.toMonthString(Month.APRIL, false));
}
} }