在线报名
报名热线:400-0919-097
在线客服
服务项目
当前位置:学码思 > 服务项目 >
使用 JdbcTemplate 动态创建表并添加数据
编辑:元旋   浏览时间:2025-02-14 14:07

之前写了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&amp;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动静修表 ”的作品

地址:南京市科巷10号楼(邮政储蓄银行西北侧80米)  电话:400-080-3312

Copyright © 2024-2026  学码思推广专用站   http://www.xuems.net  .All Rights Reserved   网站地图  苏ICP备16033487号-3

分享到: