diff --git a/.gitignore b/.gitignore index 8af2941c9c9d065ef45235cacca7451213baf66f..f36bde14abe8d8a18be7e04598beac36e4cf3042 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +/*/logs/ /target/ /*/target/ !.mvn/wrapper/maven-wrapper.jar diff --git a/README.md b/README.md index 26ea33c147e477b53e6ed9bb8dd96ab2063d032a..994b255ae5b3a753ba0ad9581d13bcf5bc35c615 100644 --- a/README.md +++ b/README.md @@ -6,14 +6,14 @@ **spring data jdbc extend mybatis dynamic sql** ## What Is This? -* It aims at being conceptually easy. In order to achieve this it does NOT offer caching, lazy loading, write behind or many other features of JPA. This makes a simple, limited, opinionated ORM. +* It aims at being conceptually easy. In order to achieve this it does NOT offer caching, lazy loading,QueryDSL, write behind or many other features of JPA. This makes a simple, limited, opinionated ORM. -* use mybatis dynamic SQL,it is good for complex SQL +* use mybatis dynamic SQL(not dependency mybatis),it is good for complex SQL * SQL is written in Markdown -[UserInfoRepository.md](spring-data-jdbc-mybatis-test%2Fsrc%2Ftest%2Fresources%2Fsql%2FUserInfoRepository.md) +[UserInfoRepository.md](spring-data-jdbc-mybatis-demo%2Fsrc%2Fmain%2Fresources%2Fsql%2FUserInfoRepository.md) ```sql -- findUserByIds @@ -27,26 +27,23 @@ SELECT [@id column] FROM user_base ``` ## see [easy-dynamic-sql.md](easy-dynamic-sql.md) ## Features -### batch update -> need rewriteBatchedStatements=true&allowMultiQueries=true -```java -public interface UserInfoRepository extends CrudRepository { - @BatchUpdate - int batchUpdate(List list); -} -``` +### method name query [method-name-query.md](method-name-query.md) +### @Id @Table @Column +### extend CrudJdbcRepository not CrudRepository,because [curd-repository.md](curd-repository.md) +### not support @Query or QueryDSL, sql must be written in markdown +### batch update [bach-update.md](bach-update.md) ### [multi-datasource.md](multi-datasource.md) ## Getting Started with JDBC mybatis - +[UserInfoRepository.java](spring-data-jdbc-mybatis-demo%2Fsrc%2Fmain%2Fjava%2Fcom%2Fvonchange%2Fnine%2Fdemo%2Fdao%2FUserInfoRepository.java) ```java -public interface UserInfoRepository extends CrudRepository { - List findListByUserCode(@Param("userCode") String userCode); - List findUserBySearchParam(@Param("param") SearchParam searchParam); +public interface UserInfoRepository extends CrudJdbcRepository { + List findByUserCodes(@Param("userCodes") List userCodes); + List findUserBySearchParam(@Param("param") SearchParam searchParam); } ``` -> define sql in markdown [UserInfoRepository.md](spring-data-jdbc-mybatis-test%2Fsrc%2Ftest%2Fresources%2Fsql%2FUserInfoRepository.md) +> define sql in markdown [UserInfoRepository.md](spring-data-jdbc-mybatis-demo%2Fsrc%2Fmain%2Fresources%2Fsql%2FUserInfoRepository.md) > need @EnableJdbcRepositories ```java diff --git a/README.zh-CN.md b/README.zh-CN.md index 6e41b609ab3cc3c1186f436befbd9b9c210ed98b..528a815c4f1106fb1ce13338bde0ed1f542b4556 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -1,4 +1,4 @@ -## spring-data-jdbc-mybatis +## spring-data-jdbc-mybatis 大道至简 返璞归真 [![](https://img.shields.io/badge/Blog-博客-blue.svg)](http://www.vonchange.com/doc/) ![](https://img.shields.io/maven-central/v/com.vonchange.common/spring-data-jdbc-mybatis.svg?label=Maven%20Central) @@ -9,18 +9,19 @@ **spring data jdbc 扩展 mybatis 动态sql能力** ## What Is This? -* 使用jdbcTemplate,相当于直接调用jdbc。不提供缓存、延迟加载等JPA或mybatis的许多特性。一个简单、有限、固执己见的ORM +* 和spring data jdbc一样的追求简单,使用jdbcTemplate,调用jdbc。不提供缓存、延迟加载、QueryDSL等JPA或mybatis的许多特性。一个简单、有限、固执己见的ORM -* 使用mybatis动态sql能力,可以应对复杂sql +* 扩展mybatis动态sql能力(不依赖mybatis!提取了动态sql代码),可以应对复杂sql,如果换其他模板引擎或自己实现也是可以的,但有一定的学习成本,使用mybatis动态sql已比较成熟 -* SQL 写在 Markdown 里 +* SQL统一写在Markdown里,不提供@Query或QueryDSL +* 扩展简易动态sql写法 [easy-dynamic-sql.md](easy-dynamic-sql.md) -[UserInfoRepository.md](spring-data-jdbc-mybatis-test%2Fsrc%2Ftest%2Fresources%2Fsql%2FUserInfoRepository.md) +[UserInfoRepository.md](spring-data-jdbc-mybatis-demo%2Fsrc%2Fmain%2Fresources%2Fsql%2FUserInfoRepository.md) ```sql --- findUserByIds -SELECT [@id column] FROM user_base +-- findUser +SELECT [@id column] FROM user_info [@@and id in #{idList:in} and user_name like #{userName:like}] [@and user_name like userName%] @@ -28,28 +29,23 @@ SELECT [@id column] FROM user_base and create_time < #{createTime} ``` -## 更多扩展写法 ==> [easy-dynamic-sql.md](easy-dynamic-sql.md) ## 特性 -### 批量更新 -> need rewriteBatchedStatements=true&allowMultiQueries=true -```java -public interface UserInfoRepository extends CrudRepository { - @BatchUpdate - int batchUpdate(List list); -} -``` +### 支持按方法名查询 但不推荐过度使用 [method-name-query.md](method-name-query.md) +### @Id @Table @Column 极少的注解 +### crud 继成 CrudJdbcRepository 不是CrudRepository 因为需要新增和去掉部分方法 +### 不提供@Query或QueryDSL,sql统一写在markdown文件里面 +### 批量更新 [bach-update.md](bach-update.md) ### [多数据源.md](multi-datasource.md) ## Getting Started with JDBC mybatis - ```java -public interface UserInfoRepository extends CrudRepository { - List findListByUserCode(@Param("userCode") String userCode); +public interface UserInfoRepository extends CrudJdbcRepository { + List findByUserCodes(@Param("userCodes") List userCodes); List findUserBySearchParam(@Param("param") SearchParam searchParam); } ``` -> 在 markdown 定义 [UserInfoRepository.md](spring-data-jdbc-mybatis-test%2Fsrc%2Ftest%2Fresources%2Fsql%2FUserInfoRepository.md) +> 在 markdown 定义 [UserInfoRepository.md](spring-data-jdbc-mybatis-demo%2Fsrc%2Fmain%2Fresources%2Fsql%2FUserInfoRepository.md) > 只需要 @EnableJdbcRepositories 注解 ```java diff --git a/bach-update.md b/bach-update.md new file mode 100644 index 0000000000000000000000000000000000000000..b25875b3eb127de0981892ae8a70ce0238bae252 --- /dev/null +++ b/bach-update.md @@ -0,0 +1,8 @@ + +> > need rewriteBatchedStatements=true&allowMultiQueries=true +```java +public interface UserInfoRepository extends CrudJdbcRepository { + @BatchUpdate + int batchUpdate(List list); +} +``` \ No newline at end of file diff --git a/common-util/pom.xml b/common-util/pom.xml index 5a768f2e61b645823643f3c9821421fa63c7a7f6..12f8ab346faeac663afe486a60e6fdf665bd4ac2 100644 --- a/common-util/pom.xml +++ b/common-util/pom.xml @@ -14,17 +14,6 @@ - - - - org.springframework - spring-jcl - 5.3.31 - com.esotericsoftware reflectasm diff --git a/common-util/src/main/java/com/vonchange/common/util/ConvertUtil.java b/common-util/src/main/java/com/vonchange/common/util/ConvertUtil.java index 07e9f97af592293fca1f2edbec52371f08369295..c91d46f81dcd690777ea3b4cccb8d3995e316d09 100644 --- a/common-util/src/main/java/com/vonchange/common/util/ConvertUtil.java +++ b/common-util/src/main/java/com/vonchange/common/util/ConvertUtil.java @@ -82,6 +82,10 @@ public class ConvertUtil { value = toNull(value); return Converter.get().toByte(value); } + public static byte[] toBytes(Object value) { + value = toNull(value); + return Converter.get().toBytes(value); + } public static Character toCharacter(Object value) { value = toNull(value); @@ -180,6 +184,9 @@ public class ConvertUtil { if (targetType.isAssignableFrom(LocalTime.class)) { return (T) ConvertUtil.toLocalTime(value); } + if (targetType.isAssignableFrom(byte[].class)) { + return (T) ConvertUtil.toBytes(value); + } if (targetType.isEnum()) { Class type = targetType; return (T) Enum.valueOf(type, value.toString()); diff --git a/common-util/src/main/java/com/vonchange/common/util/MarkdownUtil.java b/common-util/src/main/java/com/vonchange/common/util/MarkdownUtil.java index d7078e891c10e8c5a25e0236f709bf4eb624b58d..f8779fdb67e6588a6a41e7b9e2caddcfd7323a59 100644 --- a/common-util/src/main/java/com/vonchange/common/util/MarkdownUtil.java +++ b/common-util/src/main/java/com/vonchange/common/util/MarkdownUtil.java @@ -17,20 +17,16 @@ public class MarkdownUtil { private MarkdownUtil(){ throw new IllegalStateException("Utility class"); } + private static final String ID_END= System.getenv("ID_END"); public static final String ID_PRE_SQL = "--"; public static final String ID_PRE_CODE = "//"; private static Logger log = LoggerFactory.getLogger(MarkdownUtil.class); // fileId mdId-> content private static Map> markdownDataCache=new ConcurrentHashMap<>(256); - private static final String URLSEPARATOR="/"; - public static String classPath(String id) { - if(null==id){ - return null; - } - return id.replaceAll("\\.", URLSEPARATOR); - } + private static Map idContentCache=new ConcurrentHashMap<>(256); + public static synchronized Map readMarkdownFile(String id,boolean notFoundError){ - String path= classPath(id); + String path= UtilAll.UFile.classPath(id); InputStream inputStream = UtilAll.UFile.getClassResource(path+".md"); if(null==inputStream){ if(!notFoundError){ @@ -132,35 +128,58 @@ public class MarkdownUtil { } return newSb.toString(); } + private static String extendContent(Map contentMap,String codeId) { + if(null!=ID_END&&!"".equals(ID_END)){ + if(contentMap.containsKey(codeId+ID_END)){ + codeId=codeId+ID_END; + } + } String content =contentMap.get(codeId); /* 支持[@Id 递归实现*/ return getIdSpinner(contentMap,content); } + public static boolean hasId(String id) { + return idContentCache.containsKey(id); + } public static String getContent(String id,boolean notFoundThrowError) { + if(idContentCache.containsKey(id)){ + return idContentCache.get(id); + } + Assert.notNull(id,"id can not null"); + if(!id.contains(StringPool.DOT)){ + if(!notFoundThrowError){ + return null; + } + throw new UtilException(EnumUtilErrorCode.MarkdownIdNotFound,id+" not found"); + } String filePath= UtilAll.UString.substringBeforeLast(id, StringPool.DOT); String codeId= id.substring(filePath.length()+1); Map contentMap= loadMdData(filePath); - if(null==contentMap.get(codeId)){ + if(!contentMap.containsKey(codeId)){ if(!notFoundThrowError){ return null; } throw new UtilException(EnumUtilErrorCode.MarkdownIdNotFound,id+" not found"); } - return extendContent(contentMap,codeId); + String content= extendContent(contentMap,codeId); + if(UtilAll.UString.isNotBlank(content)){ + idContentCache.put(id,content); + } + return content; } public static String getContent(String id) { return getContent(id,true); } - private static Map loadMdData(String id){ + private static Map loadMdData(String fileId){ Map contentMap = null; - if(markdownDataCache.containsKey(id)){ - contentMap= markdownDataCache.get(id); + if(markdownDataCache.containsKey(fileId)){ + contentMap= markdownDataCache.get(fileId); } if(null==contentMap){ - contentMap=readMarkdownFile(id,true); + contentMap=readMarkdownFile(fileId,true); } return contentMap; } diff --git a/common-util/src/main/java/com/vonchange/common/util/StringPool.java b/common-util/src/main/java/com/vonchange/common/util/StringPool.java index 968b4a061a34a9e3dcba72beec114e4ffaa69690..878c99b84e024344b05d4b8376638f326e40bcbe 100644 --- a/common-util/src/main/java/com/vonchange/common/util/StringPool.java +++ b/common-util/src/main/java/com/vonchange/common/util/StringPool.java @@ -6,6 +6,7 @@ package com.vonchange.common.util; public interface StringPool { + String markdown_suffix=".md"; String AMPERSAND = "&"; String AND = "and"; String AT = "@"; diff --git a/common-util/src/main/java/com/vonchange/common/util/UtilAll.java b/common-util/src/main/java/com/vonchange/common/util/UtilAll.java index 6cc4b8d3a5c25649ce09118acdbc4f5435e5376b..e86f1ee52e58b0586c4289f84e357a0dbaf213d3 100644 --- a/common-util/src/main/java/com/vonchange/common/util/UtilAll.java +++ b/common-util/src/main/java/com/vonchange/common/util/UtilAll.java @@ -12,6 +12,7 @@ import java.io.InputStreamReader; import java.io.Reader; import java.io.UnsupportedEncodingException; import java.io.Writer; +import java.net.URL; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -20,6 +21,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -74,7 +76,28 @@ public class UtilAll { else return ""; } - //classpath:com/test/a.md + private static Map resourceExistMap = new ConcurrentHashMap<>(); + public static boolean isClassResourceExist(String location){ + if(resourceExistMap.containsKey(location)){ + return resourceExistMap.get(location); + } + ClassLoader classLoader = getDefaultClassLoader(); + if(null==classLoader){ + return false; + } + URL url= classLoader.getResource(location); + boolean flag = null!=url; + if(flag){ + resourceExistMap.put(location,true); + } + return flag; + } + public static String classPath(String id) { + if(null==id){ + return null; + } + return id.replaceAll("\\.", URLSEPARATOR); + } public static InputStream getClassResource(String location){ //PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver(); //return patternResolver.getResource(location); @@ -192,6 +215,16 @@ public class UtilAll { String uuid = UUID.randomUUID().toString(); return remove(uuid, "-"); } + public static String substringBefore(final String str, final String separator) { + if (isEmpty(str) || isEmpty(separator)) { + return str; + } + final int pos = str.indexOf(separator); + if (pos == -1) { + return str; + } + return str.substring(0, pos); + } public static String substringBeforeLast(final String str, final String separator) { if (isEmpty(str) || isEmpty(separator)) { return str; @@ -202,7 +235,19 @@ public class UtilAll { } return str.substring(0, pos); } - + public static String substringAfter(final String str, final String separator) { + if (isEmpty(str)) { + return str; + } + if (isEmpty(separator)) { + return EMPTY; + } + final int pos = str.indexOf(separator); + if (pos == -1 || pos == str.length() - separator.length()) { + return EMPTY; + } + return str.substring(pos + separator.length()); + } public static String substringAfterLast(final String str, final String separator) { if (isEmpty(str)) { return str; diff --git a/common-util/src/main/java/com/vonchange/common/util/bean/convert/Converter.java b/common-util/src/main/java/com/vonchange/common/util/bean/convert/Converter.java index 7007fd636c41ac2f69b604a365a46342c9e6a198..c06923ed40818a7f8bd5d68676a6873c20da7007 100644 --- a/common-util/src/main/java/com/vonchange/common/util/bean/convert/Converter.java +++ b/common-util/src/main/java/com/vonchange/common/util/bean/convert/Converter.java @@ -389,6 +389,9 @@ public class Converter { public Byte toByte(final Object value) { return (Byte) getConvert(Byte.class).convert(value); } + public byte[] toBytes(final Object value) { + return (byte[]) getConvert(byte[].class).convert(value); + } /** * Converts value to Byte. Returns default value diff --git a/curd-repository.md b/curd-repository.md new file mode 100644 index 0000000000000000000000000000000000000000..000cff88c7448a383cfc401e0110fea8c5e132af --- /dev/null +++ b/curd-repository.md @@ -0,0 +1,21 @@ + ## first We don't need global updates, and this is a dangerous operation + + ``` + long count(); + void deleteAll(); + Iterable findAll(); + ``` + +## deleteById is ok + +``` +void delete(T entity); +void deleteAll(Iterable entities); +``` + +## add methods return update num +``` + int saveAll(Iterable entities,int batchSize); + int update(S entity); + int updateAllField(S entity); +``` \ No newline at end of file diff --git a/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/config/ConstantJdbc.java b/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/config/ConstantJdbc.java index cb93a0f3c0407256f759cf64fe865a7bf96270cc..7cc2100dc0ccd03c49e0ff89a691f02cca9da107 100644 --- a/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/config/ConstantJdbc.java +++ b/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/config/ConstantJdbc.java @@ -7,10 +7,9 @@ public class ConstantJdbc { private ConstantJdbc() { throw new IllegalStateException("Utility class");} public static final String DataSourceDefault= "dataSource"; - public static class DataSource{ - public static final String DEFAULT = "dataSource"; - public static final String FLAG = "@ds:"; - } + public static final String EntityType= "entityType"; + public static final String SqlPackage= "sql"; + public static final String SQL_START= "@sql"; public static final String COUNTFLAG = "Count"; public static final String MAPFIELDSPLIT = "#"; } diff --git a/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/core/AbstractJdbcCore.java b/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/core/AbstractJdbcCore.java index 6c1c9aa5da347024b5c68734077b034092a21868..d4f55513d1630da8ad8530f76ee88d496fe6c56f 100644 --- a/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/core/AbstractJdbcCore.java +++ b/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/core/AbstractJdbcCore.java @@ -1,5 +1,6 @@ package com.vonchange.jdbc.abstractjdbc.core; + import com.vonchange.common.util.Assert; import com.vonchange.common.util.ConvertUtil; import com.vonchange.common.util.MarkdownUtil; @@ -23,6 +24,7 @@ import com.vonchange.jdbc.abstractjdbc.handler.ScalarHandler; import com.vonchange.jdbc.abstractjdbc.model.DataSourceWrapper; import com.vonchange.jdbc.abstractjdbc.template.MyJdbcTemplate; import com.vonchange.jdbc.abstractjdbc.util.ConvertMap; +import com.vonchange.jdbc.abstractjdbc.util.NameQueryUtil; import com.vonchange.jdbc.abstractjdbc.util.sql.SqlFill; import com.vonchange.mybatis.dialect.Dialect; import com.vonchange.mybatis.exception.JdbcMybatisRuntimeException; @@ -36,6 +38,7 @@ import org.slf4j.LoggerFactory; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; +import org.springframework.util.CollectionUtils; import java.beans.IntrospectionException; import java.util.ArrayList; @@ -70,7 +73,7 @@ public abstract class AbstractJdbcCore implements JdbcRepository { private Dialect dialect = null; - private static final Integer batchSizeDefault=100; + private static final Integer batchSizeDefault=500; private Dialect getDialect(DataSourceWrapper dataSourceWrapper) { if (null != dataSourceWrapper && null != dataSourceWrapper.getDialect()) { @@ -115,16 +118,11 @@ public abstract class AbstractJdbcCore implements JdbcRepository { return myJdbcTemplate; } - public final int insertBatch(List entityList, int batchSize) { - return insertBatch(null, entityList, batchSize); - } - - public final int insertBatch(DataSourceWrapper dataSourceWrapper, List entityList, int batchSize) { - return insertBatch(dataSourceWrapper, entityList, false, batchSize); + public final int insertBatch(List entityList, boolean ifNullInsert,int batchSize) { + return insertBatch(null, entityList,ifNullInsert, batchSize); } - public final int insertBatch(DataSourceWrapper dataSourceWrapper, List entityList, boolean ifNullInsert, - int batchSize) { + public final int insertBatch(DataSourceWrapper dataSourceWrapper, List entityList, boolean ifNullInsert, int batchSize) { if (null == entityList || entityList.isEmpty()) { return 0; } @@ -190,9 +188,6 @@ public abstract class AbstractJdbcCore implements JdbcRepository { } private static Object getPublicPro(Object bean, String name) { - if (name.equals("serialVersionUID")) {// ?????? - return null; - } return BeanUtil.getProperty(bean, name); } @@ -279,7 +274,7 @@ public abstract class AbstractJdbcCore implements JdbcRepository { values.add(value); continue; } - if(isNullUpdate){ + if(isNullUpdate&&!entityField.getUpdateNotNull()){ columns.add(UtilAll.UString.format("{} = {}",entityField.getColumnName(),StringPool.QUESTION_MARK)); values.add(null); } @@ -295,25 +290,94 @@ public abstract class AbstractJdbcCore implements JdbcRepository { } // crud end - public final T queryById(DataSourceWrapper dataSourceWrapper, Class type, Object id) { - String sql = generateQueryByIdSql(type); - return queryOne(dataSourceWrapper, type, sql, id); + public final T queryById(DataSourceWrapper dataSourceWrapper, Class type, ID id) { + SqlWithParam sqlWithParam = genIdEqQuery(true,false,type,id); + return queryOne(dataSourceWrapper, type, sqlWithParam.getSql(), id); + } + @Override + public List queryByIds(DataSourceWrapper dataSourceWrapper, Class domainType, List ids) { + SqlWithParam sqlWithParam = genIdInQuery(true,domainType,ids); + return queryList(dataSourceWrapper, domainType, sqlWithParam.getSql(), sqlWithParam.getParams()); } - public final T queryById(Class type, Object id) { + public final T queryById(Class type, ID id) { return queryById(null, type, id); } + public int deleteById(DataSourceWrapper dataSourceWrapper, Class domainType, ID id){ + SqlWithParam sqlWithParam = genIdEqQuery(false,false,domainType,id); + return update(dataSourceWrapper,sqlWithParam.getSql(), id); + } + + public int deleteByIds(DataSourceWrapper dataSourceWrapper, Class domainType, List ids){ + SqlWithParam sqlWithParam = genIdInQuery(false,domainType,ids); + return update(dataSourceWrapper,sqlWithParam.getSql(), sqlWithParam.getParams()); + } + + public boolean existsById(DataSourceWrapper dataSourceWrapper, Class domainType, ID id){ + SqlWithParam sqlWithParam = genIdEqQuery(true,true,domainType,id); + return ConvertUtil.toBoolean(queryOneColumn(dataSourceWrapper,sqlWithParam.getSql(),1,id)); + } + - private String generateQueryByIdSql(Class type) { + private SqlWithParam genIdEqQuery(boolean select,boolean count,Class type,ID id){ + if(null==id){ + throw new JdbcMybatisRuntimeException("id must not null"); + } initEntityInfo(type); EntityInfo entityInfo = EntityUtil.getEntityInfo(type); - List entityFieldList = entityInfo.getEntityFields(); - String columnStr= entityFieldList.stream().filter(item->!item.getIsColumn()).map(EntityField::getColumnName) - .collect(Collectors.joining(StringPool.COMMA)); + String columnStr=null; + if(select){ + if(count){ + columnStr="count(1)"; + }else{ + List entityFieldList = entityInfo.getEntityFields(); + columnStr= entityFieldList.stream().filter(EntityField::getIsColumn).map(EntityField::getColumnName) + .collect(Collectors.joining(StringPool.COMMA)); + } + } String idName = entityInfo.getIdColumnName(); Assert.notNull(idName,"@Id must not null"); - return UtilAll.UString.format("select {} from {} where {} = ?", columnStr, entityInfo.getTableName(), + String sql="delete"; + if(select){ + sql="select "+columnStr; + } + sql= sql+UtilAll.UString.format( + " from {} where {} = ?", entityInfo.getTableName(), idName); + SqlWithParam sqlWithParam = new SqlWithParam(); + sqlWithParam.setParams(new Object[]{id}); + sqlWithParam.setSql(sql); + return sqlWithParam; + } + private SqlWithParam genIdInQuery(boolean select, Class type, List ids){ + if(null==ids||ids.isEmpty()){ + throw new JdbcMybatisRuntimeException("ids must not empty"); + } + initEntityInfo(type); + EntityInfo entityInfo = EntityUtil.getEntityInfo(type); + String columnStr=null; + if(select){ + List entityFieldList = entityInfo.getEntityFields(); + columnStr= entityFieldList.stream().filter(EntityField::getIsColumn).map(EntityField::getColumnName) + .collect(Collectors.joining(StringPool.COMMA)); + } + String idName = entityInfo.getIdColumnName(); + Assert.notNull(idName,"@Id must not null"); + StringBuilder idParam=new StringBuilder("("); + for (ID id : ids) { + idParam.append("?").append(","); + } + String sql="delete"; + if(select){ + sql="select "+columnStr; + } + sql= sql+UtilAll.UString.format( + " from {} where {} in {}", entityInfo.getTableName(), + idName,idParam.substring(0,idParam.length()-1)+")"); + SqlWithParam sqlWithParam = new SqlWithParam(); + sqlWithParam.setParams(ids.toArray()); + sqlWithParam.setSql(sql); + return sqlWithParam; } public final List queryList(DataSourceWrapper dataSourceWrapper, Class type, String sqlId, @@ -328,8 +392,8 @@ public abstract class AbstractJdbcCore implements JdbcRepository { public T queryOne(DataSourceWrapper dataSourceWrapper, Class type, String sqlId, Map parameter) { - SqlWithParam sqlParmeter = getSqlParameter(dataSourceWrapper,sqlId, parameter); - List list = queryList(dataSourceWrapper, type, sqlParmeter.getSql(), sqlParmeter.getParams()); + SqlWithParam sqlParameter = getSqlParameter(dataSourceWrapper,sqlId, parameter); + List list = queryList(dataSourceWrapper, type, sqlParameter.getSql(), sqlParameter.getParams()); if (list.isEmpty()) { return null; } @@ -476,6 +540,19 @@ public abstract class AbstractJdbcCore implements JdbcRepository { private SqlWithParam getSqlParameter(DataSourceWrapper dataSourceWrapper,String sqlId, Map parameter) { + if(!sqlId.contains(StringPool.DOT)){ + //namedQuery + if(!parameter.containsKey(ConstantJdbc.EntityType)){ + throw new JdbcMybatisRuntimeException("This method is not supported for converting to SQL"); + } + Class entityType= (Class) parameter.get(ConstantJdbc.EntityType); + parameter.remove(ConstantJdbc.EntityType); + SqlWithParam sqlWithParam= NameQueryUtil.nameSql(sqlId,entityType,parameter); + if(null==sqlWithParam){ + throw new JdbcMybatisRuntimeException("{} can not generate sql by method name,please define in the markdown",sqlId); + } + return sqlWithParam; + } return MybatisTpl.generate(sqlId,parameter, getDialect(dataSourceWrapper)); } @@ -573,7 +650,7 @@ public abstract class AbstractJdbcCore implements JdbcRepository { } // ================================= base - public List queryList(DataSourceWrapper dataSourceWrapper, Class type, String sql, Object... args) { + public List queryList(DataSourceWrapper dataSourceWrapper, Class type, String sql, Object... args) { logSql(Constants.EnumRWType.read, sql, args); MyJdbcTemplate jdbcTemplate = initJdbcTemplate(dataSourceWrapper, Constants.EnumRWType.read); return jdbcTemplate.query(sql, new BeanListHandler<>(type), args); @@ -654,6 +731,7 @@ public abstract class AbstractJdbcCore implements JdbcRepository { return jdbcTemplate.batchUpdate(sql, batchArgs); } + private void logSql(Constants.EnumRWType enumRWType, String sql, Object... params) { if (log.isDebugEnabled()) { log.debug("\norg sql: {}\nparams: {}", sql, params); diff --git a/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/core/JdbcRepository.java b/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/core/JdbcRepository.java index 495926096acbc96bdccbeb25ec6422d211e4e4c7..54e94ccfdab2f51df2e3a2027365811cd291da3a 100644 --- a/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/core/JdbcRepository.java +++ b/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/core/JdbcRepository.java @@ -15,7 +15,7 @@ public interface JdbcRepository { int updateAllField(T entity); - int insertBatch(List entityList, int size); + int insertBatch(List entityList,boolean ifNullInsert, int size); int batchUpdate(String sqlId, List entityList,int size); @@ -23,8 +23,8 @@ public interface JdbcRepository { int update(DataSourceWrapper dataSourceWrapper,T entity); int updateAllField(DataSourceWrapper dataSourceWrapper,T entity); - - int insertBatch(DataSourceWrapper dataSourceWrapper,List entityList,int size); + int insertBatch(DataSourceWrapper dataSourceWrapper, List entityList, boolean ifNullInsert, + int batchSize); int batchUpdate(DataSourceWrapper dataSourceWrapper, String sqlId, List entityList,int size); DataSourceWrapper getReadDataSource(); @@ -37,7 +37,7 @@ public interface JdbcRepository { T queryOne(Class type, String sqlId, Map parameter); - T queryById(Class type, Object id); + T queryById(Class type, ID id); Page queryPage(Class type, String sqlId, Pageable pageable, Map parameter); @@ -64,7 +64,7 @@ public interface JdbcRepository { T queryOne(DataSourceWrapper dataSourceWrapper, Class type, String sqlId, Map parameter); - T queryById(DataSourceWrapper dataSourceWrapper, Class type, Object id); + T queryById(DataSourceWrapper dataSourceWrapper, Class type, ID id); Page queryPage(DataSourceWrapper dataSourceWrapper, Class type, String sqlId, Pageable pageable, Map parameter); @@ -92,4 +92,11 @@ public interface JdbcRepository { Map queryToMap(DataSourceWrapper dataSourceWrapper, Class c, String sqlId, String keyInMap, Map parameter); + List queryByIds(DataSourceWrapper dataSourceWrapper, Class domainType, List ids); + + int deleteById(DataSourceWrapper dataSourceWrapper, Class domainType, ID id); + + int deleteByIds(DataSourceWrapper dataSourceWrapper, Class domainType, List ids); + + boolean existsById(DataSourceWrapper dataSourceWrapper, Class domainType, ID id); } diff --git a/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/model/EnumStep.java b/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/model/EnumStep.java new file mode 100644 index 0000000000000000000000000000000000000000..3c64a6a76716dd60b5bde011739dfad8838a88c0 --- /dev/null +++ b/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/model/EnumStep.java @@ -0,0 +1,9 @@ +package com.vonchange.jdbc.abstractjdbc.model; + +public enum EnumStep { + Column,Condition,Join,Value,End,ORDER; + + EnumStep() { + } + +} diff --git a/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/model/SplitMap.java b/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/model/SplitMap.java new file mode 100644 index 0000000000000000000000000000000000000000..0e2d0f3b75217171ea832da7ab303ecaad55d193 --- /dev/null +++ b/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/model/SplitMap.java @@ -0,0 +1,29 @@ +package com.vonchange.jdbc.abstractjdbc.model; + +public class SplitMap { + private String split; + private EnumStep enumStep; + public SplitMap(){ + + } + public SplitMap(String split, EnumStep enumStep) { + this.split = split; + this.enumStep = enumStep; + } + + public String getSplit() { + return split; + } + + public void setSplit(String split) { + this.split = split; + } + + public EnumStep getEnumStep() { + return enumStep; + } + + public void setEnumStep(EnumStep enumStep) { + this.enumStep = enumStep; + } +} diff --git a/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/util/ConvertMap.java b/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/util/ConvertMap.java index f79c67726e2bc632478641102b0928d2e2a7b6fa..a7fad158c481fd4bef6c8ae7ef8cdbeba1bb1186 100644 --- a/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/util/ConvertMap.java +++ b/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/util/ConvertMap.java @@ -60,7 +60,7 @@ public class ConvertMap { entity = (T) type.newInstance(); } catch (InstantiationException e) { throw new JdbcMybatisRuntimeException( - "java.lang.InstantiationException " + type.getName() + " need no-arguments constructor"); + "java.lang.InstantiationException {} need no-arguments constructor",type.getName()); } } EntityInfo entityInfo = EntityUtil.getEntityInfo(type); diff --git a/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/util/NameQueryUtil.java b/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/util/NameQueryUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..d4965735b3924f7226cfcf57a8da157ff8082c7f --- /dev/null +++ b/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/util/NameQueryUtil.java @@ -0,0 +1,237 @@ +package com.vonchange.jdbc.abstractjdbc.util; + +import com.vonchange.common.util.StringPool; +import com.vonchange.common.util.UtilAll; +import com.vonchange.common.util.bean.BeanUtil; +import com.vonchange.jdbc.abstractjdbc.model.EnumStep; +import com.vonchange.jdbc.abstractjdbc.model.SplitMap; +import com.vonchange.mybatis.exception.JdbcMybatisRuntimeException; +import com.vonchange.mybatis.tpl.EntityUtil; +import com.vonchange.mybatis.tpl.MybatisTpl; +import com.vonchange.mybatis.tpl.OrmUtil; +import com.vonchange.mybatis.tpl.model.EntityField; +import com.vonchange.mybatis.tpl.model.EntityInfo; +import com.vonchange.mybatis.tpl.model.SqlWithParam; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static com.vonchange.common.util.StringPool.EMPTY; + +public class NameQueryUtil { + private static final Logger log = LoggerFactory.getLogger(NameQueryUtil.class); + private static final String ParamPre="p"; + private static final Map map=new HashMap<>(); + static { + map.put("eq",new SplitMap("=",EnumStep.Condition)); + map.put("equals",new SplitMap("=",EnumStep.Condition)); + map.put("is",new SplitMap("=",EnumStep.Condition)); + map.put("lt",new SplitMap("<",EnumStep.Condition)); + map.put("before",new SplitMap("<",EnumStep.Condition)); + //map.put("less_than",new SplitMap("<",EnumStep.Condition)); + map.put("lte",new SplitMap("<=",EnumStep.Condition)); + //map.put("less_than_equal",new SplitMap("<=",EnumStep.Condition)); + map.put("gt",new SplitMap(">",EnumStep.Condition)); + map.put("after",new SplitMap(">",EnumStep.Condition)); + //map.put("greater_than",new SplitMap(">",EnumStep.Condition)); + map.put("gte",new SplitMap(">=",EnumStep.Condition)); + //map.put("greater_than_equal",new SplitMap(">=",EnumStep.Condition)); + map.put("not",new SplitMap("!=",EnumStep.Condition)); + map.put("in",new SplitMap("in",EnumStep.Condition)); + map.put("not_in",new SplitMap("not in",EnumStep.Condition)); + map.put("like",new SplitMap("like",EnumStep.Condition)); + map.put("not_like",new SplitMap("like",EnumStep.Condition)); + map.put("between",new SplitMap("between",EnumStep.Condition)); + map.put("order_by",new SplitMap("order by",EnumStep.End)); + map.put("and", new SplitMap("and",EnumStep.Join)); + map.put("or", new SplitMap("or",EnumStep.Join)); + map.put("desc", new SplitMap("desc",EnumStep.ORDER)); + map.put("asc", new SplitMap("asc",EnumStep.ORDER)); + } + private static final Map orderMap=new HashMap<>(); + static { + orderMap.put("desc", new SplitMap("desc",EnumStep.ORDER)); + orderMap.put("asc", new SplitMap("asc",EnumStep.ORDER)); + } + public static String orderSql(String orderBy,Class entityType){ + if(orderBy.contains(StringPool.SPACE)){ + throw new JdbcMybatisRuntimeException("orderBy can not contain space"); + } + if(!orderBy.startsWith("orderBy")){ + throw new JdbcMybatisRuntimeException("must start with orderBy"); + } + orderBy=orderBy.substring(7); + EntityInfo entityInfo = EntityUtil.getEntityInfo(entityType); + String[] splits= OrmUtil.toSql(orderBy).split(StringPool.UNDERSCORE); + Map columnsMap= new HashMap<>(); + for (EntityField entityField : entityInfo.getEntityFields()) { + columnsMap.put(entityField.getColumnName(),new SplitMap(entityField.getColumnName(),EnumStep.Column)); + } + columnsMap.putAll(orderMap); + SplitMap lastSplit =new SplitMap("",EnumStep.Column); + StringBuilder sql=new StringBuilder(StringPool.SPACE); + int i =0; + while (i=splits.length){ + break; + } + if(columnsMap.containsKey(stringBuilder.toString())){ + mapKey=stringBuilder.toString(); + sqlSplit=columnsMap.get(mapKey).getSplit(); + i=j+1; + flag=true; + } + if(j entityType, Map parameter){ + EntityInfo entityInfo = EntityUtil.getEntityInfo(entityType); + if(!(method.startsWith("find")||method.startsWith("count"))){ + throw new JdbcMybatisRuntimeException("{} can not generate sql by method name,must start with find or count,please define in the markdown",method); + } + String newMethod=UtilAll.UString.substringAfter(method,"By"); + if("".equals(newMethod)){ + return null; + } + String[] splits= OrmUtil.toSql(newMethod).split(StringPool.UNDERSCORE); + StringBuilder sql=new StringBuilder(); + sql.append("select ") + .append(entityInfo.getEntityFields().stream().map(EntityField::getColumnName).collect(Collectors.joining(","))) + .append(" from ").append(entityInfo.getTableName()).append(" where "); + Map columnsMap= new HashMap<>(); + for (EntityField entityField : entityInfo.getEntityFields()) { + columnsMap.put(entityField.getColumnName(),new SplitMap(entityField.getColumnName(),EnumStep.Column)); + } + columnsMap.putAll(map); + int index =0; + SplitMap lastSplit =new SplitMap("",EnumStep.Column); + int i=0; + List objectList= new ArrayList<>(); + for (Map.Entry entry : parameter.entrySet()) { + objectList.add(entry.getValue()); + } + while (i=splits.length){ + break; + } + if(columnsMap.containsKey(stringBuilder.toString())){ + mapKey=stringBuilder.toString(); + sqlSplit=columnsMap.get(mapKey).getSplit(); + i=j+1; + flag=true; + } + if(j newParams= new ArrayList<>(); + for (Object value : objectList) { + if (value instanceof Collection) { + Collection collection= (Collection) value; + newParams.addAll(collection); + }else{ + newParams.add(value); + } + } + sqlWithParam.setParams(newParams.toArray()); + log.debug("gen sql {}",sql); + return sqlWithParam; + } + + private static int genMybatisSql(SplitMap lastSplit, StringBuilder sql, int index,Object value){ + String split =lastSplit.getSplit(); + if(lastSplit.getEnumStep().equals(EnumStep.Column)){ + sql.append(" = "); + } + if(split.equals("in")||split.equals("not in")){ + if (!(value instanceof Collection||value.getClass().isArray())){ + throw new JdbcMybatisRuntimeException("in query parameter must collection or array"); + } + StringBuilder inSb=new StringBuilder("("); + if (value instanceof Collection) { + for (Object o : (Collection) value) { + inSb.append("?,"); + } + } + if (value.getClass().isArray()) { + for (Object o : (Object[]) value) { + inSb.append("?,"); + } + } + sql.append(inSb.substring(0,inSb.length()-1)).append(")"); + return index; + } + if(split.equals("between")){ + sql.append("? and ? "); + return index+1; + } + sql.append("? "); + return index; + + } + + +} diff --git a/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/util/sql/AbstractSqlDialectUtil.java b/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/util/sql/AbstractSqlDialectUtil.java deleted file mode 100644 index 34367e146455da2c25b389528f8eb1e5a288e9c1..0000000000000000000000000000000000000000 --- a/jdbc-mybatis/src/main/java/com/vonchange/jdbc/abstractjdbc/util/sql/AbstractSqlDialectUtil.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.vonchange.jdbc.abstractjdbc.util.sql; - -import com.vonchange.jdbc.abstractjdbc.config.ConstantJdbc; -import com.vonchange.mybatis.dialect.Dialect; -import com.vonchange.mybatis.dialect.MySQLDialect; -import com.vonchange.mybatis.dialect.OracleDialect; - - -/** - * Created by 冯昌义 on 2018/4/17. - */ -public abstract class AbstractSqlDialectUtil { - protected abstract Dialect getDefaultDialect(); - protected abstract String getDataSource(); - public Dialect getDialect(String sql){ - if(sql.contains("@mysql")){ - return new MySQLDialect(); - } - if(sql.contains("@oracle")){ - return new OracleDialect(); - } - return getDefaultDialect(); - } - public String getDataSource(String sql){ - if(sql.contains(ConstantJdbc.DataSource.FLAG)){ - int start=sql.indexOf(ConstantJdbc.DataSource.FLAG); - int end = sql.indexOf(' ',start+ConstantJdbc.DataSource.FLAG.length()); - return sql.substring(start+ConstantJdbc.DataSource.FLAG.length(),end); - } - if(null==getDataSource()){ - return ConstantJdbc.DataSource.DEFAULT; - } - return getDataSource(); - } -} diff --git a/jdbc-mybatis/src/main/java/com/vonchange/jdbc/springjdbc/repository/JdbcRepositoryImpl.java b/jdbc-mybatis/src/main/java/com/vonchange/jdbc/springjdbc/repository/JdbcRepositoryImpl.java index d374c65acc55c4e0dfba578187890567a88e93fd..60d487cbb530c59a24d8f15fb7c043cc5362842b 100644 --- a/jdbc-mybatis/src/main/java/com/vonchange/jdbc/springjdbc/repository/JdbcRepositoryImpl.java +++ b/jdbc-mybatis/src/main/java/com/vonchange/jdbc/springjdbc/repository/JdbcRepositoryImpl.java @@ -7,6 +7,7 @@ import com.vonchange.mybatis.dialect.Dialect; import com.vonchange.mybatis.dialect.MySQLDialect; import javax.sql.DataSource; +import java.util.List; public class JdbcRepositoryImpl extends AbstractJdbcCore { private DataSource dataSource; @@ -25,6 +26,7 @@ public class JdbcRepositoryImpl extends AbstractJdbcCore { + @Override protected DataSourceWrapper getWriteDataSource() { return new DataSourceWrapper(dataSource, ConstantJdbc.DataSourceDefault); diff --git a/method-name-query.md b/method-name-query.md new file mode 100644 index 0000000000000000000000000000000000000000..59729bcbb255fe6cbc3b670e095e7febd3a893ca --- /dev/null +++ b/method-name-query.md @@ -0,0 +1,20 @@ +## method name query + +| keyword | sample | SQL | +|:--------|:--------------------------------|:---------------------------------------------------------------------------------------------------------------------------| +| And | findByLastnameAndFirstname | ... where lastname = ? and firstname = ? | +| Or | findByLastnameOrFirstname | ... where lastname = ? or firstname = ? | +| Is, Eq | findByLastnameEq/findByLastname | … where lastname = ? | +| not | findByLastnameNot | … where lastname != ? | +| Between | findByStartDateBetween | … where startDate between ? and ? | +| Lt | findByStartDateLt | … where startDate > ? | +| Lte | findByStartDateLte | … where startDate >= ? | +| Gt | findByStartDateGr | … where startDate > ? | +| Gte | findByStartDateGte | … where startDate >= ? | +| After | findByStartDateAfter | … where startDate > ? | +| Before | findByStartDateBefore | … where startDate < ? | +| Like | findByFirstnameLike | … where firstname like ? | +| NotLike | findByFirstnameNotLike | … where firstname not like ? | +| OrderBy | findByAgeOrderByLastnameDesc | … where age = ? order by lastname desc | +| in | findByAgeIn | … where age in (?,?) | +| NotIn | findByAgeNotIn | … where age not in (?,?) | \ No newline at end of file diff --git a/mybatis-sql-extend-test/pom.xml b/mybatis-sql-extend-test/pom.xml index 0977957b185ce22807c99fae33fcb6890ed3a42f..ae38ed95823c6ff93b8b2aff86ed76c188d62b00 100644 --- a/mybatis-sql-extend-test/pom.xml +++ b/mybatis-sql-extend-test/pom.xml @@ -26,10 +26,22 @@ org.springframework.boot spring-boot-starter-jdbc + + + org.springframework.boot + spring-boot-starter-logging + + org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-logging + + diff --git a/mybatis-sql-extend/pom.xml b/mybatis-sql-extend/pom.xml index 009251d928aa9df3b1b346d112c6fdca1b9abc08..3a508cfdc4c9ca1d777cfb71cc39639827221bbc 100644 --- a/mybatis-sql-extend/pom.xml +++ b/mybatis-sql-extend/pom.xml @@ -21,12 +21,6 @@ slf4j-api 2.0.11 - - org.springframework - spring-core - 5.1.5.RELEASE - provided - \ No newline at end of file diff --git a/mybatis-sql-extend/src/main/java/com/vonchange/mybatis/dialect/H2Dialect.java b/mybatis-sql-extend/src/main/java/com/vonchange/mybatis/dialect/H2Dialect.java index 10dffff765fe5c89f3a90a5088af17e5e2304ea7..5d98eaf4d3f4b9afabe194e0594c6310f8217b43 100644 --- a/mybatis-sql-extend/src/main/java/com/vonchange/mybatis/dialect/H2Dialect.java +++ b/mybatis-sql-extend/src/main/java/com/vonchange/mybatis/dialect/H2Dialect.java @@ -24,7 +24,7 @@ public class H2Dialect implements Dialect { @Override public int getBigDataFetchSize() { - return 200; + return 500; } @Override diff --git a/mybatis-sql-extend/src/main/java/com/vonchange/mybatis/exception/JdbcMybatisRuntimeException.java b/mybatis-sql-extend/src/main/java/com/vonchange/mybatis/exception/JdbcMybatisRuntimeException.java index 9d2976cb8998669d3201752c735787d6ad307065..16ce919a1f98b13cf627181d41000ab2b39843aa 100644 --- a/mybatis-sql-extend/src/main/java/com/vonchange/mybatis/exception/JdbcMybatisRuntimeException.java +++ b/mybatis-sql-extend/src/main/java/com/vonchange/mybatis/exception/JdbcMybatisRuntimeException.java @@ -23,6 +23,9 @@ public class JdbcMybatisRuntimeException extends RuntimeException { public JdbcMybatisRuntimeException(String message, Object... parameters) { super(UtilAll.UString.format(message, parameters)); } + public JdbcMybatisRuntimeException(Throwable cause,String message, Object... parameters) { + super(UtilAll.UString.format(message, parameters),cause); + } public JdbcMybatisRuntimeException(String message) { super(message); } diff --git a/mybatis-sql-extend/src/main/java/com/vonchange/mybatis/sql/DynamicSql.java b/mybatis-sql-extend/src/main/java/com/vonchange/mybatis/sql/DynamicSql.java index ae388d2bc0de6ac45f537dee4534f7f129528f39..7f3128054686a5f0a0d254ddd02c5f48199cd89f 100644 --- a/mybatis-sql-extend/src/main/java/com/vonchange/mybatis/sql/DynamicSql.java +++ b/mybatis-sql-extend/src/main/java/com/vonchange/mybatis/sql/DynamicSql.java @@ -39,7 +39,7 @@ public class DynamicSql { newSql.append(i == 0 ? sql : sql.substring(i)); break; } - newSql.append(sql.substring(i, ndx)); + newSql.append(sql, i, ndx); ndx += startLen; // newSql int ndx2 = sql.indexOf(endSym, ndx); diff --git a/mybatis-template/src/main/java/com/vonchange/mybatis/tpl/MybatisTpl.java b/mybatis-template/src/main/java/com/vonchange/mybatis/tpl/MybatisTpl.java index 7400abd0b44f5a215d5b8a4e33f38382cd087fbe..d195af5087570b4ac31ccca21c414cea81b025ea 100644 --- a/mybatis-template/src/main/java/com/vonchange/mybatis/tpl/MybatisTpl.java +++ b/mybatis-template/src/main/java/com/vonchange/mybatis/tpl/MybatisTpl.java @@ -28,12 +28,11 @@ import java.util.Properties; */ public class MybatisTpl { private static Logger logger = LoggerFactory.getLogger(MybatisTpl.class); - public static final String MARKDOWN_SQL_ID ="markdown_sql_id"; - public static final String SQL_FLAG= "@sql"; private MybatisTpl() { throw new IllegalStateException("Utility class"); } - @SuppressWarnings("unchecked") + private static final String SQL_START= "@sql"; + public static SqlWithParam generate(String sqlId, Map parameter, Dialect dialect){ String sqlInXml=getSql(sqlId); SqlWithParam sqlWithParam= new SqlWithParam(); @@ -44,75 +43,73 @@ public class MybatisTpl { } sqlInXml= DynamicSql.dynamicSql(sqlInXml,dialect); sqlInXml=sqlInXml.trim(); - if(sqlInXml.contains(""+sqlInXml+""; - sqlInXml = UtilAll.UString.replaceEach(sqlInXml,new String[]{" > "," < "," >= "," <= "," <> "}, - new String[]{" > "," < "," >= "," <= "," <> "}); - } - if(null==parameter){ - parameter=new LinkedHashMap<>(); - } - LanguageDriver languageDriver = new XMLLanguageDriver(); - Configuration configuration= new Configuration(); - Properties properties= new Properties(); - for (Map.Entry entry: parameter.entrySet()) { - if(null==entry.getValue()){ - continue; - } - properties.put(entry.getKey(),entry.getValue()); - } - configuration.setVariables(properties); - BoundSql boundSql = null; - try { - SqlSource sqlSource = languageDriver.createSqlSource(configuration, sqlInXml, Map.class); - boundSql=sqlSource.getBoundSql(parameter); - }catch (Exception e){ - logger.error("解析sqlxml出错",e); - logger.error("sqlxml:{}",sqlInXml); - sqlWithParam.setSql(null); - sqlWithParam.setParams(null); - return sqlWithParam; - } - /* if(boundSql.getSql().contains("#{")){ - return generate(boundSql.getSql(),parameter,dialect); - }*/ - List list= boundSql.getParameterMappings(); - List argList= new ArrayList<>(); - List propertyNames = new ArrayList<>(); - if(null!=list&&!list.isEmpty()){ - Map param =new LinkedHashMap<>(); - if(boundSql.getParameterObject() instanceof Map){ - param = (Map) boundSql.getParameterObject(); - } - for (ParameterMapping parameterMapping: list) { - Object value; - - String propertyName= parameterMapping.getProperty(); - if (boundSql.hasAdditionalParameter(propertyName)) { // issue #448 ask first for additional params - value = boundSql.getAdditionalParameter(propertyName); - } else if (param == null) { - value = null; - }else { - MetaObject metaObject = configuration.newMetaObject(param); - if(!metaObject.hasGetter(propertyName)){ - throw new JdbcMybatisRuntimeException("{} placeholder #{{}} not found",sqlId,propertyName); - } - value = metaObject.getValue(propertyName); - } - argList.add(value); - propertyNames.add(propertyName); - } - } - Object[] args=argList.toArray(); - String sql=boundSql.getSql(); - sqlWithParam.setSql(sql); - sqlWithParam.setParams(args); - sqlWithParam.setPropertyNames(propertyNames); - return sqlWithParam; + return generate(sqlId,sqlInXml,parameter); } + @SuppressWarnings("unchecked") + public static SqlWithParam generate(String sqlId,String sqlInXml, Map parameter){ + if(sqlInXml.contains(""+sqlInXml+""; + sqlInXml = UtilAll.UString.replaceEach(sqlInXml,new String[]{" > "," < "," >= "," <= "," <> "}, + new String[]{" > "," < "," >= "," <= "," <> "}); + } + SqlWithParam sqlWithParam= new SqlWithParam(); + if(null==parameter){ + parameter=new LinkedHashMap<>(); + } + LanguageDriver languageDriver = new XMLLanguageDriver(); + Configuration configuration= new Configuration(); + Properties properties= new Properties(); + for (Map.Entry entry: parameter.entrySet()) { + if(null==entry.getValue()){ + continue; + } + properties.put(entry.getKey(),entry.getValue()); + } + configuration.setVariables(properties); + SqlSource sqlSource = languageDriver.createSqlSource(configuration, sqlInXml, Map.class); + BoundSql boundSql; + try{ + boundSql=sqlSource.getBoundSql(parameter); + }catch (Exception e){ + throw new JdbcMybatisRuntimeException(e,"{} error builder mybatis dynamic sql ",sqlId); + } + List list= boundSql.getParameterMappings(); + List argList= new ArrayList<>(); + List propertyNames = new ArrayList<>(); + if(null!=list&&!list.isEmpty()){ + Map param =new LinkedHashMap<>(); + if(boundSql.getParameterObject() instanceof Map){ + param = (Map) boundSql.getParameterObject(); + } + for (ParameterMapping parameterMapping: list) { + Object value; + + String propertyName= parameterMapping.getProperty(); + if (boundSql.hasAdditionalParameter(propertyName)) { // issue #448 ask first for additional params + value = boundSql.getAdditionalParameter(propertyName); + } else if (param == null) { + value = null; + }else { + MetaObject metaObject = configuration.newMetaObject(param); + if(!metaObject.hasGetter(propertyName)){ + throw new JdbcMybatisRuntimeException("{} placeholder #{{}} not found",sqlId,propertyName); + } + value = metaObject.getValue(propertyName); + } + argList.add(value); + propertyNames.add(propertyName); + } + } + Object[] args=argList.toArray(); + String sql=boundSql.getSql(); + sqlWithParam.setSql(sql); + sqlWithParam.setParams(args); + sqlWithParam.setPropertyNames(propertyNames); + return sqlWithParam; + } private static String getSql(String sqlId) { - if(sqlId.startsWith(SQL_FLAG)){ - return sqlId.substring(SQL_FLAG.length()); + if(sqlId.startsWith(SQL_START)){ + return sqlId.substring(SQL_START.length()); } return MarkdownUtil.getContent(sqlId); } diff --git a/pom.xml b/pom.xml index ee554f849ef414b24ed3d5c7a13b4135affd13d3..777fa19ab76b7dc73a79e3d6053df4d903c6242c 100644 --- a/pom.xml +++ b/pom.xml @@ -11,9 +11,9 @@ mybatis-template jdbc-mybatis common-util - spring-data-jdbc-mybatis-test + spring-data-jdbc-mybatis-demo mybatis-sql-extend - mybatis-sql-extend-test + spring-data-jdbc-mybatis parent pom spring data jdbc with mybatis template dynamic query diff --git a/spring-data-jdbc-mybatis-test/pom.xml b/spring-data-jdbc-mybatis-demo/pom.xml similarity index 66% rename from spring-data-jdbc-mybatis-test/pom.xml rename to spring-data-jdbc-mybatis-demo/pom.xml index 19c8e5e59c6ef26e731bf6934b522b42cb5d994c..5ee547281f04b84f4b6a25e73d8d2ef63225d527 100644 --- a/spring-data-jdbc-mybatis-test/pom.xml +++ b/spring-data-jdbc-mybatis-demo/pom.xml @@ -2,36 +2,57 @@ 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.7.18 - - com.vonchange.common - spring-data-jdbc-mybatis-test + spring-data-jdbc-mybatis-demo 0.0.1-SNAPSHOT spring-data-jdbc-mybatis-test spring-data-jdbc-mybatis-test 测试 + 2.7.18 2.5.0 8.0.15 + 2.17.0 + + + + org.springframework.boot + spring-boot-dependencies + ${spring.boot.version} + pom + import + + + org.springframework.boot + spring-boot-starter + ${spring.boot.version} + + + org.springframework.boot + spring-boot-starter-logging + + + + + + + com.vonchange.common + spring-data-jdbc-mybatis + ${spring.jdbc.mybatis} + org.springframework.boot spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - - org.springframework.boot spring-boot-starter-undertow + + org.springframework.boot + spring-boot-starter-log4j2 + commons-io commons-io @@ -42,6 +63,11 @@ lombok 1.18.6 + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + 2.12.5 + org.springframework.boot spring-boot-starter-jdbc @@ -55,11 +81,7 @@ mysql-connector-java 8.0.16 - - com.vonchange.common - spring-data-jdbc-mybatis - ${spring.jdbc.mybatis} - + com.h2database h2 @@ -71,49 +93,14 @@ spring-boot-starter-test test - + - - - aliyun-repos - Aliyun Repository - http://maven.aliyun.com/nexus/content/groups/public - - true - - - false - - - - sonatype-repos - Sonatype Repository - https://oss.sonatype.org/content/groups/public - - true - - - false - - - - sonatype-repos-s - Sonatype Repository - https://oss.sonatype.org/content/repositories/snapshots - - false - - - true - - - @@ -138,10 +125,22 @@ org.springframework.boot spring-boot-maven-plugin + 2.7.18 - + + + src/main/resources + + + src/main/java + + **/*.md + + true + + diff --git a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/JdbcMybatisTestApplication.java b/spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/JdbcMybatisTestApplication.java similarity index 100% rename from spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/JdbcMybatisTestApplication.java rename to spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/JdbcMybatisTestApplication.java diff --git a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/config/DBConfig.java b/spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/config/DBConfig.java similarity index 64% rename from spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/config/DBConfig.java rename to spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/config/DBConfig.java index de1e78b24e38b72f9a1421986f5c65f52943d441..8ef5f5b3b320191761ee364be85639d3c15e0a28 100644 --- a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/config/DBConfig.java +++ b/spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/config/DBConfig.java @@ -2,8 +2,7 @@ package com.vonchange.nine.demo.config; import com.vonchange.jdbc.abstractjdbc.model.DataSourceWrapper; -import com.vonchange.jdbc.mybatis.repository.ReadDataSources; -import org.springframework.beans.factory.InitializingBean; +import com.vonchange.mybatis.dialect.H2Dialect; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; @@ -29,22 +28,11 @@ public class DBConfig { return DataSourceBuilder.create().build(); } - - //多数据源 定义 key 为你要设置@DataSourceKey的值 不建议多数据源 最好分服务 + //@DataSourceKey @Bean public DataSourceWrapper readDataSourceWrapper(@Qualifier("dataSourceRead") DataSource dataSource) { return new DataSourceWrapper(dataSource,"dataSourceRead"); } - //自定义 读库数据源 不自定义默认所有你设置的数据源 - //@Bean - public ReadDataSources initReadDataSources(){ - return new ReadDataSources() { - @Override - public DataSource[] allReadDataSources() { - //mainDataSource(),mainDataSource(), - return new DataSource[]{readDataSource()}; - } - }; - } + } \ No newline at end of file diff --git a/spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/dao/UserInfoMethodDao.java b/spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/dao/UserInfoMethodDao.java new file mode 100644 index 0000000000000000000000000000000000000000..5d971b3e4154a88c221e9149c863859113d221a3 --- /dev/null +++ b/spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/dao/UserInfoMethodDao.java @@ -0,0 +1,20 @@ +package com.vonchange.nine.demo.dao; + +import com.vonchange.jdbc.mybatis.core.support.CrudJdbcRepository; + +import com.vonchange.nine.demo.domain.UserInfoDO; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +import java.time.LocalDateTime; +import java.util.List; + +public interface UserInfoMethodDao extends CrudJdbcRepository { + UserInfoDO findByUserCode(String userCode); + + List findByCreateTimeBetween(LocalDateTime begin,LocalDateTime end); + long countByUserCodeIn(List userCodes); + List findByUserCodeIn(List userCodes); + Page findPageByUserCodeIn(Pageable pageable,List userCodes); + List findByUserCodeInOrderByCreateTimeDesc(List userCodes); +} diff --git a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/dao/UserQueryRepository.java b/spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/dao/UserInfoQueryDao.java similarity index 86% rename from spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/dao/UserQueryRepository.java rename to spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/dao/UserInfoQueryDao.java index b2aacc16497831f5b0bdf98f44168b8618de587a..62f8dbc3724c127d409f05bd31ae8857a69fe083 100644 --- a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/dao/UserQueryRepository.java +++ b/spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/dao/UserInfoQueryDao.java @@ -9,7 +9,7 @@ import java.util.List; -public interface UserQueryRepository extends QueryRepository { +public interface UserInfoQueryDao extends QueryRepository { List findList(@Param("userName") String userName, @Param("createTime") Date createTime); diff --git a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/dao/UserInfoRepository.java b/spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/dao/UserInfoRepository.java similarity index 43% rename from spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/dao/UserInfoRepository.java rename to spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/dao/UserInfoRepository.java index e5136303b01c1e83d2e3ae1846230fb4ed18c99f..80e25a720b2f7d7973e4435cf308a55c60db0fc4 100644 --- a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/dao/UserInfoRepository.java +++ b/spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/dao/UserInfoRepository.java @@ -3,7 +3,9 @@ package com.vonchange.nine.demo.dao; import com.vonchange.jdbc.abstractjdbc.handler.AbstractPageWork; import com.vonchange.jdbc.mybatis.core.query.BatchUpdate; import com.vonchange.jdbc.mybatis.core.query.ReadDataSource; -import com.vonchange.jdbc.mybatis.core.support.CrudRepository; + +import com.vonchange.jdbc.mybatis.core.support.CrudJdbcRepository; + import com.vonchange.nine.demo.domain.SearchParam; import com.vonchange.nine.demo.domain.UserInfoDO; import org.springframework.data.domain.Page; @@ -14,38 +16,28 @@ import java.time.LocalDateTime; import java.util.Date; import java.util.List; +public interface UserInfoRepository extends CrudJdbcRepository { -public interface UserInfoRepository extends CrudRepository { - List findListByUserCode(@Param("userCode") String userCode); - UserInfoDO findOneByUserCode(@Param("userCode") String userCode); + List findByUserCodes(@Param("userCodes") List userCodes); + UserInfoDO findByUserCode(@Param("userCode") String userCode); String findUserNameByCode(@Param("userCode") String userCode); - @ReadDataSource - List findUserList(@Param("userName") String userName, - @Param("createTime") LocalDateTime createTime,@Param("isDelete") Integer isDelete); - Page findUserList(Pageable pageable, @Param("userName") String userName,@Param("createTime") LocalDateTime createTime,@Param("isDelete") Integer isDelete); + + List findUserList(@Param("userCodes") List userCodes, + @Param("userName")String userName, + @Param("createTime") LocalDateTime createTime); + Page findUserList(Pageable pageable, + @Param("userCodes") List userCodes, + @Param("userName")String userName, + @Param("createTime") LocalDateTime createTime); List findUserBySearchParam(@Param("param") SearchParam searchParam); - List findListByIds(@Param("userName") String userName, - @Param("createTime") Date createTime,@Param("idList")List idList); int updateIsDelete(@Param("isDelete") Integer isDelete,@Param("id") Long id); - @BatchUpdate - int batchUpdate(List list); - @BatchUpdate(size = 1000) - int batchInsert(List list); - - List findLongList(); - - int updateTest(@Param("list")List list); - - List findByUserName(@Param("test")String test); - - int insertBatchNormal(@Param("list")List list); + int batchUpdate(List list); - void findBigData(@Param("")AbstractPageWork abstractPageWork,@Param("userName") String userName); + void findBigData(@Param("abstractPageWork")AbstractPageWork abstractPageWork,@Param("userName") String userName); - List findByUserCodes(@Param("userCodes")List userCodes); } \ No newline at end of file diff --git a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/domain/BaseDO.java b/spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/domain/BaseDO.java similarity index 71% rename from spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/domain/BaseDO.java rename to spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/domain/BaseDO.java index 1621860c497d559a4b94e353ab2761d3b2390cb6..43f0c2dc623ed5f1c22422c5f38ba8bc4a600d0f 100644 --- a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/domain/BaseDO.java +++ b/spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/domain/BaseDO.java @@ -1,22 +1,26 @@ package com.vonchange.nine.demo.domain; import com.vonchange.mybatis.tpl.annotation.UpdateNotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import lombok.ToString; import javax.persistence.Id; +import java.time.LocalDateTime; import java.util.Date; @Getter @Setter -@NoArgsConstructor +@ToString public class BaseDO { @Id private Long id; @UpdateNotNull private Integer isDelete; @UpdateNotNull - private Date createTime; + private LocalDateTime createTime; private Date updateTime; } diff --git a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/domain/SearchParam.java b/spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/domain/SearchParam.java similarity index 33% rename from spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/domain/SearchParam.java rename to spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/domain/SearchParam.java index dbeb8962d2807060010bbd275a8263f72b44b934..6a745e468651db23d95496e5d308aeb2cbad62a9 100644 --- a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/domain/SearchParam.java +++ b/spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/domain/SearchParam.java @@ -1,24 +1,24 @@ package com.vonchange.nine.demo.domain; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + import java.util.Date; +import java.util.List; +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder public class SearchParam { + private List userCodes; private String userName; private Date createTime; - public String getUserName() { - return userName; - } - - public void setUserName(String userName) { - this.userName = userName; - } - - public Date getCreateTime() { - return createTime; - } + private String sort; - public void setCreateTime(Date createTime) { - this.createTime = createTime; - } } diff --git a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/domain/UserInfoDO.java b/spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/domain/UserInfoDO.java similarity index 68% rename from spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/domain/UserInfoDO.java rename to spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/domain/UserInfoDO.java index 62e9e5017373e0d1953cefca907a051dd6d25ed0..ddde41d8baef11a6a4819ab09d2a07f85d2b9e8f 100644 --- a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/domain/UserInfoDO.java +++ b/spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/domain/UserInfoDO.java @@ -1,7 +1,10 @@ package com.vonchange.nine.demo.domain; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; @@ -12,6 +15,9 @@ import javax.persistence.Table; @Getter @Setter @Table(name = "user_info") +@Builder +@AllArgsConstructor +@NoArgsConstructor @ToString public class UserInfoDO extends BaseDO{ @Id @@ -20,10 +26,10 @@ public class UserInfoDO extends BaseDO{ @Column(name="user_name") private String userName; private String mobileNo; - private Integer status; - + private String address; + //private int isValid; + // private Integer status; private byte[] headImageData; - public UserInfoDO(){ - } + } diff --git a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/util/H2DBFunctionExt.java b/spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/util/H2DBFunctionExt.java similarity index 100% rename from spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/util/H2DBFunctionExt.java rename to spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/util/H2DBFunctionExt.java diff --git a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/util/JsonUtil.java b/spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/util/JsonUtil.java similarity index 91% rename from spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/util/JsonUtil.java rename to spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/util/JsonUtil.java index 356a2bdb21420d32c9de8e4c743fc3a7f7776e59..08f4c424f4e8db99d4c20b86cb0d962553c4fbce 100644 --- a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/util/JsonUtil.java +++ b/spring-data-jdbc-mybatis-demo/src/main/java/com/vonchange/nine/demo/util/JsonUtil.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -16,7 +17,8 @@ public class JsonUtil { throw new IllegalStateException("Utility class"); } public static String toJson(Object object) { - ObjectMapper objectMapper = new ObjectMapper(); + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.registerModule(new JavaTimeModule()); try { return objectMapper.writeValueAsString(object); } catch (JsonProcessingException e) { @@ -36,6 +38,7 @@ public class JsonUtil { } public static T evalJson(String json, Class clazz,TypeReference type) throws IOException { ObjectMapper mapper = new ObjectMapper(); + mapper.registerModule(new JavaTimeModule()); mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES,true); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false); T t =null; diff --git a/spring-data-jdbc-mybatis-demo/src/main/resources/sql/UserInfoRepository.md b/spring-data-jdbc-mybatis-demo/src/main/resources/sql/UserInfoRepository.md new file mode 100644 index 0000000000000000000000000000000000000000..50fb38471ff4651eba0237ce82feaa07f43b014c --- /dev/null +++ b/spring-data-jdbc-mybatis-demo/src/main/resources/sql/UserInfoRepository.md @@ -0,0 +1,91 @@ +## query example + +### base query columns +``` +-- column +id,user_code,user_name,mobile_no,address,create_time,update_time,is_delete +``` + +``` +-- findByUserCodes +select [@id column] from user_info +[@@and user_code in userCodes] +``` + +``` +-- findUserNameByCode +select user_name from user_info where user_code = #{userCode} [@id isDelete] +``` + +``` +-- isDelete +and is_delete=0 +``` + +``` +-- isDeleteOracle +and is_delete=1 +``` + +``` +-- findUserList +select [@id column] from user_info +where is_delete=0 +[@and user_name like userName%] +[@@and user_code in userCodes] + and create_time < #{createTime} + +``` + + +``` +-- findUserBySearchParam +select * from user_info + +[@id whereSql] + +${param.sort} +``` + +```sql +-- whereSql +[@@and user_name like param.userName] +[@and user_code in param.userCodes] +[@and create_time <= param.createTime] +``` + + + + +``` +-- findList +SELECT [@id column] FROM user_info + +[@@and id in #{idList:in} and user_name like #{userName:like}] +[@and user_name like userName%] +[@and id in idList] + and create_time < #{createTime} + +``` + +> update + +``` +-- updateIsDelete +update user_info set is_delete = #{isDelete} where id =#{id} +``` + +``` +-- batchUpdate +update user_info set is_delete = IFNULL(#{isDelete},is_delete),user_name =#{userName} where id =#{id} +``` + + +``` +-- findBigData +select * from user_info + +[@and user_name like userName] + +``` + diff --git a/spring-data-jdbc-mybatis-demo/src/test/java/com/vonchange/nine/demo/dao/UserInfoMethodDaoTest.java b/spring-data-jdbc-mybatis-demo/src/test/java/com/vonchange/nine/demo/dao/UserInfoMethodDaoTest.java new file mode 100644 index 0000000000000000000000000000000000000000..0341fa468a598efee1448d23b78dc086e6ea9d2e --- /dev/null +++ b/spring-data-jdbc-mybatis-demo/src/test/java/com/vonchange/nine/demo/dao/UserInfoMethodDaoTest.java @@ -0,0 +1,201 @@ +package com.vonchange.nine.demo.dao; + +import com.vonchange.common.util.StringPool; +import com.vonchange.common.util.UtilAll; +import com.vonchange.common.util.map.MyHashMap; +import com.vonchange.jdbc.abstractjdbc.util.NameQueryUtil; +import com.vonchange.mybatis.tpl.model.SqlWithParam; +import com.vonchange.nine.demo.domain.UserInfoDO; +import com.vonchange.nine.demo.util.JsonUtil; +import jdk.nashorn.internal.runtime.logging.Logger; +import lombok.AllArgsConstructor; +import lombok.extern.java.Log; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.test.annotation.Rollback; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.io.IOException; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; +@Slf4j +@SpringBootTest +class UserInfoMethodDaoTest { + + + + @Resource + private UserInfoMethodDao userInfoMethodDao; + + + @Test + public void methodSql() { + SqlWithParam sqlWithParam = NameQueryUtil.nameSql( + "findListByUserCodeIn",UserInfoDO.class,new MyHashMap() + .set("111",new String[]{"233","333"}).set("2",9)); + if(null!=sqlWithParam){ + log.info("\nnameSql {}", sqlWithParam.getSql()); + } + } + @Test + public void orderSql() { + String sql = NameQueryUtil.orderSql( + "orderByCreateTimeDescId",UserInfoDO.class); + log.info("\nsql {}", sql); + } + @Test + void findByUserCode() { + UserInfoDO userInfo = userInfoMethodDao.findByUserCode("u001"); + log.info("\nuserInfo {}", JsonUtil.toJson(userInfo)); + } + @Test + void findByCreateTimeBetween() { + List userInfoList = userInfoMethodDao.findByCreateTimeBetween( + LocalDateTime.now().minusMinutes(60L),LocalDateTime.now().plusMinutes(3L)); + log.info("\nuserInfo {}", JsonUtil.toJson(userInfoList)); + } + + @Test + void countByUserCode() { + long countNum = userInfoMethodDao.countByUserCodeIn(Arrays.asList("u001","u002")); + log.info("\ncountNum {}", countNum); + } + + @Test + void findByUserCodeIn() { + List userInfoDOList = userInfoMethodDao.findByUserCodeIn( + Arrays.asList("u001","u002")); + userInfoDOList.forEach(UserInfoDO -> { + log.info("\nUserInfoDOList {}", JsonUtil.toJson(UserInfoDO)); + }); + } + + @Test + void findPageByUserCodeIn() { + Page userInfoDOPage = userInfoMethodDao.findPageByUserCodeIn( + PageRequest.of(0,1), + Arrays.asList("u001","u002")); + log.info("userInfoDOPage \n{}", JsonUtil.toJson(userInfoDOPage)); + } + + @Test + void findByUserCodeInOrderByCreateTimeDesc() { + List userInfoDOList = userInfoMethodDao.findByUserCodeInOrderByCreateTimeDesc( + Arrays.asList("u001","u002")); + userInfoDOList.forEach(UserInfoDO -> { + log.info("\nUserInfoDOList {}", JsonUtil.toJson(UserInfoDO)); + }); + } + + @Test + @Transactional + @Rollback + public void save() throws IOException { + UserInfoDO userInfoDO = new UserInfoDO(); + userInfoDO.setUserCode("L001"); + userInfoDO.setUserName("Bruce Lee"); + userInfoDO.setHeadImageData(IOUtils.toByteArray(UtilAll.UFile.getClassResource("db-init.sql"))); + int resultNum = userInfoMethodDao.save(userInfoDO); + log.info("\nresultNum {} id {}",resultNum,userInfoDO.getId()); + UserInfoDO userInfoDOFind =userInfoMethodDao.findById(userInfoDO.getId()); + if(null!=userInfoDOFind.getHeadImageData()){ + log.info(IOUtils.toString(userInfoDOFind.getHeadImageData(), StringPool.UTF_8)); + } + log.info("\nuserInfoDOFind {}",userInfoDOFind.toString()); + } + @Test + @Transactional + //@Rollback(value = false) + public void update() { + UserInfoDO userInfoDO = new UserInfoDO(); + userInfoDO.setUserName("Jack ma"); + userInfoDO.setId(2L); + int resultNum = userInfoMethodDao.update(userInfoDO); + //int a=0; + //log.info((1/a); + log.info("\nresultNum {}",resultNum); + UserInfoDO userInfoDOFind =userInfoMethodDao.findById(1L); + log.info("\nuserInfoDOFind {}",userInfoDOFind.toString()); + } + @Test + public void updateAllField() { + UserInfoDO userInfoDO = new UserInfoDO(); + userInfoDO.setUserName("anyone"); + userInfoDO.setId(1L); + int result = userInfoMethodDao.updateAllField(userInfoDO); + log.info("\nresultNum {}",result); + UserInfoDO userInfoDOFind =userInfoMethodDao.findById(1L); + log.info("\nuserInfoDOFind {}",userInfoDOFind.toString()); + } + + @Test + void findById() { + UserInfoDO userInfo = userInfoMethodDao.findById(1L); + log.info("\nuserInfo {}", JsonUtil.toJson(userInfo)); + } + @Test + void findAllById() { + List userInfo = userInfoMethodDao.findAllById(Arrays.asList(1L,2L)); + log.info("\nuserInfo {}", JsonUtil.toJson(userInfo)); + } + @Test + void existsById() { + boolean existsById= userInfoMethodDao.existsById(1L); + log.info("\nexistsById {}", existsById); + existsById= userInfoMethodDao.existsById(1000L); + log.info("\nexistsById {}", existsById); + //existsById= userInfoMethodDao.existsById(null); + //log.info("\nexistsById {}", existsById); + } + @Test + void deleteById() { + int num = userInfoMethodDao.deleteById(1L); + log.info("\ndeleteById {}", num); + UserInfoDO userInfo = userInfoMethodDao.findById(1L); + log.info("\nuserInfo {}", JsonUtil.toJson(userInfo)); + } + @Test + void deleteAllById() { + int num = userInfoMethodDao.deleteAllById(Arrays.asList(1L,2L)); + log.info("\ndeleteById {}", num); + UserInfoDO userInfo = userInfoMethodDao.findById(1L); + log.info("\nuserInfo {}", JsonUtil.toJson(userInfo)); + //num = userInfoMethodDao.deleteAllById(null); + //log.info("\ndeleteById {}", num); + } + + + /** + * 批量插入 + */ + @Test + @Transactional + public void bachSave() { + long start = System.currentTimeMillis(); + List list = new ArrayList<>(); + for (int i=0;i<10000;i++) { + UserInfoDO item= UserInfoDO.builder().userName("name:"+i).userCode("u:"+i).build(); + //item.setIsDelete(0); + list.add(item); + } + int resultNum = userInfoMethodDao.saveAllNotNull(list,5000); + //@TODO return id? + log.info("resultNum {} id First {} id Last {}",resultNum,list.get(0).getId(), + list.get(list.size()-1).getId()); + log.info("time {}",System.currentTimeMillis()-start);//1554 + List userInfoDOList = userInfoMethodDao.findAllById( + Arrays.asList(10L,100L)); + log.info(JsonUtil.toJson(userInfoDOList)); + } + +} \ No newline at end of file diff --git a/spring-data-jdbc-mybatis-test/src/test/java/com/vonchange/nine/demo/dao/UserInfoRepositoryTest.java b/spring-data-jdbc-mybatis-demo/src/test/java/com/vonchange/nine/demo/dao/UserInfoRepositoryTest.java similarity index 36% rename from spring-data-jdbc-mybatis-test/src/test/java/com/vonchange/nine/demo/dao/UserInfoRepositoryTest.java rename to spring-data-jdbc-mybatis-demo/src/test/java/com/vonchange/nine/demo/dao/UserInfoRepositoryTest.java index 3c8248353457d5a39e1da95352adfa214d821461..8a46231e30e4a366a753e957385b8017874604d5 100644 --- a/spring-data-jdbc-mybatis-test/src/test/java/com/vonchange/nine/demo/dao/UserInfoRepositoryTest.java +++ b/spring-data-jdbc-mybatis-demo/src/test/java/com/vonchange/nine/demo/dao/UserInfoRepositoryTest.java @@ -1,6 +1,9 @@ package com.vonchange.nine.demo.dao; +import com.vonchange.common.util.map.MyHashMap; import com.vonchange.jdbc.abstractjdbc.handler.AbstractPageWork; +import com.vonchange.jdbc.abstractjdbc.util.NameQueryUtil; +import com.vonchange.mybatis.tpl.model.SqlWithParam; import com.vonchange.nine.demo.domain.SearchParam; import com.vonchange.nine.demo.domain.UserInfoDO; import com.vonchange.nine.demo.util.JsonUtil; @@ -12,6 +15,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.test.annotation.Rollback; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; @@ -19,6 +23,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.io.IOException; import java.time.LocalDateTime; +import java.time.ZoneId; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; @@ -37,9 +42,11 @@ public class UserInfoRepositoryTest { @Resource private UserInfoRepository userInfoRepository; + @Test - public void findListByUserCode() { - List userInfoDOList = userInfoRepository.findListByUserCode("u001"); + public void findByUserCodes() { + List userInfoDOList = userInfoRepository.findByUserCodes( + Arrays.asList("u001","u002")); userInfoDOList.forEach(UserInfoDO -> { log.info("\nUserInfoDOList {}",JsonUtil.toJson(UserInfoDO)); }); @@ -47,23 +54,26 @@ public class UserInfoRepositoryTest { @Test public void findUserNameByCode() { + String sqlDialect=System.getenv("ID_END"); + log.info("XXX:: "+sqlDialect); String userName = userInfoRepository.findUserNameByCode("u000"); log.info("\n userName {}",userName); } @Test public void findUserList() { - List UserInfoDOList = userInfoRepository.findUserList("change",LocalDateTime.now().plusHours(1L), - 0); - UserInfoDOList.forEach(UserInfoDO -> { - log.info("\nUserInfoDOList {}",JsonUtil.toJson(UserInfoDO)); + List userInfoDOList = userInfoRepository.findUserList(Arrays.asList("u000","u001","u002"), + "ch",null);//LocalDateTime.now().plusHours(1L) + userInfoDOList.forEach(userInfoDO -> { + log.info("\nUserInfoDOList {}",JsonUtil.toJson(userInfoDO)); }); } @Test public void findUserPage() { Pageable pageable = PageRequest.of(0,10); - //PageRequest.of(0,3); - Page userInfoDOPage = userInfoRepository.findUserList(pageable,"change",LocalDateTime.now().plusHours(1L),0); + Page userInfoDOPage = userInfoRepository + .findUserList(pageable,Arrays.asList("u000","u001","u002"), + "ch",LocalDateTime.now().plusHours(1L)); log.info("\n {}",userInfoDOPage.getTotalElements()); userInfoDOPage.getContent().forEach(UserInfoDO -> { log.info("\n {}",UserInfoDO.toString()); @@ -74,48 +84,19 @@ public class UserInfoRepositoryTest { public void findUserBySearchParam() { SearchParam searchParam = new SearchParam(); searchParam.setUserName("chang"); + //searchParam.setUserCodes(Arrays.asList("u000","u001","u002")); + searchParam.setCreateTime(toDate(LocalDateTime.now().plusHours(1L))); + searchParam.setSort(NameQueryUtil.orderSql("orderByCreateTimeDescId",UserInfoDO.class)); List userInfoDOList = userInfoRepository.findUserBySearchParam(searchParam); - userInfoDOList.forEach(UserInfoDO -> { - log.info("\n {}",userInfoDOList); + userInfoDOList.forEach(userInfoDO -> { + log.info("\n {}",JsonUtil.toJson(userInfoDO)); }); } - - - - @Test - public void findById() { - UserInfoDO UserInfoDO = userInfoRepository.findById(1L); - log.info("\n UserInfoDO {}",UserInfoDO); - } - - @Test - public void findByXX() { - List UserInfoDOList = userInfoRepository.findByUserName("test"); - UserInfoDOList.forEach(UserInfoDO -> { - log.info("\n UserInfoDO {}",UserInfoDO); - }); - + public static Date toDate(LocalDateTime localDateTime) { + return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); } - @Test - public void findLongList() { - List idList = userInfoRepository.findLongList(); - idList.forEach(id -> { - log.info("\n id {}",id); - }); - } - @Test - public void findListByIds() { - List UserInfoDOListQ = userInfoRepository.findListByIds("test",null,Arrays.asList(1L,2L)); - UserInfoDOListQ.forEach(UserInfoDO -> { - log.info("\n {}",UserInfoDO.toString()); - }); - List UserInfoDOList = userInfoRepository.findListByIds("test",new Date(), Arrays.asList(1L,2L)); - UserInfoDOList.forEach(UserInfoDO -> { - log.info("\n {}",UserInfoDO.toString()); - }); - } @Test @Transactional @@ -123,135 +104,41 @@ public class UserInfoRepositoryTest { public void updateIsDelete() { int result = userInfoRepository.updateIsDelete(1,1L); log.info("result {}",result); - } - @Test - public void insert() throws IOException { - UserInfoDO UserInfoDO = new UserInfoDO(); - //UserInfoDO.setId(3L); - UserInfoDO.setUserName("test"); - UserInfoDO.setUserCode(UUID.randomUUID().toString()); - UserInfoDO.setStatus(1); - - //UserInfoDO.setHeadImageData(FileUtils.readFileToByteArray(new File("/Users/vonchange/work/docment/cat.jpg"))); - // UserInfoDO.setCode("1"); - //UserInfoDO.setCreateTime(LocalDateTime.now().plusHours(1L)); - int result = userInfoRepository.insert(UserInfoDO); - log.info("\nresult {} {} ",result,UserInfoDO.toString()); - UserInfoDO UserInfoDOFind =userInfoRepository.findById(UserInfoDO.getId()); - //FileUtils.writeByteArrayToFile(new File("/Users/vonchange/work/docment/catcc.jpg"),UserInfoDOFind.getHeadImageData()); - log.info("\nUserInfoDOFind {}",UserInfoDOFind.toString()); - } - - - - @Test - //@Transactional - //@Rollback - public void update() { - UserInfoDO UserInfoDO = new UserInfoDO(); - UserInfoDO.setUserName("test_ss"); - UserInfoDO.setId(1L); - int result = userInfoRepository.update(UserInfoDO); - log.info("\nresult {}",result); - //UserInfoDO UserInfoDOFind =userInfoRepository.findById(1L); - //log.info("\nUserInfoDOFind {}",UserInfoDOFind.toString()); - } - - @Test - public void updateAllField() { - UserInfoDO UserInfoDO = new UserInfoDO(); - UserInfoDO.setUserName(null); - UserInfoDO.setId(1L); - int result = userInfoRepository.updateAllField(UserInfoDO); - log.info("\nresult {}",result); + UserInfoDO userInfoDO= userInfoRepository.findById(1L); + log.info("\nuserInfoDO {}",JsonUtil.toJson(userInfoDO)); } - //13 - /** - * 批量插入 - */ @Test @Transactional - public void insertBatch() { - /* int result = userInfoRepository.update(new UserInfoDO(1L,"testxx","",1,null,null)); - log.info("result {}",result); + public void batchUpdate() { long start = System.currentTimeMillis(); List list = new ArrayList<>(); for (int i=0;i<10000;i++) { - list.add(new UserInfoDO(null,"三e"+i,"1100"+i,null, LocalDateTime.now(),null)); - } - int resultx = userInfoRepository.insertBatch(list,5000); - log.info("id {}",list.get(0).getId()); - log.info("result {}",resultx); - log.info("time {}",System.currentTimeMillis()-start);//1554*/ - } - - - @Test - //@Transactional - //@Rollback - public void updateBatchBySqlId() { - /* int result = userInfoRepository.update(new UserInfoDO(1L,"testxx","",1,null,null)); - log.info("result {}",result); - long start = System.currentTimeMillis(); - List list = new ArrayList<>(); - for (int i=0;i<2;i++) { - list.add(new UserInfoDO(1L+i,"RRR"+i,null,null,null,new Date())); + UserInfoDO userInfoDO = UserInfoDO.builder().id(0L+i).userName("name:"+i) + .build(); + list.add(userInfoDO); } - int resultx = userInfoRepository.batchUpdate(list); - log.info("resultx {}",resultx); - log.info("time {}",System.currentTimeMillis()-start);*/ + int resultNum = userInfoRepository.batchUpdate(list); + log.info("resultNum {}",resultNum); + log.info("time {}",System.currentTimeMillis()-start); + List userInfoDOList = userInfoRepository.findAllById(Arrays.asList(1L,2L)); + log.info("userInfoDOList {}",JsonUtil.toJson(userInfoDOList)); } - @Test - @Transactional - //@Rollback - public void insertBatchNormal() { - /* int result = userInfoRepository.update(new UserInfoDO(1L,"testxx","",1,null,null)); - log.info("result {}",result); - long start = System.currentTimeMillis(); - List list = new ArrayList<>(); - for (int i=0;i<10000;i++) { - list.add(new UserInfoDO(null,"三e"+i,"1100"+i,null, LocalDateTime.now(),null)); - } - int resultx = userInfoRepository.insertBatchNormal(list); - System.out.println(list.get(0).getId()); - log.info("resultx {}",resultx); - log.info("time {}",System.currentTimeMillis()-start);//908*/ - } - - @Test - @Transactional - //@Rollback - public void bachUpdate() { - /* int result = userInfoRepository.update(new UserInfoDO(1L,"testxx","",1,null,null)); - log.info("result {}",result); - long start = System.currentTimeMillis(); - List list = new ArrayList<>(); - for (int i=0;i<10000;i++) { - list.add(new UserInfoDO(null,"三e"+i,"1100"+i,null, LocalDateTime.now(),null)); - } - int resultx = userInfoRepository.batchInsert(list); - System.out.println(list.get(0).getId()); - log.info("resultx {}",resultx); - log.info("time {}",System.currentTimeMillis()-start);//563*/ - } - - @Test @Transactional public void findBigData() { - long start = System.currentTimeMillis(); List list = new ArrayList<>(); for (int i=0;i<10006;i++) { - list.add(null); - //new UserInfoDO(null,"三e"+i,"1100"+i,null, LocalDateTime.now(),null) + UserInfoDO userInfoDO = UserInfoDO.builder().userCode("code:"+i).userName("name:"+i) + .build(); + userInfoDO.setCreateTime(LocalDateTime.now()); + list.add(userInfoDO); } - int resultx = userInfoRepository.insertBatch(list,5000); - log.info("id {}",list.get(0).getId()); - log.info("result {}",resultx); + int resultNum = userInfoRepository.saveAllNotNull(list,1000); + log.info("resultNum {}",resultNum); log.info("time {}",System.currentTimeMillis()-start);//1554 AbstractPageWork abstractPageWork = new AbstractPageWork() { @Override @@ -267,7 +154,9 @@ public class UserInfoRepositoryTest { return 500; } }; - userInfoRepository.findBigData(abstractPageWork,"三"); + userInfoRepository.findBigData(abstractPageWork,"name"); log.info("{} {} {}",abstractPageWork.getSize(),abstractPageWork.getTotalPages(),abstractPageWork.getTotalElements()); } + + } \ No newline at end of file diff --git a/spring-data-jdbc-mybatis-test/src/test/resources/application-h2.yml b/spring-data-jdbc-mybatis-demo/src/test/resources/application-h2.yml similarity index 96% rename from spring-data-jdbc-mybatis-test/src/test/resources/application-h2.yml rename to spring-data-jdbc-mybatis-demo/src/test/resources/application-h2.yml index f0a84b83b1b23da2e116858d23c8ac55fc1a9a33..355d4bc940ebbdf5884b334f943525c8c7b0f5dd 100644 --- a/spring-data-jdbc-mybatis-test/src/test/resources/application-h2.yml +++ b/spring-data-jdbc-mybatis-demo/src/test/resources/application-h2.yml @@ -2,7 +2,8 @@ server: port: 9001 -jdbc-mybatis: +jdbc: + mybatis: dialect: com.vonchange.mybatis.dialect.H2Dialect logRead: true logWrite: true diff --git a/spring-data-jdbc-mybatis-test/src/test/resources/application-local.yml b/spring-data-jdbc-mybatis-demo/src/test/resources/application-mysql.yml similarity index 45% rename from spring-data-jdbc-mybatis-test/src/test/resources/application-local.yml rename to spring-data-jdbc-mybatis-demo/src/test/resources/application-mysql.yml index b48d81501d945ecf50feedb6a28f7d9e3fbbe1f6..b3631f25035a56cca5de606d9036f1a60298e8d9 100644 --- a/spring-data-jdbc-mybatis-test/src/test/resources/application-local.yml +++ b/spring-data-jdbc-mybatis-demo/src/test/resources/application-mysql.yml @@ -1,7 +1,8 @@ server: - port: 9001 + port: 9002 -jdbc-mybatis: +jdbc: + mybatis: isReadAllScopeOpen: false logRead: true logWrite: true @@ -11,7 +12,7 @@ spring: datasource: hikari: driver-class-name: com.mysql.cj.jdbc.Driver - jdbc-url: jdbc:mysql://127.0.0.1:3306/test_b?autoReconnect=true&rewriteBatchedStatements=true&allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=CTT + jdbc-url: jdbc:mysql://127.0.0.1:3306/jdbc_test?autoReconnect=true&rewriteBatchedStatements=true&allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=CTT username: root password: 123456 # \ No newline at end of file diff --git a/spring-data-jdbc-mybatis-demo/src/test/resources/application.properties b/spring-data-jdbc-mybatis-demo/src/test/resources/application.properties new file mode 100644 index 0000000000000000000000000000000000000000..84af47539f485fdfe17aeac0ad49dbeb4156092f --- /dev/null +++ b/spring-data-jdbc-mybatis-demo/src/test/resources/application.properties @@ -0,0 +1,3 @@ +logging.config= classpath:log4j2.xml + + diff --git a/spring-data-jdbc-mybatis-test/src/test/resources/application.yml b/spring-data-jdbc-mybatis-demo/src/test/resources/application.yml similarity index 44% rename from spring-data-jdbc-mybatis-test/src/test/resources/application.yml rename to spring-data-jdbc-mybatis-demo/src/test/resources/application.yml index 85275326cec2bde945f870f22dc87950cbd33529..22b6c9fcedb694d2ad54cd3bc46de17167969eeb 100644 --- a/spring-data-jdbc-mybatis-test/src/test/resources/application.yml +++ b/spring-data-jdbc-mybatis-demo/src/test/resources/application.yml @@ -6,26 +6,10 @@ spring: datasource: hikari: driver-class-name: com.mysql.cj.jdbc.Driver - jdbc-url: jdbc:mysql://127.0.0.1:3306/nine_user?autoReconnect=true&rewriteBatchedStatements=true&allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=CTT + jdbc-url: jdbc:mysql://127.0.0.1:3306/jdbc_test?autoReconnect=true&rewriteBatchedStatements=true&allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=CTT username: root password: 123456 - connection-timeout: 20000 - minimum-idle: 5 - maximum-pool-size: 500 - idle-timeout: 60000 - max-lifetime: 600000 - leak-detection-threshold: 20000 - jpa: - database: MySQL - database-platform: org.hibernate.dialect.MySQL5InnoDBDialect - show-sql: true - hibernate: - ddl-auto: none - - -logback: - aliyun: - endpoint: cn-hangzhou.log.aliyuncs.com + maximum-pool-size: 10 diff --git a/spring-data-jdbc-mybatis-test/src/test/resources/db-init.sql b/spring-data-jdbc-mybatis-demo/src/test/resources/db-init.sql similarity index 94% rename from spring-data-jdbc-mybatis-test/src/test/resources/db-init.sql rename to spring-data-jdbc-mybatis-demo/src/test/resources/db-init.sql index 74940c831c596b8c7ac646fe88b6b8e492b9b197..ad67facd4d93ff4347738a0a78eeedb85662caf8 100644 --- a/spring-data-jdbc-mybatis-test/src/test/resources/db-init.sql +++ b/spring-data-jdbc-mybatis-demo/src/test/resources/db-init.sql @@ -7,7 +7,7 @@ CREATE TABLE IF NOT EXISTS `user_info` ( `user_name` varchar(30) DEFAULT NULL COMMENT 'user name', `mobile_no` varchar(13) DEFAULT NULL COMMENT 'mobile nubmer', `address` varchar(20) DEFAULT NULL COMMENT 'address', - `is_delete` tinyint(1) DEFAULT '0' COMMENT 'is delete', + `is_delete` tinyint(1) DEFAULT '0' Not NULL COMMENT 'is delete', `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, `head_image_data` blob DEFAULT NULL, diff --git a/spring-data-jdbc-mybatis-demo/src/test/resources/log4j2.xml b/spring-data-jdbc-mybatis-demo/src/test/resources/log4j2.xml new file mode 100644 index 0000000000000000000000000000000000000000..440f114b0907d170eae8aa841b30a0a48004c38d --- /dev/null +++ b/spring-data-jdbc-mybatis-demo/src/test/resources/log4j2.xml @@ -0,0 +1,56 @@ + + + + + %d %-5p [%traceId] %c - {} [%T] %m%n + ./logs/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/config/ApplicationConfig.java b/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/config/ApplicationConfig.java deleted file mode 100644 index fa0d0ad5faab658d219f803d853e77728be08165..0000000000000000000000000000000000000000 --- a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/config/ApplicationConfig.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.vonchange.nine.demo.config; - -import com.vonchange.jdbc.mybatis.core.config.JdbcConfiguration; - -//@Configuration -class ApplicationConfig extends JdbcConfiguration { - - /* @Bean - public JdbcRepository initJdbcRepository(DataSource... dataSource){ - return new JdbcRepositoryReadWriteImpl(); - }*/ - - -} diff --git a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/config/IPConvert.java b/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/config/IPConvert.java deleted file mode 100644 index 2accae733e796cfb7954fff87c67138f046e8c49..0000000000000000000000000000000000000000 --- a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/config/IPConvert.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.vonchange.nine.demo.config; - -import ch.qos.logback.classic.pattern.ClassicConverter; -import ch.qos.logback.classic.spi.ILoggingEvent; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.net.Inet4Address; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.net.SocketException; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Enumeration; - -public class IPConvert extends ClassicConverter { - private static Logger logger = LoggerFactory.getLogger(IPConvert.class); - - public static String IP_AND_ADDRESS; - - static { - try { - - Enumeration enumeration = NetworkInterface.getNetworkInterfaces(); - ArrayList ipv4Result = new ArrayList<>(); - - while (enumeration.hasMoreElements()) { - - final NetworkInterface networkInterface = enumeration.nextElement(); - final Enumeration en = networkInterface.getInetAddresses(); - - while (en.hasMoreElements()) { - - final InetAddress address = en.nextElement(); - - if (!address.isLoopbackAddress()&&address instanceof Inet4Address) { - ipv4Result.add(normalizeHostAddress(address)); - } - - } - } - // prefer ipv4 - if (!ipv4Result.isEmpty()) { - IP_AND_ADDRESS = ipv4Result.get(0); - } else { - // If failed to find,fall back to localhost - final InetAddress localHost = InetAddress.getLocalHost(); - IP_AND_ADDRESS = normalizeHostAddress(localHost); - } - } catch (SocketException e) { - logger.error("SocketException{}",e); - } catch (UnknownHostException e) { - logger.error("UnknownHostException{}",e); - } - } - - @Override - public String convert(ILoggingEvent event) { - return IP_AND_ADDRESS; - } - - public static String normalizeHostAddress(final InetAddress localHost) { - - return localHost.getHostAddress() + " | " + localHost.getHostName(); - } - -} - diff --git a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/controller/HelloController.java b/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/controller/HelloController.java deleted file mode 100644 index 78ba67d45a00881b42d6a085fbe0b117d0125ff3..0000000000000000000000000000000000000000 --- a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/controller/HelloController.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.vonchange.nine.demo.controller; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Random; - -/** - * Created by Zenger on 2018/5/21. - */ -@RestController -//@Slf4j -public class HelloController { - private static final Logger log = LoggerFactory.getLogger(HelloController.class); - - private static int num =new Random().nextInt(1000); - - @Value("${test.hello:ss}") - private String test; - @GetMapping("/test/hello") - public String hello() { - log.info("hello {}",test); - return "Demo project for Spring Boot2x ! 实例随机数"+num+test; - } - -} - - diff --git a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/domain/UserBaseVO.java b/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/domain/UserBaseVO.java deleted file mode 100644 index d64320b2ad6ae44da4a06abdbcd42b17f3f51957..0000000000000000000000000000000000000000 --- a/spring-data-jdbc-mybatis-test/src/main/java/com/vonchange/nine/demo/domain/UserBaseVO.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.vonchange.nine.demo.domain; - -//@Data -public class UserBaseVO { - private int id; - private String userName; - private String firstPhone; - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getUserName() { - return userName; - } - - public void setUserName(String userName) { - this.userName = userName; - } - - public String getFirstPhone() { - return firstPhone; - } - - public void setFirstPhone(String firstPhone) { - this.firstPhone = firstPhone; - } - - @Override - public String toString() { - return "UserBaseVO{" + - "id=" + id + - ", userName='" + userName + '\'' + - ", firstPhone='" + firstPhone + '\'' + - '}'; - } -} diff --git a/spring-data-jdbc-mybatis-test/src/test/java/com/vonchange/nine/demo/service/impl/JdbcQueryServiceImplTest.java b/spring-data-jdbc-mybatis-test/src/test/java/com/vonchange/nine/demo/service/impl/JdbcQueryServiceImplTest.java deleted file mode 100644 index 291121bcceb44f85eba43a0a3cb61224d95cc8ff..0000000000000000000000000000000000000000 --- a/spring-data-jdbc-mybatis-test/src/test/java/com/vonchange/nine/demo/service/impl/JdbcQueryServiceImplTest.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.vonchange.nine.demo.service.impl; - -import com.vonchange.common.util.map.MyHashMap; -import com.vonchange.jdbc.abstractjdbc.core.JdbcRepository; -import com.vonchange.nine.demo.domain.UserInfoDO; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Map; - -@RunWith(SpringRunner.class) -@SpringBootTest -public class JdbcQueryServiceImplTest { - private static final Logger log = LoggerFactory.getLogger(JdbcQueryServiceImplTest.class); - @Resource - private JdbcRepository jdbcRepository; - @Test - public void findList() { - List UserInfoDOList =jdbcRepository.queryList(UserInfoDO.class,"sql.UserBaseRepository.findList",new MyHashMap() - .set("userName","张三日子").set("createTime",null)); - UserInfoDOList.forEach(UserInfoDO -> { - log.info("\n {}",UserInfoDO.toString()); - }); - } - @Test - public void findListToMap() { - List> UserInfoDOList =jdbcRepository.queryMapList("sql.UserBaseRepository.findList",new MyHashMap() - .set("userName","张三日子").set("createTime",null)); - UserInfoDOList.forEach(UserInfoDO -> { - log.info("\n {}",UserInfoDO.toString()); - }); - } - @Test - public void findListBySql() { - String sql ="select * from user_base\n" + - "where user_name = #{userName}"; - List UserInfoDOList = jdbcRepository.queryList(UserInfoDO.class,"@sql"+sql,new MyHashMap() - .set("userName","张三日子").set("createTime",null)); - UserInfoDOList.forEach(UserInfoDO -> { - log.info("\n {}",UserInfoDO.toString()); - }); - } - - @Test - public void findListByMd() { - String sql ="### id findListByMd \n" + - "#### version 1.0 \n> 查询用户列表 含sql 片段\n" + - "\n" + - "```\n" + - "-- main\n" + - "select * from user_base\n" + - "where [@sql findListWhereSql]\n" + - "```\n" + - "\n" + - "> sql 片段\n" + - "```\n" + - "-- findListWhereSql\n" + - "user_name = #{userName} and 1=1\n" + - "{@and create_time < createTime}\n" + - "```"; - List UserInfoDOList = jdbcRepository.queryList(UserInfoDO.class,"@md"+sql,new MyHashMap() - .set("userName","张三日子").set("createTime",null)); - UserInfoDOList.forEach(UserInfoDO -> { - log.info("\n {}",UserInfoDO.toString()); - }); - } -} \ No newline at end of file diff --git a/spring-data-jdbc-mybatis-test/src/test/resources/logback-spring.xml b/spring-data-jdbc-mybatis-test/src/test/resources/logback-spring.xml deleted file mode 100644 index 50d9060adaeebafb51f3e23090dd843927cff37e..0000000000000000000000000000000000000000 --- a/spring-data-jdbc-mybatis-test/src/test/resources/logback-spring.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - %d{yyyy-MM-dd HH:mm:ss SSS}|${appDev}|${appName}|%-5level|%ipandhostname|[%thread]| %logger{50}| %msg%n - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/spring-data-jdbc-mybatis-test/src/test/resources/sql/UserInfoRepository.md b/spring-data-jdbc-mybatis-test/src/test/resources/sql/UserInfoRepository.md deleted file mode 100644 index 05cce32c529d18d1c4f185f0fc1ef25c30e9496b..0000000000000000000000000000000000000000 --- a/spring-data-jdbc-mybatis-test/src/test/resources/sql/UserInfoRepository.md +++ /dev/null @@ -1,160 +0,0 @@ -## query example - -### base query columns -``` --- column -id,user_code,user_name,mobile_no,address,create_time -``` - -``` --- findListByUserCode -select [@id column] from user_info where user_code = #{userCode} -``` - -``` --- findOneByUserCode -select [@id column] from user_info where user_code = #{userCode} -``` - -``` --- findUserNameByCode -select user_name from user_info where user_code = #{userCode} -``` - -``` --- findUserList -select [@id column] from user_info -where -user_name = #{userName} -[@@and is_delete = isDelete] -[@@and create_time < createTime] - -``` - - -``` --- findUserBySearchParam -select * from user_info - -[@@and user_name like param.userName] -[@id whereSql] - -``` - -```sql --- whereSql -[@and create_time <= param.createTime] -``` - - - - -> sql 片段 -``` --- findListWhereSql -user_name = #{userName} and 1=1 -[@and create_time < createTime] -``` - -> 查询用户名 返回1个字段的情况 比如查询行数等 -``` --- findUserName -SELECT user_name FROM user_info -WHERE user_name = #{userName} -``` - - -> 根据Id列表查询列表 -``` --- findListByIdsx -SELECT * FROM user_info - - and user_name <> #{userName} - and id in #{item} - and create_time < #{createTime} - - -``` - -> [@and create_time < createTime] - -> 根据Id列表查询列表 简写if 和in查询 可混用 -``` --- findListByIds -SELECT [@id column] FROM user_info - -[@@and id in #{idList:in} and user_name like #{userName:like}] -[@and user_name like userName%] -[@and id in idList] - and create_time < #{createTime} - -``` - -> 更新方法 update 开头 - -``` --- updateIsDelete -update user_info set is_delete = #{isDelete} where id =#{id} -``` - -``` --- batchUpdate -update user_info set is_delete = IFNULL(#{isDelete},is_delete),user_name =#{userName} where id =#{id} -``` - - -``` --- batchInsert -insert into user_info(`user_name`,`mobile_phone`,create_time) values -(#{userName},#{mobilePhone},#{createTime}) -``` - -``` --- updateTest - -insert into user_info(`user_name`,`mobile_phone`) values (#{item.userName},#{item.firstPhone}); - - -``` - -``` --- insertBatchNormal -insert into user_info(`user_name`,`mobile_phone`,create_time) values - -(#{item.userName},#{item.mobilePhone},#{item.createTime}) - - -``` - -``` --- insertBatchNormalX -insert into user_info(`id`,`code`,`user_name`,`mobile_phone`,`is_delete`,`create_time`,`update_time`,`head_image_data`) values - -(IFNULL(#{item.id},`id`),IFNULL(#{item.code},`code`),IFNULL(#{item.userName},`user_name`),IFNULL(#{item.mobilePhone},`mobile_phone`) -,IFNULL(#{item.isDelete},`is_delete`),IFNULL(#{item.createTime},now()),IFNULL(#{item.updateTime},now()),IFNULL(#{item.headImageData},`head_image_data`)) - -``` - - -``` --- findBigData -select * from user_info - -[@and user_name like userName] - -``` - - -``` --- findLongList -select id from user_info -``` - -``` --- findInList - -select * from user_info -where 1=1 -[@@and user_name in userNames] -[@@and is_delete in isDeletes] -``` \ No newline at end of file diff --git a/spring-data-jdbc-mybatis/pom.xml b/spring-data-jdbc-mybatis/pom.xml index 1a4ca3b20efa2c5641133a2f15cfe759fb1e07d4..f121a3720f1b79bc057bc03b64e37f5463d52a79 100644 --- a/spring-data-jdbc-mybatis/pom.xml +++ b/spring-data-jdbc-mybatis/pom.xml @@ -10,7 +10,7 @@ spring-data-jdbc-mybatis 2.5.0 - spring data mybatis mini + spring-data-jdbc-mybatis spring data jdbc with mybatis template dynamic query https://github.com/VonChange/spring-data-jdbc-mybatis @@ -19,7 +19,6 @@ 8.0.15 2.5.0 - com.vonchange.common @@ -32,13 +31,6 @@ ${springdata.commons} provided - - org.springframework - spring-tx - ${spring.commons} - provided - - org.springframework spring-context @@ -46,25 +38,6 @@ provided - - org.springframework - spring-beans - ${spring.commons} - provided - - - - org.springframework - spring-jdbc - ${spring.commons} - provided - - - org.springframework - spring-core - ${spring.commons} - provided - diff --git a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/config/ConfigInfo.java b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/config/ConfigInfo.java index 8b1ad1905e2b763439cf672bb922f6cd09e05e0e..8d7fab5ee9354845e3b5a2b9dfbf53e8e95cff6e 100644 --- a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/config/ConfigInfo.java +++ b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/config/ConfigInfo.java @@ -5,7 +5,7 @@ import com.vonchange.jdbc.abstractjdbc.model.DataSourceWrapper; public class ConfigInfo { private String location; private String method; - private Class type; + private Class domainType; private String repositoryName; private DataSourceWrapper dataSourceWrapper; @@ -42,11 +42,11 @@ public class ConfigInfo { this.method = method; } - public Class getType() { - return type; + public Class getDomainType() { + return domainType; } - public void setType(Class type) { - this.type = type; + public void setDomainType(Class domainType) { + this.domainType = domainType; } } diff --git a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/config/JdbcAuditingRegistrar.java b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/config/JdbcAuditingRegistrar.java index 4f0c541fe50476b66a229c68bbfe5e660b2708c2..373585886a1f318122dcebdc4416aa34522faba7 100644 --- a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/config/JdbcAuditingRegistrar.java +++ b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/config/JdbcAuditingRegistrar.java @@ -18,7 +18,6 @@ package com.vonchange.jdbc.mybatis.core.config; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; -import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.data.auditing.IsNewAwareAuditingHandler; import org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport; import org.springframework.data.auditing.config.AuditingConfiguration; @@ -27,7 +26,7 @@ import org.springframework.util.Assert; import java.lang.annotation.Annotation; /** - * {@link ImportBeanDefinitionRegistrar} which registers additional beans in order to enable auditing via the + * {@link1 ImportBeanDefinitionRegistrar} which registers additional beans in order to enable auditing via the * {@link EnableJdbcAuditing} annotation. * * @see EnableJdbcAuditing diff --git a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/config/JdbcRepositoriesRegistrar.java b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/config/JdbcRepositoriesRegistrar.java index 43ba764602cbc3687f4cebf925914ffb6e81a9b5..80b8966a865a9c4a8f76f87397288d8f2292fdfc 100644 --- a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/config/JdbcRepositoriesRegistrar.java +++ b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/config/JdbcRepositoriesRegistrar.java @@ -15,14 +15,14 @@ */ package com.vonchange.jdbc.mybatis.core.config; -import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; + import org.springframework.data.repository.config.RepositoryBeanDefinitionRegistrarSupport; import org.springframework.data.repository.config.RepositoryConfigurationExtension; import java.lang.annotation.Annotation; /** - * {@link ImportBeanDefinitionRegistrar} to enable {@link EnableJdbcRepositories} annotation. + * enable {@link EnableJdbcRepositories} annotation. * * @author Jens Schauder */ diff --git a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/query/SqlPackage.java b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/query/SqlPackage.java deleted file mode 100644 index 89a02dabc5886ffa4d7fbdbc97aa71b02fb7d4d6..0000000000000000000000000000000000000000 --- a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/query/SqlPackage.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.vonchange.jdbc.mybatis.core.query; - -import java.lang.annotation.*; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -@Documented -@Inherited -public @interface SqlPackage { - - /** - * sql package location - */ - String value() default ""; -} \ No newline at end of file diff --git a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/BaseModel.java b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/BaseModel.java deleted file mode 100644 index 6c8e72ee426938db76cadc906bddb64ada3bb9ca..0000000000000000000000000000000000000000 --- a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/BaseModel.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.vonchange.jdbc.mybatis.core.support; - -public class BaseModel { - private Long id; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } -} diff --git a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/CrudRepository.java b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/CrudJdbcRepository.java similarity index 58% rename from spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/CrudRepository.java rename to spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/CrudJdbcRepository.java index c860c3519303674355e065e51bb40f2fbce15a09..717a171a2d18f6cf73e5e1d64a054bacaffd2abe 100644 --- a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/CrudRepository.java +++ b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/CrudJdbcRepository.java @@ -19,6 +19,7 @@ import org.springframework.data.repository.NoRepositoryBean; import org.springframework.data.repository.Repository; import java.util.List; +import java.util.Optional; /** * Interface for generic CRUD operations on a repository for a specific type. @@ -27,40 +28,38 @@ import java.util.List; * @author Eberhard Wolff */ @NoRepositoryBean -public interface CrudRepository extends Repository { +public interface CrudJdbcRepository extends Repository { + + int save(S entity); /** - * Saves a given entity. Use the returned instance for further operations as the save operation might have changed the - * entity instance completely. - * - * @param entity must not be {@literal null}. - * @return the saved entity; will never be {@literal null}. - * @throws IllegalArgumentException in case the given {@literal entity} is {@literal null}. + * saveAll null will save + * @param entities + * @param batchSize + * @param */ - int insert(S entity); + int saveAll(List entities,int batchSize); - int insertBatch(List entitys,int batchSize); + int saveAllNotNull(List entities,int batchSize); /** - * 默认只更新不为空的字段 + * update not null fields * @param entity * @param */ int update(S entity); /** - * 更新所有字段 + * update all fields * @param entity * @param */ int updateAllField(S entity); - /** - * Retrieves an entity by its id. - * - * @param id must not be {@literal null}. - * @return the entity with the given id or {@literal Optional#empty()} if none found. - * @throws IllegalArgumentException if {@literal id} is {@literal null}. - */ + T findById(ID id); + List findAllById(List ids); + boolean existsById(ID id); + int deleteById(ID id); + int deleteAllById(List ids); } diff --git a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/JdbcQueryLookupStrategy.java b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/JdbcQueryLookupStrategy.java index 1c6dd8f07e59115e9a6465cc55eaf53ba4b6c0bc..f46a91a84a7071efb0df70241f2a38b1d18837f0 100644 --- a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/JdbcQueryLookupStrategy.java +++ b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/JdbcQueryLookupStrategy.java @@ -15,11 +15,14 @@ */ package com.vonchange.jdbc.mybatis.core.support; +import com.vonchange.common.util.StringPool; +import com.vonchange.common.util.UtilAll; +import com.vonchange.jdbc.abstractjdbc.config.ConstantJdbc; import com.vonchange.jdbc.mybatis.core.config.ConfigInfo; import com.vonchange.jdbc.mybatis.core.query.DataSourceKey; -import com.vonchange.jdbc.mybatis.core.query.SqlPackage; import com.vonchange.jdbc.abstractjdbc.core.JdbcRepository; import com.vonchange.jdbc.mybatis.core.config.DataSourceWrapperHelper; +import com.vonchange.jdbc.mybatis.core.util.JdbcMybatisUtil; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.projection.ProjectionFactory; import org.springframework.data.repository.core.NamedQueries; @@ -28,6 +31,7 @@ import org.springframework.data.repository.query.QueryLookupStrategy; import org.springframework.data.repository.query.RepositoryQuery; import org.springframework.util.Assert; +import java.io.InputStream; import java.lang.reflect.Method; /** @@ -62,19 +66,17 @@ class JdbcQueryLookupStrategy implements QueryLookupStrategy { @Override public RepositoryQuery resolveQuery(Method method, RepositoryMetadata repositoryMetadata, ProjectionFactory projectionFactory, NamedQueries namedQueries) { - String interfaceName =repositoryMetadata.getRepositoryInterface().getSimpleName(); - SqlPackage sqlPackage= repositoryMetadata.getRepositoryInterface().getAnnotation(SqlPackage.class); + String configLoc = JdbcMybatisUtil.interfaceNameMd(repositoryMetadata.getRepositoryInterface()); DataSourceKey dataSourceKey= repositoryMetadata.getRepositoryInterface().getAnnotation(DataSourceKey.class); - String configLoc=null!=sqlPackage?sqlPackage.value()+"."+interfaceName:"sql."+interfaceName; String dataSourceKeyValue=null!=dataSourceKey?dataSourceKey.value():null; JdbcQueryMethod queryMethod = new JdbcQueryMethod(method, repositoryMetadata, projectionFactory); ConfigInfo configInfo= new ConfigInfo(); configInfo.setMethod(method.getName()); configInfo.setLocation(configLoc); - configInfo.setRepositoryName(interfaceName); - configInfo.setType(repositoryMetadata.getDomainType()); + configInfo.setDomainType(repositoryMetadata.getDomainType()); configInfo.setDataSourceWrapper(null!=dataSourceKeyValue?dataSourceWrapperHelper.getDataSourceWrapperByKey(dataSourceKeyValue):null); return new JdbcRepositoryQuery(queryMethod, operations,configInfo); } + } diff --git a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/JdbcRepositoryFactory.java b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/JdbcRepositoryFactory.java index 64de821aa7b56ac635fde0738972712df0eab6c9..365c373ead36e8362fc549c9f6331127b97b5a9a 100644 --- a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/JdbcRepositoryFactory.java +++ b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/JdbcRepositoryFactory.java @@ -18,15 +18,15 @@ package com.vonchange.jdbc.mybatis.core.support; import com.vonchange.common.util.MarkdownUtil; import com.vonchange.common.util.StringPool; +import com.vonchange.jdbc.abstractjdbc.config.ConstantJdbc; import com.vonchange.jdbc.mybatis.core.config.ConfigInfo; import com.vonchange.jdbc.mybatis.core.query.DataSourceKey; -import com.vonchange.jdbc.mybatis.core.query.SqlPackage; import com.vonchange.jdbc.abstractjdbc.core.JdbcRepository; +import com.vonchange.jdbc.mybatis.core.util.JdbcMybatisUtil; import com.vonchange.mybatis.tpl.EntityUtil; import com.vonchange.jdbc.mybatis.core.config.DataSourceWrapperHelper; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.repository.core.EntityInformation; import org.springframework.data.repository.core.RepositoryInformation; import org.springframework.data.repository.core.RepositoryMetadata; @@ -52,7 +52,6 @@ public class JdbcRepositoryFactory extends RepositoryFactorySupport { /** * - * and {@link ApplicationEventPublisher}. * * @param operations must not be {@literal null}. */ @@ -73,22 +72,24 @@ public class JdbcRepositoryFactory extends RepositoryFactorySupport { @Override protected Object getTargetRepository(RepositoryInformation repositoryInformation) { Class domainType =repositoryInformation.getDomainType(); - if(!domainType.equals(BaseModel.class)){ + EntityUtil.initEntityInfo(domainType); + /*if(!domainType.equals(BaseModel.class)){//QueryRepository EntityUtil.initEntityInfo(domainType); - } - String interfaceName =repositoryInformation.getRepositoryInterface().getSimpleName(); - SqlPackage sqlPackage= repositoryInformation.getRepositoryInterface().getAnnotation(SqlPackage.class); - String configLoc=null!=sqlPackage?sqlPackage.value():"sql"; + }*/ + String mdFile= JdbcMybatisUtil.interfaceNameMd(repositoryInformation.getRepositoryInterface()); //初始化markdown数据 - MarkdownUtil.readMarkdownFile(configLoc+ StringPool.DOT+interfaceName,false); + if(null!=mdFile){ + MarkdownUtil.readMarkdownFile(mdFile,false); + } DataSourceKey dataSourceKey=repositoryInformation.getRepositoryInterface().getAnnotation(DataSourceKey.class); String dataSourceKeyValue=null!=dataSourceKey?dataSourceKey.value():null; ConfigInfo configInfo= new ConfigInfo(); - configInfo.setType(repositoryInformation.getDomainType()); + configInfo.setDomainType(repositoryInformation.getDomainType()); configInfo.setDataSourceWrapper(null!=dataSourceKeyValue?dataSourceWrapperHelper.getDataSourceWrapperByKey(dataSourceKeyValue):null); return new SimpleJdbcRepository<>(operations,configInfo); } + /* * (non-Javadoc) * @see org.springframework.data.repository.core.support.RepositoryFactorySupport#getRepositoryBaseClass(org.springframework.data.repository.core.RepositoryMetadata) diff --git a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/JdbcRepositoryQuery.java b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/JdbcRepositoryQuery.java index 491938a397fc6e3e8fc713c69f743ebd4c106249..d794ca2a5402b3115556db1f5a67d9d919df0704 100644 --- a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/JdbcRepositoryQuery.java +++ b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/JdbcRepositoryQuery.java @@ -18,16 +18,19 @@ package com.vonchange.jdbc.mybatis.core.support; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; +import com.vonchange.common.util.MarkdownUtil; +import com.vonchange.common.util.StringPool; +import com.vonchange.jdbc.abstractjdbc.config.ConstantJdbc; import com.vonchange.jdbc.mybatis.core.config.ConfigInfo; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.data.domain.Pageable; import org.springframework.data.repository.query.Parameters; import org.springframework.data.repository.query.RepositoryQuery; -import org.springframework.jdbc.core.RowMapper; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -59,7 +62,6 @@ class JdbcRepositoryQuery implements RepositoryQuery { /** * Creates a new {@link JdbcRepositoryQuery} for the given * {@link JdbcQueryMethod}, and - * {@link RowMapper}. * * @param queryMethod must not be {@literal null}. * @param operations must not be {@literal null}. @@ -90,7 +92,18 @@ class JdbcRepositoryQuery implements RepositoryQuery { @SuppressWarnings("unchecked") private Object executeDo(Object[] objects) { BindParameterWrapper parameters = bindParameter(objects); - String sqlId = configInfo.getLocation() + "." + configInfo.getMethod(); + String sqlId; + boolean nameQuery=false; + if(null!=configInfo.getLocation()){ + sqlId = configInfo.getLocation() + StringPool.DOT + configInfo.getMethod(); + }else{ + sqlId=configInfo.getMethod(); + } + String sql = MarkdownUtil.getContent(sqlId,false); + if(null==sql){ + nameQuery=true; + sqlId=configInfo.getMethod(); + } DataSourceWrapper dataSourceWrapper = configInfo.getDataSourceWrapper(); if (null == dataSourceWrapper && queryMethod.isReadDataSource()) { dataSourceWrapper = operations.getReadDataSource(); @@ -115,24 +128,33 @@ class JdbcRepositoryQuery implements RepositoryQuery { parameters.getAbstractPageWork(), parameters.getParameter()); } if (queryMethod.isCollectionQuery() || queryMethod.isStreamQuery()) { + if(nameQuery){ + parameters.getParameter().put(ConstantJdbc.EntityType,queryMethod.getReturnedObjectType()); + } return operations.queryList(dataSourceWrapper, queryMethod.getReturnedObjectType(), sqlId, parameters.getParameter()); } if (queryMethod.isPageQuery()) { + if(nameQuery){ + parameters.getParameter().put(ConstantJdbc.EntityType,queryMethod.getReturnedObjectType()); + } return operations.queryPage(dataSourceWrapper, queryMethod.getReturnedObjectType(), sqlId, parameters.getPageable(), parameters.getParameter()); } if (ClazzUtils.isBaseType(queryMethod.getReturnedObjectType())) { + if(nameQuery){ + Assert.notNull(configInfo.getDomainType(),"domain type must not null,define crudRepository"); + parameters.getParameter().put(ConstantJdbc.EntityType,configInfo.getDomainType()); + } return operations.queryOneColumn(dataSourceWrapper, queryMethod.getReturnedObjectType(), sqlId, parameters.getParameter()); } - try { - return operations.queryOne(dataSourceWrapper, queryMethod.getReturnedObjectType(), sqlId, - parameters.getParameter()); - } catch (EmptyResultDataAccessException e) { - return null; + if(nameQuery){ + parameters.getParameter().put(ConstantJdbc.EntityType,queryMethod.getReturnedObjectType()); } + return operations.queryOne(dataSourceWrapper, queryMethod.getReturnedObjectType(), sqlId, + parameters.getParameter()); } /* @@ -149,7 +171,7 @@ class JdbcRepositoryQuery implements RepositoryQuery { @SuppressWarnings("unchecked") private BindParameterWrapper bindParameter(Object[] objects) { Parameters parameters = queryMethod.getParameters(); - Map map = new HashMap<>(); + Map map = new LinkedHashMap<>(); BindParameterWrapper bindParameterWrapper = new BindParameterWrapper<>(); if (objects.length > 0) { if (parameters.getPageableIndex() >= 0) { @@ -170,10 +192,12 @@ class JdbcRepositoryQuery implements RepositoryQuery { if (queryMethod.isBatchUpdate()) { return bindParameterWrapper; } + AtomicInteger i= new AtomicInteger(); queryMethod.getParameters().getBindableParameters().forEach(p -> { - String parameterName = p.getName() - .orElseThrow(() -> new IllegalStateException(PARAMETER_NEEDS_TO_BE_NAMED)); + String parameterName = p.getName().orElse(i.toString()); + //.orElseThrow(() -> new IllegalStateException(PARAMETER_NEEDS_TO_BE_NAMED)); map.put(parameterName, objects[p.getIndex()]); + i.getAndIncrement(); }); bindParameterWrapper.setParameter(map); return bindParameterWrapper; diff --git a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/QueryRepository.java b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/QueryRepository.java index d985de7b4cc43e67ec39e87c580273de0aa76a88..f411a7202b876b5c5690c3d5f44cb759b6915905 100644 --- a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/QueryRepository.java +++ b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/QueryRepository.java @@ -22,6 +22,6 @@ import org.springframework.data.repository.Repository; * only query */ @NoRepositoryBean -public interface QueryRepository extends Repository { +public interface QueryRepository extends Repository { } diff --git a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/SimpleJdbcRepository.java b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/SimpleJdbcRepository.java index 36f79c7a7eddf054ca8f707c2a9840bb1f512ddc..63ea54285b0cf4644108affa2a1ed7e3bc7442f8 100644 --- a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/SimpleJdbcRepository.java +++ b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/support/SimpleJdbcRepository.java @@ -18,10 +18,9 @@ package com.vonchange.jdbc.mybatis.core.support; import com.vonchange.jdbc.mybatis.core.config.ConfigInfo; import com.vonchange.jdbc.abstractjdbc.core.JdbcRepository; import org.springframework.beans.factory.annotation.Qualifier; - import java.util.List; -public class SimpleJdbcRepository implements CrudRepository { +public class SimpleJdbcRepository implements CrudJdbcRepository { private final JdbcRepository entityOperations; private final ConfigInfo configInfo; @@ -37,13 +36,17 @@ public class SimpleJdbcRepository implements CrudRepository { * @see org.springframework.data.repository.CrudRepository#save(S) */ @Override - public int insert(S instance) { + public int save(S instance) { return entityOperations.insert(configInfo.getDataSourceWrapper(), instance); } @Override - public int insertBatch(List entitys, int batchSize) { - return entityOperations.insertBatch(configInfo.getDataSourceWrapper(), entitys, batchSize); + public int saveAll(List entities, int batchSize) { + return entityOperations.insertBatch(configInfo.getDataSourceWrapper(), entities, true,batchSize); + } + @Override + public int saveAllNotNull(List entities, int batchSize) { + return entityOperations.insertBatch(configInfo.getDataSourceWrapper(), entities,false, batchSize); } @Override @@ -59,7 +62,30 @@ public class SimpleJdbcRepository implements CrudRepository { @Override @SuppressWarnings("unchecked") public T findById(ID id) { - return (T) entityOperations.queryById(configInfo.getDataSourceWrapper(), configInfo.getType(), id); + Class tClass= (Class) configInfo.getDomainType(); + return entityOperations.queryById(configInfo.getDataSourceWrapper(), tClass, id); + } + + @Override + @SuppressWarnings("unchecked") + public List findAllById(List ids) { + Class tClass= (Class) configInfo.getDomainType(); + return entityOperations.queryByIds(configInfo.getDataSourceWrapper(),tClass, ids); + } + + @Override + public boolean existsById(ID id) { + return entityOperations.existsById(configInfo.getDataSourceWrapper(), configInfo.getDomainType(), id); + } + + @Override + public int deleteById(ID id) { + return entityOperations.deleteById(configInfo.getDataSourceWrapper(), configInfo.getDomainType(), id); + } + + @Override + public int deleteAllById(List ids) { + return entityOperations.deleteByIds(configInfo.getDataSourceWrapper(), configInfo.getDomainType(), ids); } } diff --git a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/util/JdbcMybatisUtil.java b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/util/JdbcMybatisUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..416bf13b2111e373aea26047c760aaee3b5b609a --- /dev/null +++ b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/core/util/JdbcMybatisUtil.java @@ -0,0 +1,26 @@ +package com.vonchange.jdbc.mybatis.core.util; + +import com.vonchange.common.util.StringPool; +import com.vonchange.common.util.UtilAll; +import com.vonchange.jdbc.abstractjdbc.config.ConstantJdbc; + +public class JdbcMybatisUtil { + + public static String interfaceNameMd(Class interfaceDefine){ + String interfaceName =ConstantJdbc.SqlPackage + +StringPool.DOT+interfaceDefine.getSimpleName(); + + boolean flag = UtilAll.UFile.isClassResourceExist( + UtilAll.UFile.classPath(interfaceName)+StringPool.markdown_suffix); + if(flag){ + return interfaceName; + } + String fullName =interfaceDefine.getName(); + flag = UtilAll.UFile.isClassResourceExist(UtilAll.UFile.classPath(fullName)+ StringPool.markdown_suffix); + if(flag){ + return fullName; + } + return null; + } + +} diff --git a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/repository/DataSourceInSql.java b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/repository/DataSourceInSql.java deleted file mode 100644 index 2c221a22b393acb5aa4aad90a95e4bee18940f8e..0000000000000000000000000000000000000000 --- a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/repository/DataSourceInSql.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.vonchange.jdbc.mybatis.repository; - -import com.vonchange.jdbc.abstractjdbc.model.DataSourceWrapper; - -public interface DataSourceInSql { - DataSourceWrapper getDataSourceFromSql(String sql); -} diff --git a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/repository/JdbcRepositorySpringImpl.java b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/repository/JdbcRepositorySpringImpl.java index 89c891e65c7e16e1e02126553ad7fb6296bba530..9a43d60c7381676d2e9af121301b6239c43d4572 100644 --- a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/repository/JdbcRepositorySpringImpl.java +++ b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/repository/JdbcRepositorySpringImpl.java @@ -19,16 +19,15 @@ import java.util.Random; public class JdbcRepositorySpringImpl extends AbstractJdbcCore { private static final Logger log = LoggerFactory.getLogger(JdbcRepositorySpringImpl.class); - private static final Random RANDOM = new Random(); private DataSource[] dataSources; private DataSource dataSource; - @Value("${jdbc-mybatis.logWrite:false}") + @Value("${jdbc.mybatis.logWrite:false}") private boolean logWrite; - @Value("${jdbc-mybatis.logRead:false}") + @Value("${jdbc.mybatis.logRead:false}") private boolean logRead; - @Value("${jdbc-mybatis.logFullSql:false}") + @Value("${jdbc.mybatis.logFullSql:false}") private boolean logFullSql; - @Value("${jdbc-mybatis.dialect:}") + @Value("${jdbc.mybatis.dialect:}") private String dialect; @Autowired @@ -40,6 +39,7 @@ public class JdbcRepositorySpringImpl extends AbstractJdbcCore { this.dataSources = dataSources; } + @Override protected Dialect getDefaultDialect() { if ("".equals(dialect)) { @@ -55,6 +55,9 @@ public class JdbcRepositorySpringImpl extends AbstractJdbcCore { @Override public DataSourceWrapper getReadDataSource() { + if (null == dataSources || dataSources.length == 0) { + throw new JdbcMybatisRuntimeException("no dataSource"); + } return new DataSourceWrapper(dataSource, ConstantJdbc.DataSourceDefault); } diff --git a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/repository/ReadDataSources.java b/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/repository/ReadDataSources.java deleted file mode 100644 index 2d115d5d710b4458104da93bde80c3db21fd228a..0000000000000000000000000000000000000000 --- a/spring-data-jdbc-mybatis/src/main/java/com/vonchange/jdbc/mybatis/repository/ReadDataSources.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.vonchange.jdbc.mybatis.repository; - -import javax.sql.DataSource; - -public interface ReadDataSources { - DataSource[] allReadDataSources(); -} diff --git a/spring-data-jdbc-mybatis/src/main/java/org/springframework/data/repository/CrudRepository.java b/spring-data-jdbc-mybatis/src/main/java/org/springframework/data/repository/CrudRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..d909599bea5517a1771967c03ccf0ca43509af7e --- /dev/null +++ b/spring-data-jdbc-mybatis/src/main/java/org/springframework/data/repository/CrudRepository.java @@ -0,0 +1,6 @@ +package org.springframework.data.repository; +@NoRepositoryBean +@Deprecated +public interface CrudRepository extends Repository { + +} \ No newline at end of file