上海莫尔丽信息科技有限公司 > 新闻资讯 >

使用 JdbcTemplate 动态创建表并添加数据
发布于2025-02-19 17:38 文章作者:之卉
之前写了1个 应用JDBC查问能否生活某表或者瞅图,按月动静死成表 ,然则他其实不能停止公用,应用时须要每一个人皆写本身的处置代码,为了省事应用,尔写了1个大家的处置办法,仅供参照。
为了思量年夜家名目的散成,得到JdbcTemplate尔采纳Spring建设,也为了省事年夜家曲交运转,始初化Spring的体例是写的Main办法
重要思绪是:
应用Spring摆设JdbcTemplate
经由过程1个代办署理对于象战数据库停止对于应,那个对于象除id战1个tableName属性中战数据库的字段称号皆是分歧的
经由过程1个大众办法类去得到代办署理类有那些属性,用去缔造表战新删时停止动静SQL的组装
重心处置是,先望有么有该表,不创制拔出,有的话曲交拔出
起首设置Spring,年夜家城市的:
<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.0.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.0.xsd"><!--数据源--><beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><propertyname="driverClassName"value="com.mysql.jdbc.Driver"/><propertyname="url"value="jdbc:mysql://192.168.0.69:3306/cui?useUnicode=true&characterEncoding=UTF-8"/><propertyname="username"value="root"/><propertyname="password"value="root"/><!--毗连池开动时的始初值--><propertyname="initialSize"value="2"/><!--毗连池的最年夜值--><propertyname="maxActive"value="2"/><!--最年夜闲暇值.当通过1个顶峰年光后,毗连池能够逐步将仍然用没有到的毗连逐步开释1局限,一贯加少到maxIdle为行--><propertyname="maxIdle"value="2"/><!--最小闲暇值.当闲暇的毗连数少于阀值时,毗连池便会预请求来少许毗连,以避免洪峰去时去没有及请求--><propertyname="minIdle"value="2"/><propertyname="defaultAutoCommit"value="true"/></bean><!--JDBC操纵模板--><beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate"><constructor-arg><refbean="dataSource"/></constructor-arg></bean><!--用于始初化得到Spring对于象的类--><beanid="springfactory"class="com.SpringFactory"></bean></beans>com.SpringFactory对于象是用去动静获得Spring办理对于象的类,之前专客中提到过:
packagecom;importorg.springframework.beans.BeansException;importorg.springframework.context.ApplicationContext;importorg.springframework.context.ApplicationContextAware;/***@申明得到Spring办理对于象*@authorcuisuqiang*@version1.0*@since*/publicclassSpringFactoryimplementsApplicationContextAware{privatestaticApplicationContextcontext;@SuppressWarnings("static-access")publicvoidsetApplicationContext(ApplicationContextapplicationContext)throwsBeansException{this.context=applicationContext;}publicstaticObjectgetObject(Stringid){Objectobject=null;object=context.getBean(id);returnobject;}}那个类能够凭据摆设的对于象ID去得到该对于象的援用
尔们借须要将参数中对于象停止处置,得到对于象的属性称呼战对于应的值,那里供给了1个大众办法,之前专客提到过,不过窜改了少许:
packagecom;importjava.lang.reflect.Field;importjava.lang.reflect.Method;importjava.util.HashMap;importjava.util.Map;/***@讲明对于象支配初级办法*@authorcuisuqiang*@version1.0*@since*/publicclassObjectUtil{/***前往1个对于象的属性战属性值*/@SuppressWarnings("unchecked")publicstaticMap<String,String>getProperty(ObjectentityName){Map<String,String>map=newHashMap<String,String>();try{Classc=entityName.getClass();//得到对于象属性Fieldfield[]=c.getDeclaredFields();for(Fieldf:field){Objectv=invokeMethod(entityName,f.getName(),null);map.put(f.getName(),v.toString());}}catch(Exceptione){map=null;}returnmap;}/***得到对于象属性的值*/@SuppressWarnings("unchecked")privatestaticObjectinvokeMethod(Objectowner,StringmethodName,Object[]args)throwsException{ClassownerClass=owner.getClass();methodName=methodName.substring(0,1).toUpperCase()+methodName.substring(1);Methodmethod=null;try{method=ownerClass.getMethod("get"+methodName);}catch(SecurityExceptione){}catch(NoSuchMethodExceptione){return"can'tfind'get"+methodName+"'method";}returnmethod.invoke(owner);}}传送1个对于象,便会前往该对于象的属性战属性值的Map
再去瞧1停对于象真体类,要注重那个类必定没有要战现实的类混了,由于您的交易对于象类中大概会有少许异常的字段,那个会被大众办法的类剖析而出题目的
packagecom;/***@注释须要操纵的真体*@authorcuisuqiang*@version1.0*@since那个只可是代办署理对于象,也便是道您须要战数据库共步对于属性字段,实践上尔们正在表中借动静加添了1个tableName字段*/publicclassUsers{privateStringuserName;privateStringuserPass;publicStringgetUserName(){returnuserName;}publicvoidsetUserName(StringuserName){this.userName=userName;}publicStringgetUserPass(){returnuserPass;}publicvoidsetUserPass(StringuserPass){this.userPass=userPass;}}也便是道数据会有4个字段 id,userName,userPass,tableName,个中id战tableName是无需存眷的
中心处置类尔先收代码:
packagecom;importjava.sql.Connection;importjava.sql.DatabaseMetaData;importjava.sql.ResultSet;importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.Map;importjava.util.Set;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;importorg.springframework.jdbc.core.JdbcTemplate;/***@声明停止尝试*@authorcuisuqiang*@version1.0*@since*/publicclassDbTest{privatestaticApplicationContextcontext=null;publicstaticvoidmain(String[]args){context=newClassPathXmlApplicationContext("applicationContext.xml");Usersuser=newUsers();user.setUserName("cuisuqinag@163.com");user.setUserPass("http://cuisuqiang.iteye.com/");intre=insertObject("users",user);System.out.println("---->"+re+"<----");}publicstaticintinsertObject(StringtableName,Objectobj){intre=0;try{JdbcTemplatejt=(JdbcTemplate)context.getBean("jdbcTemplate");SimpleDateFormatformat=newSimpleDateFormat("yyyy_MM");Stringtname=tableName+"_"+format.format(newDate());//即使有某表if(getAllTableName(jt,tname)){//保管数据re=saveObj(jt,tname,obj);}else{//动静创制表re=createTable(jt,tname,obj);//保管数据re=saveObj(jt,tname,obj);}}catch(Exceptione){e.printStackTrace();}returnre;}/***保管办法,注重那里传送的是本质的表的称呼*/publicstaticintsaveObj(JdbcTemplatejt,StringtableName,Objectobj){intre=0;try{Stringsql="insertinto"+tableName+"(";Map<String,String>map=ObjectUtil.getProperty(obj);Set<String>set=map.keySet();for(Stringkey:set){sql+=(key+",");}sql+="tableName)";sql+="values(";for(Stringkey:set){sql+=("'"+map.get(key)+"',");}sql+=("'"+tableName+"')");re=jt.update(sql);}catch(Exceptione){e.printStackTrace();}returnre;}/***凭据表称呼树立1弛表*@paramtableName*/publicstaticintcreateTable(JdbcTemplatejt,StringtableName,Objectobj){StringBuffersb=newStringBuffer("");sb.append("CREATETABLE`"+tableName+"`(");sb.append("`id`int(11)NOTNULLAUTO_INCREMENT,");Map<String,String>map=ObjectUtil.getProperty(obj);Set<String>set=map.keySet();for(Stringkey:set){sb.append("`"+key+"`varchar(255)DEFAULT'',");}sb.append("`tableName`varchar(255)DEFAULT'',");sb.append("PRIMARYKEY(`id`)");sb.append(")ENGINE=InnoDBDEFAULTCHARSET=utf8;");try{jt.update(sb.toString());return1;}catch(Exceptione){e.printStackTrace();}return0;}/***查问数据库能否有某表*@paramcnn*@paramtableName*@return*@throwsException*/@SuppressWarnings("unchecked")publicstaticbooleangetAllTableName(JdbcTemplatejt,StringtableName)throwsException{Connectionconn=jt.getDataSource().getConnection();ResultSettabs=null;try{DatabaseMetaDatadbMetaData=conn.getMetaData();String[]types={"TABLE"};tabs=dbMetaData.getTables(null,null,tableName,types);if(tabs.next()){returntrue;}}catch(Exceptione){e.printStackTrace();}finally{tabs.close();conn.close();}returnfalse;}}动静查抄能否有某表战动静建立表之前专客有提到,最重要的便是凭据对于象属性Map停止动静SQL组装
然则那里那个办法有许多的限定,例如树立字段的少度,新删时字段便必需有值,由于动静SQL会停止齐量字段拔出
别的,新删的字段表的称呼是为了以后节略战盘查细致干筹备的。
注重那是1个系列的作品,注重先后几篇作品。
推举您浏览更多相关于“ jdbc动静JdbcTemplate动静修表 ”的作品