diff --git a/src/main/java/com/taover/repository/CustomJdbcTemplate.java b/src/main/java/com/taover/repository/CustomJdbcTemplate.java index cc053d9..ece3f7f 100644 --- a/src/main/java/com/taover/repository/CustomJdbcTemplate.java +++ b/src/main/java/com/taover/repository/CustomJdbcTemplate.java @@ -5,6 +5,9 @@ import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.math.BigDecimal; import java.math.BigInteger; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -16,7 +19,13 @@ import javax.persistence.Column; import javax.persistence.Id; import javax.persistence.Table; +import org.springframework.dao.DataRetrievalFailureException; +import org.springframework.jdbc.core.ArgumentPreparedStatementSetter; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.PreparedStatementCreator; +import org.springframework.jdbc.core.PreparedStatementSetter; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; import com.taover.repository.mapper.CustomJdbcTemplateRowMapper; import com.taover.repository.util.UtilsSql; @@ -43,6 +52,7 @@ public class CustomJdbcTemplate { private String tableName; private Class tClassInfo; private CustomJdbcTemplateRowMapper customJdbcTemplateRowMapper; + private KeyHolder keyHolder; public CustomJdbcTemplateRowMapper getCustomJdbcTemplateRowMapper(){ return this.customJdbcTemplateRowMapper; @@ -112,6 +122,9 @@ public class CustomJdbcTemplate { //创建rowmapper this.customJdbcTemplateRowMapper = new CustomJdbcTemplateRowMapper(this.tClassInfo, this.tableToBeanField); + + //主键ID保存 + this.keyHolder = new GeneratedKeyHolder(); } /** @@ -412,7 +425,7 @@ public class CustomJdbcTemplate { /** * 添加 */ - public BigInteger addEntityForAutoincrementId(T entity) { + public Number addEntityForAutoincrementId(T entity) { StringBuffer sqlForLog = new StringBuffer("INSERT INTO "+this.getTableSql()+"("); StringBuffer sqlValueForLog = new StringBuffer(") VALUES ("); StringBuffer sqlInsertPart = new StringBuffer("INSERT INTO "+this.getTableSql()+"("); @@ -450,17 +463,26 @@ public class CustomJdbcTemplate { //UtilsLog.infoForMessage(sqlForLog.toString(), this.getClass()); //执行SQL - String exeSql = sqlInsertPart.substring(0, sqlInsertPart.length()-1)+sqlColumnPart.substring(0, sqlColumnPart.length()-1)+")"; - jdbcTemplateWrite.update(exeSql, paramList.toArray()); - Map lastInsertIdMap = jdbcTemplateWrite.queryForMap("SELECT LAST_INSERT_ID() lastInsertId"); - return (BigInteger)lastInsertIdMap.get("lastInsertId"); + String exeSql = sqlInsertPart.substring(0, sqlInsertPart.length()-1)+sqlColumnPart.substring(0, sqlColumnPart.length()-1)+")"; + jdbcTemplateWrite.update(new PreparedStatementCreator() { + @Override + public PreparedStatement createPreparedStatement(Connection con) throws SQLException { + PreparedStatement stat = con.prepareStatement(exeSql, new String[] {idTableFieldName}); + PreparedStatementSetter setter = new ArgumentPreparedStatementSetter(paramList.toArray()); + setter.setValues(stat); + return stat; + } + + }, keyHolder); + + return keyHolder.getKey(); } /** * 批量添加 * @throws Exception */ - public void addEntityList(List entityList) throws Exception { + public List addEntityList(List entityList) throws Exception { if(entityList == null || entityList.isEmpty()) { throw new Exception("entitylist is empty or null"); } @@ -489,8 +511,41 @@ public class CustomJdbcTemplate { } exeSql.setCharAt(exeSql.length()-1, ';'); - //执行SQL - this.jdbcTemplateWrite.update(exeSql.toString(), args.toArray()); + //调用更新接口 + jdbcTemplateWrite.update(new PreparedStatementCreator() { + @Override + public PreparedStatement createPreparedStatement(Connection con) throws SQLException { + PreparedStatement stat = con.prepareStatement(exeSql.toString(), new String[] {idTableFieldName}); + PreparedStatementSetter setter = new ArgumentPreparedStatementSetter(args.toArray()); + setter.setValues(stat); + return stat; + } + + }, keyHolder); + + //处理结果数据 + List> data = keyHolder.getKeyList(); + if(data.size() != entityList.size()) { + throw new Exception("param entity size not equal return generate key list size"); + } + List dataT = new ArrayList(data.size()); + for(Map item: data) { + Iterator keyIter = item.values().iterator(); + if (keyIter.hasNext()) { + Object key = keyIter.next(); + if (!(key instanceof Number)) { + throw new DataRetrievalFailureException( + "The generated key is not of a supported numeric type. " + + "Unable to cast [" + (key != null ? key.getClass().getName() : null) + + "] to [" + Number.class.getName() + "]"); + } + dataT.add((Number)key); + }else { + throw new DataRetrievalFailureException("Unable to retrieve the generated key. " + + "Check that the table has an identity column enabled."); + } + } + return dataT; } private String constructUpdateSql(T entity, List beanFieldList) { diff --git a/src/main/java/com/taover/repository/CustomJdbcTemplateBroadcast.java b/src/main/java/com/taover/repository/CustomJdbcTemplateBroadcast.java index efc5188..92d1e7e 100644 --- a/src/main/java/com/taover/repository/CustomJdbcTemplateBroadcast.java +++ b/src/main/java/com/taover/repository/CustomJdbcTemplateBroadcast.java @@ -4,7 +4,11 @@ import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -16,6 +20,12 @@ import javax.persistence.Id; import javax.persistence.Table; import org.springframework.dao.DataAccessException; +import org.springframework.dao.DataRetrievalFailureException; +import org.springframework.jdbc.core.ArgumentPreparedStatementSetter; +import org.springframework.jdbc.core.PreparedStatementCreator; +import org.springframework.jdbc.core.PreparedStatementSetter; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; import com.taover.repository.exception.MultiRowException; import com.taover.repository.exception.NoContainTenantException; @@ -44,6 +54,7 @@ public class CustomJdbcTemplateBroadcast implements private String _tableName; private Class _tClassInfo; private CustomJdbcTemplateRowMapper _customJdbcTemplateRowMapper; + private KeyHolder _keyHolder; public CustomJdbcTemplateRowMapper getCustomJdbcTemplateRowMapper(){ return this._customJdbcTemplateRowMapper; @@ -107,6 +118,9 @@ public class CustomJdbcTemplateBroadcast implements //创建rowmapper this._customJdbcTemplateRowMapper = new CustomJdbcTemplateRowMapper(this._tClassInfo, this._tableToBeanField); + + //主键ID保存 + this._keyHolder = new GeneratedKeyHolder(); } /** @@ -354,7 +368,7 @@ public class CustomJdbcTemplateBroadcast implements } @Override - public void addEntity(T entity) { + public Number addEntity(T entity) { StringBuffer sqlInsertPart = new StringBuffer("INSERT INTO "+this.getTableSql()+"("); StringBuffer sqlColumnPart = new StringBuffer(") VALUES ("); List paramList = new ArrayList(); @@ -383,13 +397,24 @@ public class CustomJdbcTemplateBroadcast implements //执行SQL String exeSql = sqlInsertPart.substring(0, sqlInsertPart.length()-1)+sqlColumnPart.substring(0, sqlColumnPart.length()-1)+")"; - _jdbcTemplateBroadcast.update(exeSql, new String[] {this._tableName}, paramList.toArray()); + _jdbcTemplateBroadcast.update(new PreparedStatementCreator() { + @Override + public PreparedStatement createPreparedStatement(Connection con) throws SQLException { + PreparedStatement stat = con.prepareStatement(exeSql, new String[] {_idTableFieldName}); + PreparedStatementSetter setter = new ArgumentPreparedStatementSetter(paramList.toArray()); + setter.setValues(stat); + return stat; + } + + }, _keyHolder, new String[] {this._tableName}); + + return _keyHolder.getKey(); } @Override - public void addEntityList(List entityList) { + public List addEntityList(List entityList) throws Exception { if(entityList == null || entityList.isEmpty()) { - return; + return Collections.EMPTY_LIST; } //构造SQL语句及Entity Field列表 List beanFieldList = new ArrayList(this._beanToTableField.size()); @@ -421,8 +446,41 @@ public class CustomJdbcTemplateBroadcast implements } exeSql.setCharAt(exeSql.length()-1, ';'); - //执行SQL - this._jdbcTemplateBroadcast.update(exeSql.toString(), new String[] {this._tableName}, args.toArray()); + //调用更新接口 + _jdbcTemplateBroadcast.update(new PreparedStatementCreator() { + @Override + public PreparedStatement createPreparedStatement(Connection con) throws SQLException { + PreparedStatement stat = con.prepareStatement(exeSql.toString(), new String[] {_idTableFieldName}); + PreparedStatementSetter setter = new ArgumentPreparedStatementSetter(args.toArray()); + setter.setValues(stat); + return stat; + } + + }, _keyHolder, new String[] {this._tableName}); + + //处理结果数据 + List> data = _keyHolder.getKeyList(); + if(data.size() != entityList.size()) { + throw new Exception("param entity size not equal return generate key list size"); + } + List dataT = new ArrayList(data.size()); + for(Map item: data) { + Iterator keyIter = item.values().iterator(); + if (keyIter.hasNext()) { + Object key = keyIter.next(); + if (!(key instanceof Number)) { + throw new DataRetrievalFailureException( + "The generated key is not of a supported numeric type. " + + "Unable to cast [" + (key != null ? key.getClass().getName() : null) + + "] to [" + Number.class.getName() + "]"); + } + dataT.add((Number)key); + }else { + throw new DataRetrievalFailureException("Unable to retrieve the generated key. " + + "Check that the table has an identity column enabled."); + } + } + return dataT; } @Override diff --git a/src/main/java/com/taover/repository/CustomJdbcTemplateBroadcastInterface.java b/src/main/java/com/taover/repository/CustomJdbcTemplateBroadcastInterface.java index 82b4a2a..85bfc6a 100644 --- a/src/main/java/com/taover/repository/CustomJdbcTemplateBroadcastInterface.java +++ b/src/main/java/com/taover/repository/CustomJdbcTemplateBroadcastInterface.java @@ -79,13 +79,13 @@ public interface CustomJdbcTemplateBroadcastInterface entityList); + public List addEntityList(List entityList) throws Exception; /** * 按ID删除 diff --git a/src/main/java/com/taover/repository/CustomJdbcTemplateWrapperTenant.java b/src/main/java/com/taover/repository/CustomJdbcTemplateWrapperTenant.java index 0fb3be1..4c89dec 100644 --- a/src/main/java/com/taover/repository/CustomJdbcTemplateWrapperTenant.java +++ b/src/main/java/com/taover/repository/CustomJdbcTemplateWrapperTenant.java @@ -4,7 +4,11 @@ import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -16,6 +20,12 @@ import javax.persistence.Id; import javax.persistence.Table; import org.springframework.dao.DataAccessException; +import org.springframework.dao.DataRetrievalFailureException; +import org.springframework.jdbc.core.ArgumentPreparedStatementSetter; +import org.springframework.jdbc.core.PreparedStatementCreator; +import org.springframework.jdbc.core.PreparedStatementSetter; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; import com.taover.repository.exception.MultiRowException; import com.taover.repository.exception.NoContainTenantException; @@ -44,6 +54,7 @@ public class CustomJdbcTemplateWrapperTenant impleme private String _tableName; private Class _tClassInfo; private CustomJdbcTemplateRowMapper _customJdbcTemplateRowMapper; + private KeyHolder _keyHolder; public CustomJdbcTemplateRowMapper getCustomJdbcTemplateRowMapper(){ return this._customJdbcTemplateRowMapper; @@ -107,6 +118,9 @@ public class CustomJdbcTemplateWrapperTenant impleme //创建rowmapper this._customJdbcTemplateRowMapper = new CustomJdbcTemplateRowMapper(this._tClassInfo, this._tableToBeanField); + + //主键ID保存 + this._keyHolder = new GeneratedKeyHolder(); } /** @@ -356,7 +370,7 @@ public class CustomJdbcTemplateWrapperTenant impleme } @Override - public void addEntity(T entity, Long tenantId) { + public Number addEntity(T entity, Long tenantId) { StringBuffer sqlInsertPart = new StringBuffer("INSERT INTO "+this.getTableSql()+"("); StringBuffer sqlColumnPart = new StringBuffer(") VALUES ("); List paramList = new ArrayList(); @@ -385,13 +399,24 @@ public class CustomJdbcTemplateWrapperTenant impleme //执行SQL String exeSql = sqlInsertPart.substring(0, sqlInsertPart.length()-1)+sqlColumnPart.substring(0, sqlColumnPart.length()-1)+")"; - _jdbcTemplateWrapperTenant.update(exeSql, tenantId, paramList.toArray()); + _jdbcTemplateWrapperTenant.update(new PreparedStatementCreator() { + @Override + public PreparedStatement createPreparedStatement(Connection con) throws SQLException { + PreparedStatement stat = con.prepareStatement(exeSql, new String[] {_idTableFieldName}); + PreparedStatementSetter setter = new ArgumentPreparedStatementSetter(paramList.toArray()); + setter.setValues(stat); + return stat; + } + + }, _keyHolder, tenantId); + + return _keyHolder.getKey(); } @Override - public void addEntityList(List entityList, Long tenantId) { + public List addEntityList(List entityList, Long tenantId) throws Exception { if(entityList == null || entityList.isEmpty()) { - return; + return Collections.EMPTY_LIST; } //构造SQL语句及Entity Field列表 List beanFieldList = new ArrayList(this._beanToTableField.size()); @@ -423,8 +448,41 @@ public class CustomJdbcTemplateWrapperTenant impleme } exeSql.setCharAt(exeSql.length()-1, ';'); - //执行SQL - this._jdbcTemplateWrapperTenant.update(exeSql.toString(), tenantId, args.toArray()); + //调用更新接口 + _jdbcTemplateWrapperTenant.update(new PreparedStatementCreator() { + @Override + public PreparedStatement createPreparedStatement(Connection con) throws SQLException { + PreparedStatement stat = con.prepareStatement(exeSql.toString(), new String[] {_idTableFieldName}); + PreparedStatementSetter setter = new ArgumentPreparedStatementSetter(args.toArray()); + setter.setValues(stat); + return stat; + } + + }, _keyHolder, tenantId); + + //处理结果数据 + List> data = _keyHolder.getKeyList(); + if(data.size() != entityList.size()) { + throw new Exception("param entity size not equal return generate key list size"); + } + List dataT = new ArrayList(data.size()); + for(Map item: data) { + Iterator keyIter = item.values().iterator(); + if (keyIter.hasNext()) { + Object key = keyIter.next(); + if (!(key instanceof Number)) { + throw new DataRetrievalFailureException( + "The generated key is not of a supported numeric type. " + + "Unable to cast [" + (key != null ? key.getClass().getName() : null) + + "] to [" + Number.class.getName() + "]"); + } + dataT.add((Number)key); + }else { + throw new DataRetrievalFailureException("Unable to retrieve the generated key. " + + "Check that the table has an identity column enabled."); + } + } + return dataT; } @Override diff --git a/src/main/java/com/taover/repository/CustomJdbcTemplateWrapperTenantInterface.java b/src/main/java/com/taover/repository/CustomJdbcTemplateWrapperTenantInterface.java index 62b747b..28f8f60 100644 --- a/src/main/java/com/taover/repository/CustomJdbcTemplateWrapperTenantInterface.java +++ b/src/main/java/com/taover/repository/CustomJdbcTemplateWrapperTenantInterface.java @@ -79,13 +79,13 @@ public interface CustomJdbcTemplateWrapperTenantInterface entityList, Long tenantId); + public List addEntityList(List entityList, Long tenantId) throws Exception; /** * 按ID删除 diff --git a/src/test/java/com/taover/repository/test/TestAutoconfigure.java b/src/test/java/com/taover/repository/test/TestAutoconfigure.java index f39d24f..26b1199 100644 --- a/src/test/java/com/taover/repository/test/TestAutoconfigure.java +++ b/src/test/java/com/taover/repository/test/TestAutoconfigure.java @@ -1,11 +1,20 @@ package com.taover.repository.test; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; import java.util.List; import java.util.Map; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.jdbc.core.ArgumentPreparedStatementSetter; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.PreparedStatementCreator; +import org.springframework.jdbc.core.PreparedStatementSetter; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; import org.springframework.scheduling.annotation.EnableScheduling; import com.taover.repository.jdbctemplate.JdbcTemplateBroadcast; @@ -16,12 +25,14 @@ import com.taover.repository.jdbctemplate.JdbcTemplateWrapperTenant; public class TestAutoconfigure { private static JdbcTemplateBroadcast jdbcTemplateBroadcast; private static JdbcTemplateWrapperTenant jdbcTemplateWrapperTenant; + private static JdbcTemplate jdbcTemplate; public static void main(String args[]) { ConfigurableApplicationContext context = SpringApplication.run(TestAutoconfigure.class, args); jdbcTemplateBroadcast = context.getBean(JdbcTemplateBroadcast.class); jdbcTemplateWrapperTenant = context.getBean(JdbcTemplateWrapperTenant.class); + jdbcTemplate = context.getBean(JdbcTemplate.class); // testBroadCast(); //testSelectSubQuery(); @@ -43,9 +54,73 @@ public class TestAutoconfigure { //testDeliveryGoodsExcel(); //testExcelSelectForSale(); //testChannelPrintSelect(); - testWarePaymentExport(); + //testWarePaymentExport(); + //testChannelDeliveryOrderQuery(); + +// testKeyHolder(); +// testKeyHolderWithoutId(); + testKeyHolderWithMultiInsert(); } + private static void testKeyHolderWithMultiInsert() { + KeyHolder keyHolder = new GeneratedKeyHolder(); + String exeSql = "insert into demo(`name`) values(?),(?),(?),(?),(?),(?);"; + jdbcTemplate.update(new PreparedStatementCreator() { + @Override + public PreparedStatement createPreparedStatement(Connection con) throws SQLException { + PreparedStatement stat = con.prepareStatement(exeSql.toString(), new String[] {"id"}); + PreparedStatementSetter setter = new ArgumentPreparedStatementSetter(new String[] {"Jack", "Lucy", "Lily", "Mary", "Carlin", "Michael"}); + setter.setValues(stat); + return stat; + } + + }, keyHolder); + System.out.println(keyHolder.getKey()); + } + + private static void testKeyHolderWithoutId() { + String sql = "insert into demo(`id`,`name`) values(100,'zhangfei');"; + jdbcTemplate.update( + new PreparedStatementCreator() { + @Override + public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { + PreparedStatement psst = connection.prepareStatement(sql); + return psst; + } + }); + } + + private static void testKeyHolder() { + KeyHolder keyHolder = new GeneratedKeyHolder(); + String sql = "insert into demo(`name`) values(?);"; + jdbcTemplate.update( + new PreparedStatementCreator() { + @Override + public PreparedStatement createPreparedStatement(Connection connection) throws SQLException { + PreparedStatement psst = connection.prepareStatement(sql, new String[] { "id" }); + psst.setString(1, "wangbin"); + return psst; + } + } + , keyHolder); + System.out.println(keyHolder.getKey().longValue()); + } + + private static void testChannelDeliveryOrderQuery() { + String sql = "SELECT * FROM ( (SELECT wxorder_order.id FROM wxorder_order wxorder_order " + + "WHERE wxorder_order.tenant_id = 16 AND wxorder_order.control_status = 3" + +" AND wxorder_order.consignee = '13621051230' AND wxorder_order.channel_id = 20)" + +" UNION ALL " + + "(SELECT wxorder_order.id FROM wxorder_order wxorder_order WHERE 1 = 1 AND wxorder_order.tenant_id = 16" + +" AND wxorder_order.control_status = 3" + +" AND wxorder_order.mobile = '13621051230' AND wxorder_order.channel_id = 20)" + + " UNION ALL (SELECT wxorder_order.id FROM wxorder_order wxorder_order WHERE wxorder_order.tenant_id = 16" + +" AND wxorder_order.control_status = 3" + +" AND wxorder_order.express_number = '13621051230' AND wxorder_order.channel_id = 20" + +")) aa LIMIT 1,10"; + System.out.println(jdbcTemplateWrapperTenant.queryForList(sql, 16L)); + } + private static void testWarePaymentExport() { String sql = "SELECT wc.manager_nickname,cp.id as paymentId, wo.order_sn,wo.`upload_sn`,wo.consignee,wo.mobile," + " wgbs.sku_unit_num as skuUnitNum, wgbs.unit, " -- libgit2 0.21.2