diff --git a/build.gradle b/build.gradle index 4c2cbc9..5a2c7f1 100644 --- a/build.gradle +++ b/build.gradle @@ -22,6 +22,7 @@ dependencies { compile("org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.2.Final") compile('org.springframework:spring-jdbc:5.1.9.RELEASE') compile('mysql:mysql-connector-java:5.1.47') + compile('com.alibaba:druid:1.2.4') } repositories { @@ -55,7 +56,7 @@ uploadArchives { authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD) } pom.project { - version '2.1.36' + version '2.1.38' artifactId ARTIFACT_Id groupId GROUP_ID packaging TYPE diff --git a/src/main/java/com/taover/repository/CustomJdbcTemplate.java b/src/main/java/com/taover/repository/CustomJdbcTemplate.java index bbdaab6..0e99777 100644 --- a/src/main/java/com/taover/repository/CustomJdbcTemplate.java +++ b/src/main/java/com/taover/repository/CustomJdbcTemplate.java @@ -45,6 +45,12 @@ public class CustomJdbcTemplate { return this.customJdbcTemplateRowMapper; } + public CustomJdbcTemplate(JdbcTemplate jdbcTemplateWrite) throws Exception{ + this(); + this.jdbcTemplateWrite = jdbcTemplateWrite; + this.jdbcTemplateRead = jdbcTemplateWrite; + } + public CustomJdbcTemplate() throws Exception{ //获取泛型类Class this.tClassInfo = (Class)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0]; diff --git a/src/main/java/com/taover/repository/CustomJdbcTemplateRowMapper.java b/src/main/java/com/taover/repository/CustomJdbcTemplateRowMapper.java index e153b17..a1693de 100644 --- a/src/main/java/com/taover/repository/CustomJdbcTemplateRowMapper.java +++ b/src/main/java/com/taover/repository/CustomJdbcTemplateRowMapper.java @@ -4,22 +4,38 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.HashMap; import java.util.Map; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.support.rowset.ResultSetWrappingSqlRowSetMetaData; -public class CustomJdbcTemplateRowMapper implements RowMapper{ +public class CustomJdbcTemplateRowMapper implements RowMapper{ + Log log = LogFactory.getLog(this.getClass()); + + private Map beanFielNameToField = new HashMap(); + private Method beforeMethod = null; + private Method afterMethod = null; + private Class classInfo; - private Map tableToBeanMap; - + private Map tableToBeanMap; + public CustomJdbcTemplateRowMapper(Class classInfo, Map tableToBeanMap) { this.classInfo = classInfo; this.tableToBeanMap = tableToBeanMap; - } - - @Override - public E mapRow(ResultSet rs, int index) throws SQLException { + + Field[] fields = this.classInfo.getDeclaredFields(); + for(Field item: fields) { + try { + item.setAccessible(true); + this.beanFielNameToField.put(item.getName(), item); + }catch (Exception e) { + log.error("set field accessible:"+e.getMessage()); + } + } + boolean hasImplementPointCut = false; Class[] interfaceArr = this.classInfo.getInterfaces(); for(int i=0; i implements RowMapper{ } } + if(hasImplementPointCut){ + try{ + beforeMethod = this.classInfo.getDeclaredMethod("before"); + beforeMethod.setAccessible(true); + }catch(Exception e){ + log.error("set before method exception:"+e.getMessage()); + } + + try{ + afterMethod = this.classInfo.getDeclaredMethod("after"); + afterMethod.setAccessible(true); + }catch(Exception e){ + log.error("set after method exception:"+e.getMessage()); + } + } + } + + @Override + public E mapRow(ResultSet rs, int index) throws SQLException { E targetObj; try { targetObj = this.classInfo.newInstance(); @@ -36,13 +71,11 @@ public class CustomJdbcTemplateRowMapper implements RowMapper{ throw new RuntimeException(e); } - if(hasImplementPointCut){ + if(this.beforeMethod != null){ try{ - Method beforeMethod = this.classInfo.getDeclaredMethod("before"); - beforeMethod.setAccessible(true); beforeMethod.invoke(targetObj); - }catch(Exception e){ - e.printStackTrace(); + }catch(Exception e){ + log.error("invoke before exception:"+e.getMessage()); } } @@ -52,25 +85,33 @@ public class CustomJdbcTemplateRowMapper implements RowMapper{ String tableFieldName = wapping.getColumnLabel(i); String beanFieldName = this.tableToBeanMap.get(tableFieldName); Object value = rs.getObject(i); + Field beanField = this.beanFielNameToField.get(beanFieldName); + if(null == value || beanFieldName == null && beanField == null){ + continue; + } try { - if(null != value && beanFieldName != null){ - Field beanField = this.classInfo.getDeclaredField(beanFieldName); - beanField.setAccessible(true); - beanField.set(targetObj, value); - } - } catch (Exception e) { - e.printStackTrace(); + beanField.set(targetObj, value); + } catch (IllegalArgumentException e) { + if("Integer".equals(value.getClass().getSimpleName()) && "Long".equals(beanField.getType().getSimpleName())) { + try { + beanField.set(targetObj, Long.valueOf(value.toString())); + } catch (IllegalArgumentException | IllegalAccessException e1) { + log.error("map set object field error -> Integer convert Long:"+e.getMessage()); + } + }else { + log.error("map set object field error:"+e.getMessage()); + } + } catch (IllegalAccessException e) { + log.error("map set object field error:"+e.getMessage()); } } - if(hasImplementPointCut){ - try{ - Method afterMethod = this.classInfo.getDeclaredMethod("after"); - afterMethod.setAccessible(true); + if(this.afterMethod != null){ + try { afterMethod.invoke(targetObj); - }catch(Exception e){ - e.printStackTrace(); - } + }catch (Exception e) { + log.error("invoke after exception:"+e.getMessage()); + } } return targetObj; diff --git a/src/main/java/com/taover/repository/CustomJdbcTemplateWrapperTenant.java b/src/main/java/com/taover/repository/CustomJdbcTemplateWrapperTenant.java index c23f142..4a844ac 100644 --- a/src/main/java/com/taover/repository/CustomJdbcTemplateWrapperTenant.java +++ b/src/main/java/com/taover/repository/CustomJdbcTemplateWrapperTenant.java @@ -48,6 +48,11 @@ public class CustomJdbcTemplateWrapperTenant impleme return this.customJdbcTemplateRowMapper; } + public CustomJdbcTemplateWrapperTenant(JdbcTemplate jdbcTemplateWrite) throws Exception{ + this(); + this.jdbcTemplateWrite = jdbcTemplateWrite; + } + public CustomJdbcTemplateWrapperTenant() throws Exception{ //获取泛型类Class this.tClassInfo = (Class)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0]; diff --git a/src/test/java/com/taover/repository/test/TestMapper.java b/src/test/java/com/taover/repository/test/TestMapper.java new file mode 100644 index 0000000..58903cf --- /dev/null +++ b/src/test/java/com/taover/repository/test/TestMapper.java @@ -0,0 +1,32 @@ +package com.taover.repository.test; + +import java.util.Properties; + +import javax.sql.DataSource; + +import org.springframework.jdbc.core.JdbcTemplate; + +import com.alibaba.druid.pool.DruidDataSourceFactory; +import com.taover.repository.test.repository.CommonRegionRepository; + +public class TestMapper { + public static void main(String[] args) { + Properties properties = new Properties(); + properties.setProperty(DruidDataSourceFactory.PROP_URL, "jdbc:mysql://rdsifmezqifmezqo.mysql.rds.aliyuncs.com:3306/bzyun_wxorder?characterEncoding=UTF-8"); + properties.setProperty(DruidDataSourceFactory.PROP_USERNAME, "tylife"); + properties.setProperty(DruidDataSourceFactory.PROP_PASSWORD, "lexi365"); + properties.setProperty(DruidDataSourceFactory.PROP_INITIALSIZE, "5"); + properties.setProperty(DruidDataSourceFactory.PROP_MAXACTIVE, "8"); + DataSource ds = null; + try { + ds = new DruidDataSourceFactory().createDataSource(properties); + JdbcTemplate template = new JdbcTemplate(ds); + //System.out.println(template.queryForObject("select count(*) from wxorder_order", Integer.class)); + CommonRegionRepository repo = new CommonRegionRepository(template); + System.out.println(repo.findListBySql("1=1")); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } +} diff --git a/src/test/java/com/taover/repository/test/repository/CommonRegionEntity.java b/src/test/java/com/taover/repository/test/repository/CommonRegionEntity.java new file mode 100644 index 0000000..bae2788 --- /dev/null +++ b/src/test/java/com/taover/repository/test/repository/CommonRegionEntity.java @@ -0,0 +1,113 @@ +package com.taover.repository.test.repository; + +import java.io.Serializable; +import java.util.List; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * @version 1.0.0 + */ +@Entity +@Table(name="common_region", catalog="") +public class CommonRegionEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + + /** + * 主键ID + */ + @Id + @Column(name="region_id") + private java.lang.Long regionId; + + public java.lang.Long getRegionId(){ + return regionId; + } + public void setRegionId(java.lang.Long regionId){ + this.regionId = regionId; + } + + /** + * 父级ID + */ + @Column(name="parent_id") + private java.lang.Long parentId; + + public java.lang.Long getParentId(){ + return parentId; + } + public void setParentId(java.lang.Long parentId){ + this.parentId = parentId; + } + + /** + * 地区名称 + */ + @Column(name="region_name") + private java.lang.String regionName; + + public java.lang.String getRegionName(){ + return regionName; + } + public void setRegionName(java.lang.String regionName){ + this.regionName = regionName; + } + + /** + * 地区级别 + */ + @Column(name="region_type") + private java.lang.Integer regionType; + + public java.lang.Integer getRegionType(){ + return regionType; + } + public void setRegionType(java.lang.Integer regionType){ + this.regionType = regionType; + } + + /** + * 地区编码 + */ + @Column(name="region_code") + private java.lang.String regionCode; + + public java.lang.String getRegionCode(){ + return regionCode; + } + public void setRegionCode(java.lang.String regionCode){ + this.regionCode = regionCode; + } + + /** + * 大地区 + */ + @Column(name="large_area") + private java.lang.String largeArea; + + public java.lang.String getLargeArea(){ + return largeArea; + } + public void setLargeArea(java.lang.String largeArea){ + this.largeArea = largeArea; + } + + public transient List children = null; + + public List getChildren() { + return children; + } + public void setChildren(List children) { + this.children = children; + } + + @Override + public String toString() { + return "CommonRegionEntity: [regionId="+regionId+",parentId="+parentId+",regionName="+regionName+",regionType="+regionType+",regionCode="+regionCode+",largeArea="+largeArea+"]"; + } + } diff --git a/src/test/java/com/taover/repository/test/repository/CommonRegionRepository.java b/src/test/java/com/taover/repository/test/repository/CommonRegionRepository.java new file mode 100644 index 0000000..23a44a4 --- /dev/null +++ b/src/test/java/com/taover/repository/test/repository/CommonRegionRepository.java @@ -0,0 +1,17 @@ +package com.taover.repository.test.repository; + +import org.springframework.jdbc.core.JdbcTemplate; + +import com.taover.repository.CustomJdbcTemplate; + +public class CommonRegionRepository extends CustomJdbcTemplate{ + public static int TYPE_PROVINCE = 1; + public static int TYPE_CITY = 2; + public static int TYPE_DISTRICT = 3; + public static Long PROVINCE_PARENT_ID = 1L; + + public CommonRegionRepository(JdbcTemplate jdbcTemplate) throws Exception { + super(jdbcTemplate); + } +} + -- libgit2 0.21.2