|
下面 ( alt+shift+T ) 中都可以找到 1.改名 : ( alt+shift+R ) 2.类移动:( alt+shift+V ) 3.方法上移父类,下移子类 (alt+shift+T) + U/D 4.方法接口化 (alt+shift+T) +T 5.部分代码提升为方法 alt+shift+M 6.局部变量提升为类变量 alt+shift+F
.............
***************************************************************
Ctrl+M: 工作区最大化/最小化 Alt+/: 智能提示 F3: 察看声明 Crtl+1: 修正错误 Shift+Alt+T: 重构 Shift+Alt+M: 提取函数 Shift+Alt+R: 重命名 Shift+Alt+C: 更改函数标记 Ctrl+Shitf+F: 格式化代码
在WEB开发中 测试 在 C/S 而 实际运行 B/S 造成配置文件 在硬编码时总是改 。 但看 hibernate 的配置文件 确可以很好工作 ,没办法读源码 在框架中 发现 ConfigHelper类起到了作用 。 结合自己开发需求,写出了自己的 带查询文件功能类 扩展的主要部分在 findFile方法 这用了一下 简单的数据结构有兴趣的可以看看 测试: 文件skynet.xml
<?xml version="1.0" encoding="UTF-8"?> <xml-body> <man id='1'> <name>刘凯毅</name> <avg>24</avg> </man> <man id='2'> <name>heha</name> <avg>25</avg> </man> </xml-body>
测试类
package test.config;
import org.apache.commons.jxpath.JXPathContext; import org.apache.commons.jxpath.XMLDocumentContainer;
import junit.framework.TestCase;
public class SkynetConfigTest extends TestCase {
protected void setUp() throws Exception { super.setUp(); } public void testConfigFile(){ System.out.println( //find file in System user.dir -> skynet.xml SkynetConfig.getResourceAsFile(System.getProperty("user.dir") , "skynet.xml").getPath() ); System.out.println( //find file in System java.class.path -> skynet.xml SkynetConfig.getResourceAsFile(System.getProperty("java.class.path") , "skynet.xml").getPath() ); } public void testConfigURL(){ JXPathContext jx = JXPathContext.newContext(new XMLDocumentContainer( // in System user.dir,java.class.path find url:skynet SkynetConfig.getResourceAsURL("skynet.xml") )); System.out.println( jx.getValue("//man[avg='24']/@id") ); System.out.println( jx.getValue("//man[avg='24']/name") ); } public void testConfigStream(){ System.out.println( SkynetConfig.getResourceAsStream("skynet.xml") ); } }
结果: E:\src3\rlzy15\lmisWeb\WEB-INF\classes\test\config\skynet.xml E:\src3\rlzy15\lmisWeb\WEB-INF\classes\test\config\skynet.xml 1 刘凯毅 java.io.FileInputStream@1551d7f
SkynetConfig 类package test.config;
import java.io.File; import java.io.FileInputStream; import java.io.InputStream;
import java.net.URL;
import org.apache.commons.jxpath.JXPathContext; import org.apache.commons.jxpath.XMLDocumentContainer; import org.hibernate.util.ConfigHelper;
public class SkynetConfig { public static final URL getResourceAsURL(final String path) { URL url = null;
// First, try to locate this resource through the current // context classloader. ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); if (contextClassLoader!=null) { url = contextClassLoader.getResource(path); } if (url != null) return url;
// Next, try to locate this resource through this class's classloader url = ConfigHelper.class.getClassLoader().getResource(path); if (url != null) return url; // Next, try to locate this resource through the system classloader url = ClassLoader.getSystemClassLoader().getResource(path); if(url !=null) return url; File ff = getResourceAsFile(System.getProperty("user.dir") ,path); if(ff==null) ff = getResourceAsFile(System.getProperty("java.class.path") , path); try { url = new URL("file:/"+ff.getPath()); } catch (Exception e) {e.printStackTrace();} return url; } public static InputStream getResourceAsStream(final String resource) { String stripped = resource.startsWith("/") ? resource.substring(1) : resource; InputStream stream = null; ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); if (classLoader!=null) { stream = classLoader.getResourceAsStream( stripped ); } if ( stream == null ) { SkynetConfig.class.getResourceAsStream( resource ); } if ( stream == null ) { stream = SkynetConfig.class.getClassLoader().getResourceAsStream( stripped ); } if ( stream == null ) { File ff = getResourceAsFile(System.getProperty("user.dir") ,resource); if(ff==null) ff = getResourceAsFile(System.getProperty("java.class.path") , resource); try { stream = new FileInputStream(ff); if(stream==null) throw new Exception( resource + " not found" ); } catch (Exception e) {e.printStackTrace();} } return stream; } public static File getResourceAsFile(String str,String findff){ String[] sfd = str.split(";"); for(int i=0;i<sfd.length;i++){ File file = new File(sfd[i]); if( file.isDirectory()){ File[] cfs = file.listFiles(); for(int j=0;j<cfs.length;j++){ File ff = findFile(cfs[j],findff); if(ff==null)continue; else return ff; } } } return null ; } private static File findFile(File file,String findff){ if(file.isFile() && file.exists() && isFileEqu(file,findff) ) return file ; else if( file.isDirectory() ){ File[] cfs = file.listFiles(); for(int i=0;i<cfs.length;i++){ File ff = findFile(cfs[i],findff); if(ff==null)continue; if( isFileEqu(ff,findff) ){ return ff; } } } return null ; } private static boolean isFileEqu(File ff,String findff){ String path = ff.getPath().trim() ; String findfft = findff.trim() ; if( path.lastIndexOf( findfft )>0)return true; return false; }
}
为我准备学习和理解spring 特留下代码笔记: 参考:http://dev.csdn.net/author/labile/e70c97cb7f504d35b7b5350e7810cc5a.html代码感想: 没个方法都或多或少需要环境参数(如: jdbc的conn ,hbn的session...等等 ),方法结束后又要关闭。 何不用proxy代理并用配置文件的方法来 关,开session 等 如:以下是我的想法并不是实际可用 配置: <class name="HelloWorldImpl"> <function name="set*" />
<function name="getName"> <proxyBegin artt="name" value="liukaiyi"/> //使用Proxy来赋值 name那在实现代码中就可以不用去关注象 session 等属性的开关了 //proxy中配置下 , 在实现类中 就使用 就可以了 <proxyBegin ref="HelloWorldHandler.doBefter" args="null"/> <proxyEnd ref="HelloWorldHandler.doAfter" args="null"/> </function>
<function = name="sayHelloWorld"> <proxyEnd ref="HelloWorldHandler.doAfter" args="null"/> </function> </class>
代码: HelloWorld hw = (HelloWorld)Factory.getBean("HelloWorldImpl"); hw.getName();
结果是: before method invoke! 刘凯毅 after method invoke!
在此 我只是想象,spring 还没有看,但我认为spring 这个著名的框架应该在这方面有很好的实现。
实际代码:希望spring可以向我上面的方法配置好用来取代下面的实际代码 ^_^
package test.proxy;
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;
import junit.framework.TestCase;
public class TestProxy extends TestCase { protected void setUp() throws Exception { super.setUp(); } public void testProxy(){ HelloWorld hw = new HelloWorldImpl(); InvocationHandler handler = new HelloWorldHandler(hw); HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance( hw.getClass().getClassLoader(), hw.getClass().getInterfaces(), handler); proxy.sayHelloWorld(); System.out.println(); proxy.setName("liukaiyi"); proxy.getName(); } }
interface HelloWorld { void sayHelloWorld() ; void getName(); void setName(String name); }
class HelloWorldImpl implements HelloWorld { private String name = ""; public void setName(String name) { this.name = name; }
public void sayHelloWorld() { System.out.println("Hello World!"); }
public void getName() { System.out.println(this.name); } }
class HelloWorldHandler implements InvocationHandler { //要代理的原始对象 private Object objOriginal; /** * 构造函数。 * @param obj 要代理的原始对象。 */ public HelloWorldHandler(Object obj) { this.objOriginal = obj ; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null ; String meName = method.getName(); if(meName.indexOf("set")>-1 ){ return method.invoke(this.objOriginal ,args); } if( meName.equals("getName") ){ //方法调用之前 doBefore(); //仿佛是AOP的影子,呵呵 } //调用原始对象的方法 result = method.invoke(this.objOriginal ,args); //方法调用之后 doAfter(); return result ; } private void doBefore() { System.out.println("before method invoke!"); } private void doAfter() { System.out.println("after method invoke!"); } }
结果: Hello World! after method invoke!
before method invoke! 刘凯毅 after method invoke!
在 D2D 论坛中见 一文标题 《在java中利用动态编译实现eval》 http://dev2dev.bea.com.cn/bbsdoc/20060724298.html 虽然给出代码不能运行 但标题的意思已经达到 在此 我也不多说了 在此完善下原作者的代码 并使可运行来方便大家理解
企图说明: 代码的可用性是没有的,但代码向我们打开了一个使java动态编译的一向大门 有想法的程序员们。我们在此得到了什么?
代码说明: 1.为了使用例子的方便 testJavac.java 是 Bean ( name , avg ) 也是 逻辑类 ( eval(string) ) 2.运行请在 classpath 加入 java\lib\tools.jar jar 包 ( com.sun.tools.javac.Main ) 3.还是方便运行本例对 自己在什么 path 并不在意 类中使用了 System.getProperty("user.dir")
import java.io.File; import java.io.FileWriter; import java.io.PrintWriter; import java.lang.reflect.Method;
import com.sun.tools.javac.Main;
public class testJavac{ public String getName(){ return "刘凯毅"; } public int getAvg(){ return 24; } public Object eval(String str)throws Exception{ //生成java文件 String s = "class Temp{"; s += "private testJavac tj = new testJavac();"; s += "public String rt(){"; s += " return \"\"+tj."+str+"();" ; s += "}"; s +="}"; File f = new File(System.getProperty("user.dir")+"\\Temp.java"); PrintWriter pw = new PrintWriter(new FileWriter(f)); pw.println(s); pw.close(); //动态编译 Main javac = new Main(); String[] cpargs = new String[] {"-d", System.getProperty("user.dir") ,"Temp.java"}; int status = javac.compile(cpargs); if(status!=0){ System.out.println("没有成功编译源文件!"); return null; } //调用Temp的rt方法返回结果: ClassLoader mc = this.getClass().getClassLoader(); Class clasz = mc.loadClass("Temp");
Method rt = clasz.getMethod("rt", new Class[]{}); return rt.invoke(clasz.newInstance(), new Object[] { }); //如果方法没有返回就直接调用 } public static void main(String[]args)throws Exception{ testJavac jj = new testJavac(); System.out.println( jj.eval(args[0]) ); }
} 运行结果 D:\javac>javac -classpath D:\java\lib\tools.jar;. testJavac.java
D:\javac>java -classpath D:\java\lib\tools.jar;. testJavac getName 刘凯毅 //此时在当前目录下你可以看到 多了一个 Temp.java 和 Temp.class 文件 //再使用 CalssLoader.loadClass方法动态加载到运行环境中来 //创建 动态 加载 动态 (java 动起来了) D:\javac>java -classpath D:\java\lib\tools.jar;. testJavac getAvg 24
参照:
http://json-lib.sourceforge.net/usage.html先 json <-> object package test.json;
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;
import org.apache.commons.beanutils.PropertyUtils;
import com.jjm.viewBean.reportTableBean;
import net.sf.json.JSONArray; import net.sf.json.JSONFunction; import net.sf.json.JSONObject;
import junit.framework.TestCase;
public class JsonTest extends TestCase {
// object to json ************************************************************ public void testList(){ boolean[] boolArray = new boolean[]{true,false,true}; JSONArray jsonArray1 = JSONArray.fromObject( boolArray ); System.out.println( jsonArray1 ); // prints [true,false,true] List list = new ArrayList(); list.add( "first" ); list.add( "second" ); JSONArray jsonArray2 = JSONArray.fromObject( list ); System.out.println( jsonArray2 ); // prints ["first","second"]
JSONArray jsonArray3 = JSONArray.fromObject( "['json','is','easy']" ); System.out.println( jsonArray3 ); // prints ["json","is","easy"] } public void testMap(){ Map map = new HashMap(); map.put( "name", "json" ); map.put( "bool", Boolean.TRUE ); map.put( "int", new Integer(1) ); map.put( "arr", new String[]{"a","b"} ); map.put( "func", "function(i){ return this.arr[i]; }" ); JSONObject json = JSONObject.fromObject( map ); System.out.println( json ); //{"func":function(i){ return this.arr[i]; },"arr":["a","b"],"int":1,"name":"json","bool":true} }
/** * Bean.java private String name = "json"; private int pojoId = 1; private char[] options = new char[]{'a','f'}; private String func1 = "function(i){ return this.options[i]; }"; private JSONFunction func2 = new JSONFunction(new String[]{"i"},"return this.options[i];"); */ public void testBean(){ JSONObject jsonObject = JSONObject.fromObject( new JsonBean() ); System.out.println( jsonObject ); //{"func1":function(i){ return this.options[i]; },"pojoId":1,"name":"json","options":["a","f"],"func2":function(i){ return this.options[i]; }} } /** * private int row ; private int col ; private String value ; * */ public void testBeans(){ List list = new ArrayList(); JsonBean2 jb1 = new JsonBean2(); jb1.setCol(1); jb1.setRow(1); jb1.setValue("xx"); JsonBean2 jb2 = new JsonBean2(); jb2.setCol(2); jb2.setRow(2); jb2.setValue(""); list.add(jb1); list.add(jb2); JSONArray ja = JSONArray.fromObject(list); System.out.println( ja.toString() ); //[{"value":"xx","row":1,"col":1},{"value":"","row":2,"col":2}] }
// json to object ************************************************************ public void testJsonBeanUtil()throws Exception{ String json = "{name=\"json\",bool:true,int:1,double:2.2,func:function(a){ return a; },array:[1,2]}"; JSONObject jsonObject = JSONObject.fromString(json); Object bean = JSONObject.toBean( jsonObject ); assertEquals( jsonObject.get( "name" ), PropertyUtils.getProperty( bean, "name" ) ); assertEquals( jsonObject.get( "bool" ), PropertyUtils.getProperty( bean, "bool" ) ); assertEquals( jsonObject.get( "int" ), PropertyUtils.getProperty( bean, "int" ) ); assertEquals( jsonObject.get( "double" ), PropertyUtils.getProperty( bean, "double" ) ); assertEquals( jsonObject.get( "func" ), PropertyUtils.getProperty( bean, "func" ) ); List expected = JSONArray.toList( jsonObject.getJSONArray( "array" ) ); assertEquals( expected, (List) PropertyUtils.getProperty( bean, "array" ) ); } public void testJsonBean(){ String json = "{\"value\":\"xx\",\"row\":1,\"col\":1}"; JSONObject jsonObject = JSONObject.fromString(json); JsonBean2 bean = (JsonBean2) JSONObject.toBean( jsonObject, JsonBean2.class ); assertEquals( jsonObject.get( "col" ),new Integer( bean.getCol()) ); assertEquals( jsonObject.get( "row" ), new Integer( bean.getRow() ) ); assertEquals( jsonObject.get( "value" ), bean.getValue() ); } }
json <-> xmlJSON to XML- JSONObject json = new JSONObject( true );
- String xml = XMLSerializer.write( json );
| - <o class="object" null="true">
-
| - JSONObject json = JSONObject.fromObject("{\"name\":\"json\",\"bool\":true,\"int\":1}");
- String xml = XMLSerializer.write( json );
| - <o class="object">
- <name type="string">json</name>
- <bool type="boolean">true</bool>
- <int type="number">1</int>
- </o>
| - JSONArray json = JSONArray.fromObject("[1,2,3]");
- String xml = XMLSerializer.write( json );
| - <a class="array"<
- <e type="number">1</e>
- <e type="number">2</e>
- <e type="number">3</e>
- </a>
| xml to json - <a class="array">
- <e type="function" params="i,j">
- return matrix[i][j];
- </e>
- </a>
- JSONArray json = (JSONArray) XMLSerializer.read( xml );
- System.out.println( json );
-
约定:
bean.getXX.. 称为 gbean bean.setXX.. 称为 sbean 目的: gbean 多属性 付值给 sbean 多属性(并值有一定修改后)等复杂赋 值 用 一句 *逻辑string* 就可以了 多属性不同类型 赋值了说明:1.sbean : testData 类有4个属性 personid ; workno ; hname ; dob ; 2.gbean 类我这用的是数据库动态类 ,有兴趣的可以看看我的另一遍blog 动态面向对象数据库操作 数据库 表 z_jcyy_basepersonnel 多属性 但 personid,workno,hname 不可以为空 3.这里 get set 赋值 使用的工具 LGUtil测试:
package myGGUtil.LGBeanUtil.test;
import java.util.Date; import java.util.Iterator; import java.util.List; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.jxpath.JXPathContext; import myGGUtil.DBUtil.DyanDBUtils.DyanDBUtils; import myGGUtil.LGBeanUtil.LGUtil; import myGGUtil.LGBeanUtil.SpecialAttFun; import junit.framework.TestCase;
public class test extends TestCase {
//只有一条数据的 一对一 public void testONE_TO_ONE()throws Exception{
//得到修改的 数据'0301003300' dob 时间为当前 一条值 DyanDBUtils dyd = new DyanDBUtils(); List list = dyd.select("select t.* from z_jcyy_basepersonnel t where t.personid = '0301003300'"); BeanUtils.setProperty( list.get(0) ,"dob",new Date()); dyd.updateOrInsert(list.get(0)); List listD = dyd.select("select t.* from z_jcyy_basepersonnel t where t.personid = '0301003300'");
//这使用 LGutil 目的是 包, 把 数据'0301003300'的 personid,workno,hname,dob 值通过一定逻辑赋值 LGUtil lb = new LGUtil(); lb.setDataList(listD); //数据加入 : 就是 gbean lb.setMapping(LGUtil.ONE_TO_ONE); //定义是一对一 get -> set lb.setVbClass(testData.class); // sbean 类 lb.setAttrLg(Date.class," ./${.+} ","action:date($this,'yy-MM-dd')"); //把gbean数据为Date类型的付值给 sbean 的string类型 并以 'yy-MM-dd'时间字符格式 lb.setAttrLg(String.class,"./${.+}"); //String 普通付值 lb.setFun(new SpecialAttFun(){ public void action(JXPathContext temD, JXPathContext temV, int step, JXPathContext all) { temV.setValue("hname","heha" ); //在特殊值 hname 改为 heha (呵哈 我的口号哦^_^) } }); testData oo = (testData)lb.getVBean().get(0) ; //sbean 的值输出 : System.out.println(oo.getPersonid()+":"+oo.getHname()+":"+oo.getWorkno()+":"+ oo.getDob() ); //测试结束 数据库 改回去 dob 为空 BeanUtils.setProperty( list.get(0) ,"dob",null); dyd.updateOrInsert(list.get(0)); } //多条数据的多对一 :就是 gbean多 -> sbean public void testMANY_TO_ONE()throws Exception{ DyanDBUtils dyd = new DyanDBUtils(); List list = dyd.select("select t.* from z_jcyy_basepersonnel t where t.personid like '03010033%' "); // 得到多条数据
LGUtil lb = new LGUtil(); lb.setDataList(list); lb.setMapping(LGUtil.MANY_TO_ONE); lb.setVbClass(testData.class); lb.setAttrLg("sum(./${workno})"); //把属性 workno 的全部值 向加 并 付值给 sbean.workno testData oo = (testData)lb.getVBean().get(0) ; System.out.println(oo.getWorkno()); //输出 workno }
//多数据的一对一 gbean多 -> sbean多 public void testOne_to_one()throws Exception{ DyanDBUtils dyd = new DyanDBUtils(); List listd = dyd.select("select t.* from z_jcyy_basepersonnel t where t.personid = '0301003300'"); BeanUtils.setProperty( listd.get(0) ,"dob",new Date()); dyd.updateOrInsert(listd.get(0)); List list = dyd.select("select t.* from z_jcyy_basepersonnel t where t.personid = '0301003300'"); //这 030100330 数据改值 下面 展现需要 (有不同哦) LGUtil lb = new LGUtil(); lb.setDataList(dyd.select("select t.dob, t.* from z_jcyy_basepersonnel t where t.personid like '03010033%'")) ; lb.setMapping(LGUtil.ONE_TO_ONE); lb.setVbClass(testData.class); lb.setAttrLg("${.+}");//全付值 lb.setAttrLg(Date.class," ./${.+} ","action:date($this,'yy-MM-dd')"); //date 给格式
for(Iterator it=lb.getVBean().iterator();it.hasNext(); ){ testData oo = (testData)it.next(); System.out.println(oo.getPersonid()+":"+oo.getHname()+":"+oo.getWorkno()+":"+ oo.getDob() ); } BeanUtils.setProperty( list.get(0) ,"dob",null); dyd.updateOrInsert(list.get(0)); } }
结果:
//方法 testONE_TO_ONE(): dob为'yy-MM-dd' 0301003300:heha:3300:07-09-29
//方法testMANY_TO_ONE() workno 全加 就是方法3 的workno全加 (大家可以看看哦) 174005.0 //方法testOne_to_one() 全付值 (简单展示 也可以对没个属性修改付 如:dob 方法一样) 0301003300:张金栋:3300:07-09-29 0301003301:谷嘉奇:3301:78-09-21 0301003302:闫国春:3302:78-12-24 0301003304:解国强:3304:77-08-17 0301003305:任志勇:3305:71-10-20 0301003306:张宁:3306:74-10-13 0301003307:闫立文:3307:70-07-05 0301003308:邓志山:3308:74-02-28 0301003309:刘承谦:3309:67-12-30 0301003310:郭爱军:3310:75-11-21 0301003312:杨涛:3312:73-08-01 0301003313:乔迎松:3313:74-05-27 0301003314:徐志斌:3314:69-03-14 0301003323:黄向东:3323:72-07-30 0301003324:高国良:3324:73-11-17 0301003326:高杰:3326:74-02-10 0301003329:葛燕京:3329:74-10-29 0301003331:赵震:3331:75-01-07 0301003333:郝君平:3333:74-03-12 0301003339:孙雪峰:3339:73-03-28 0301003340:刘绍明:3340:74-12-23 0301003341:郭金江:3341:73-06-07 0301003342:赵福军:3342:74-01-17 0301003343:刘勇:3343:74-07-04 0301003349:郑岩:3349:73-11-29 0301003350:周勇:3350:75-06-03 0301003352:许东波:3352:73-11-30 0301003353:于华涛:3353:71-11-08 0301003354:陈建宏:3354:71-11-21 0301003355:王福禄:3355:70-11-16 0301003357:曹小军:3357:75-09-05 0301003358:耿龙:3358:76-04-09 0301003359:麻然松:3359:74-04-05 0301003361:侯亮:3361:77-11-01 0301003362:翁宝重:3362:73-10-06 0301003364:李结:3364:74-12-08 0301003367:张建杰:3367:70-01-03 0301003369:王琪:3369:76-03-23 0301003370:刘洪涛:3370:77-10-26 0301003371:张兆鹏:3371:76-06-21 0301003373:王飞虎:3373:74-12-06 0301003375:王爱军:3375:74-01-02 0301003376:李小发:3376:72-12-20 0301003377:杨京海:3377:78-08-12 0301003379:王羽:3379:77-10-27 0301003380:周凤昆:3380:74-02-16 0301003381:王建新:3381:76-05-11 0301003384:卢红峰:3384:77-11-03 0301003387:解瑞杰:3387:72-05-15 0301003390:李振盈:3390:76-10-03 0301003393:马强:3393:75-10-03 0301003397:齐永强:3397:77-04-06
有兴趣的可以看看我花了3 天写的代码(重构过一次应该还是可以看看的 ) 下载:myGGUtil.rar包说明: 本次 代码在 myGGUtil.LGBeanUtil.LGUtil 下 (^_^)大家提点意见哦 ! 我希望这个好的想法 能成一个框架 哦~~~
BUG修订 09-21 15:44
时间类不能Update 问题 (如果在上面时间前下载那请从新下载)
在上一版本有大改动 自用小框架:DB工厂 1. 添加 jdbc 事物 2. 结构更合理 3. 速度加快
工具简单说明 脱离 DB 影射包 java 数据类 ,动态在内存中生成 动态数据类 ( 使用BeanUtils的DyanBean类 ) . 操作DB 面向对象操作(当然是动态^_^) 为了更实用 我用了张 50多属性的大表进行测试.阅读起来可能有点困难,希望大家海涵. version jdk 1.4
下载 DyanDBUtils.rar
包文件说明 : Config : JDBC 需要的 驱动 密码等 DBResources : 根据Config给出 Connection , PreparedStatement DynaClass : 根据元数据 和 table 给出 动态BasicDynaClass SQLSpelling : 给出 sql 语句和 sql语句中 ? 的值 ,格式为 List : lise.get(0)为sql语句 后其他为值 DyanDBUtils.java : 为本Util主要入口点 也是运行点
数据库表 z_jcyy_basepersonnel 有53个属性 (什么类型都有) 4 个不为空属性 personid , workno , depotid , hname
测试
package
DyanDBUtils.test;
import
java.util.Iterator;
import
org.apache.commons.beanutils.BeanUtils;
import
DyanDBUtils.DyanDBUtils;
import
junit.framework.TestCase;
public
class
testUtil
extends
TestCase {
static
private
DyanDBUtils dyd
=
DyanDBUtils.getDyanDBUtil() ;
static
private
Object obj
=
null
; //SELECT
public
void
testSelete()
throws
Exception{ dyd.setIsShowSQL(
true
);
for
(Iterator it
=
dyd.select(
"
select t.*, t.rowid from z_jcyy_basepersonnel t where t.personid = '0301003719'
"
).iterator(); it.hasNext();){ Object obj
=
it.next();
} } //INSERT
public
void
testInsert()
throws
Exception{ obj
=
dyd.getDyanDBBean(
"
z_jcyy_basepersonnel
"
); BeanUtils.setProperty(obj,
"
personid
"
,
"
1000
"
); BeanUtils.setProperty(obj,
"
workno
"
,
"
2000
"
); BeanUtils.setProperty(obj,
"
depotid
"
,
"
300
"
); BeanUtils.setProperty(obj,
"
hname
"
,
"
刘凯毅
"
); dyd.insert(obj); //INSERT
}
//UPDATE
public
void
testUpdate()
throws
Exception{ BeanUtils.setProperty(obj,
"
hname
"
,
"
思考..
"
); dyd.updateOrInsert(obj); //UPDATE
} //DELECT
public
void
testDelete()
throws
Exception{ dyd.delete(obj);//DELECT
System.out.println(
"
******************************************
"
); }
public
void
testCommit()
throws
Exception{ dyd.openCommit() ; Object obj
=
dyd.select(
"
select t.*, t.rowid from z_jcyy_basepersonnel t where t.personid ='0301003719'
"
).get(
0
); BeanUtils.setProperty(obj,
"
hname
"
,
"
刘凯毅
"
); dyd.updateOrInsert(obj);
BeanUtils.setProperty(obj,
"
workno
"
,
null
);
//
不可为空
dyd.updateOrInsert(obj); dyd.colseCommit(); testSelete(); } }
测试测试结果 (注意: 开头的 李家佳 3719 和后面的 3719 没变 就是事物的结果)
李家佳
3719
insert
into
z_jcyy_basepersonnel( depotid,drivekm,hname,hundreds,personid,resbaseknowledge,rescheck,resctrl,resproknowledge,ressaferules,roomarea,safekm,status,workno)
values
( ?,?,?,?,?,?,?,?,?,?,?,?,?,?)
//刘凯毅 2000 print insert
//
思考..
2000 print update
delete
from
z_jcyy_basepersonnel
where
1
=
1
and
personid
=
?
******************************************
delete
from
z_jcyy_basepersonnel
where
1
=
1
and
personid
=
?
insert
into
z_jcyy_basepersonnel( beginworktime,depotid,deptid,dob,drivekm,drivelocotype,dynamicinfo,dynamicinfo2,dynamicinfo3,eductionlevel,folk,hname,hundreds,marrystatus,minordriveno,nativeplace,personid,political,postid,promoteminordriverdate,resbaseknowledge,rescheck,resctrl,resproknowledge,ressaferules,roomarea,safebeginday,safekm,sex,status,techniclevel,workno)
values
( ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
delete
from
z_jcyy_basepersonnel
where
1
=
1
and
personid
=
?
insert
into
z_jcyy_basepersonnel( beginworktime,depotid,deptid,dob,drivekm,drivelocotype,dynamicinfo,dynamicinfo2,dynamicinfo3,eductionlevel,folk,hname,hundreds,marrystatus,minordriveno,nativeplace,personid,political,postid,promoteminordriverdate,resbaseknowledge,rescheck,resctrl,resproknowledge,ressaferules,roomarea,safebeginday,safekm,sex,status,techniclevel)
values
( ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) java.sql.SQLException: ORA
-
01400
: 无法将
NULL
插入 ("JCYY"."Z_JCYY_BASEPERSONNEL"."WORKNO") //事物运行良好 哦
李家佳 3719
总结 事物 解决了 还有多表问题 大家多给点鼓励哦 ^_^
BUG 修改 :
09-20 因为 Oracle 取元数据的字符串需要 大写 至修改并下载更新 测试使用表 ID SN STATIONNAME SPELL DEPOTID -------------- ---- -------------------- ---------- ------- ------------------ 08050000390689 3 永安 ya ....版本升级 09-21 DyanDBUtils 动态面向对象数据库 操作由于 hibernate 还要table影射成class 这好处和坏处只有我们程序员知道了 只要修改数据库就大量影射附加工作要做 ,有时影射还有BUG弄的我们@#$%!.....(哈hibernate我是小鸟^_^),我----不要----影射 , 没有他们数据库就又回到jdbc.本人比较喜欢偷懒 哈哈 自己来个小框架吧( 就300来行的代码有兴趣的看看哦 )!!! 用到技术 BeanUtil , JDBC元数据(在这我可是好好看了下JDBC,其实他是很强的东西,大家应该好好用用^_^) 下载 DBFactory.rarDBFactroy 数据是:+----+-------+-------------+------------+ | id | title | description | buydate | +----+-------+-------------+------------+ | 6 | tt | asdgwgw | 1990-12-02 | +----+-------+-------------+------------+先看看测试吧
public class testNotKonw extends TestCase {
protected void setUp() throws Exception { //运行 sql 可见 DBFactory.getTools().setIsShowSql(DBFactory.SHOW); super.setUp(); } public void testDelete()throws Exception{ // select 出来 就的 List 中 DynaBean : id , title ..... 类型 , 和值都有了 for(Iterator it = DBFactory.getTools().select("select * from books").iterator();it.hasNext();){ // 那就是delete : 目的是测试前 删除全部数据 DBFactory.getTools().delete(it.next()); } } public void testInsert()throws Exception{ // insert 要先new出来个 table->bean 再 添属性 Object obj = DBFactory.getTools().getDynaTableClass("books").newInstance(); BeanUtils.setProperty(obj,"id","6"); BeanUtils.setProperty(obj,"title","tt"); BeanUtils.setProperty(obj,"description","asdgwgw"); BeanUtils.setProperty(obj,"buydate",new Date()); //这几是 insert 了 (简单吧) DBFactory.getTools().insert(obj); } // update public void testUpdate()throws Exception{ for(Iterator it = DBFactory.getTools().select("select * from books").iterator();it.hasNext();){ Object obj = it.next(); BeanUtils.setProperty(obj,"buydate",new Date(90,11,2)); DBFactory.getTools().update(obj); } } }
控制台输出 //testDelete delete from books where 1=1 and id=6 //testInsert insert into books(id,title,description,buydate) values( 6,'tt','asdgwgw','2007-09-19') //testUpdate delete from books where 1=1 and id=6 insert into books(id,title,description,buydate) values( 6,'tt','asdgwgw','1990-12-02')
代码关键说明: 关键在BeanUtil 的 DnayBean中 我通过元数据 得到了 这个Bean 属性.属性类型,还有表信息放在 getClass();的字符串中 EG: table=...;key=..,..,..;columns=...,..,; 后在insert , delet , update就是(先delete后insert^_^) 中 解析得到 动态写sql语句 更举 DnayBean中属性类型看看 Bean value 是否要加 ' value ' 还是直接 value 到sql 中
public BasicDynaClass getDynaTableClass(String table){ Connection conn = getConn() ; List props = new ArrayList(); DatabaseMetaData dm = null ; BasicDynaClass dynaClass = null ; try { dm = conn.getMetaData(); ResultSet coulumns = dm.getColumns(null,null,table,null); while(coulumns.next()){ //元数据中得到 类型做 DynaBean 属性 coulumns.getInt("DATA_TYPE") 是 java.sql.Types.XXXXX props.add(new DynaProperty( coulumns.getString("COLUMN_NAME"),getStrClass(coulumns.getInt("DATA_TYPE"))) ); } // all : table //delete : column_name column_value //insert : column_name StringBuffer sb = new StringBuffer(); sb.append("table=").append(table).append(";"); sb.append("keys="); ResultSet keys = dm.getPrimaryKeys(null,null,table); while(keys.next()){ sb.append( keys.getString("column_name")).append(","); } sb.replace(sb.length()-1,sb.length(),";"); sb.append("columns="); ResultSet couls = dm.getColumns(null,null,table,null); while(couls.next()){ sb.append( couls.getString("column_name")).append(","); } sb.replace(sb.length()-1,sb.length(),";"); //为 Class name <- sb.toString() dynaClass = new BasicDynaClass(sb.toString() , null, (DynaProperty[])props.toArray(new DynaProperty[]{}) ); } catch (Exception e) {e.printStackTrace();} finally{ try { conn.close() ; } catch (SQLException e) {e.printStackTrace();} } return dynaClass ; } insert , delete 差不多 就来insert
public boolean insert(Object obj){ String sqlstrat = "insert into "; String sqldo = " values( "; String sqlend = ")"; String sql = ""; boolean od = false ; Connection conn = getConn() ; Statement sta = null ; try { //解析getDynaClass().getName() 得到 table sqlstrat += getTableConfig(obj,"table")[0]+"(" ; //解析getDynaClass().getName() 得到 columns String[] cols = getTableConfig(obj,"columns"); for(int i=0;i<cols.length;i++){ sqlstrat += cols[i] +","; sqldo += getSqlAtt(obj,cols[i] )+","; } sql = sqlstrat.substring(0,sqlstrat.length()-1)+")"+sqldo.substring(0,sqldo.length()-1)+sqlend; sta = conn.createStatement(); if( sta.executeUpdate(sql)>0){od = true;}; } catch (Exception e) {e.printStackTrace();} finally{ try { if( isShowSql==SHOW ) {System.out.println();System.out.println(sql);} conn.close(); } catch (SQLException e) {e.printStackTrace();} } return od ; }
小结: 当然表连和多表 查 是没问题的 但在多表 delete , update 就还没有完成 (蛮难的 5555 还有 没时间) 单表的 delete update ,select,insert 都完成了 我会努力的 大家要是认为还可以 帮忙顶贴 哦 我会都都完善哦
本人特留使用 ( ^_^ 写html 不多 呵呵 ) 本页问题说明: 在第一次加载这3个页面的javascript可正常使用 后 ajax修改的( innerHTML= )页面 javascript就使用不了全页的document而是修改后的document 有人可以帮帮忙吗? <%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'Layout.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <SCRIPT src="http://127.0.0.1:7000/jspLayout/js/ajax.js"></SCRIPT> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <%@include file="../html/top.jsp"%> <table width="90%"> <tr> <td valign="top" align="center" height="80%"> <jsp:include flush="true" page="../html/left.html"/> </td> <td id="cen" valign="middle" align="center" width="80%" height="80%"> <jsp:include flush="true" page="../html/center.html"/> </td> </tr> </table> </body> </html>
使用后好处 java 和 javascript 使用同统一对象,语法 . 数据从 sever 到 v层 和 v层 到 sever 方便. 简单说就是 JBean 不做修改拿到V层 当 JSBean (javascript 类) 中用
1.url 乱码问题参照 Ajax uri 乱码问题总结(IE,FF) 2.使用jar是 jxpath ; json ......(与相关) jxpath 参照 jxpath 学习笔记 json 参照 使用json-lib
例题说明 数据 name,avg 在通过 ajax json 后 avg +1 再展现到页面 本页需要 json.js 下载到 http://www.json.org/json.js
<%
@ page pageEncoding
=
"
GBK
"
%>
<%
@ page contentType
=
"
text/html; charset=GBK
"
%>
<
html
>
<
head
>
<
title
>
json.html
</
title
>
<
meta
http-equiv
="keywords"
content
="keyword1,keyword2,keyword3"
>
<
SCRIPT
src
="../js/json.js"
></
SCRIPT
>
<
script
language
="javascript"
type
="text/javascript"
>
var
request
=
false
; // javascript Ajax 没什么好说的 这可以用 prototype prototype.js 的理解 ,dojo dojo 等 ajax //本例 为方便直接写了 ^_^
function
getOpen(){
try
{ request
=
new
XMLHttpRequest(); }
catch
(trymicrosoft) {
try
{ request
=
new
ActiveXObject(
"
Msxml2.XMLHTTP
"
); }
catch
(othermicrosoft) {
try
{ request
=
new
ActiveXObject(
"
Microsoft.XMLHTTP
"
); }
catch
(failed) { request
=
false
; } } } }
function
getCustomerInfo() { getOpen();
if
(
!
request) alert(
"
Error initializing XMLHttpRequest!
"
); //这通过 url 把数据传给 server //数据来源 javascript 类 就下方 DBdata string: name:我名字^_^ , int: avg:年龄^_^
var
url
=
"
/json/json?jsonStr=
"
+
(
new
DBdata()).toJSONString() ; request.open(
"
GET
"
, url,
true
); request.send(
null
); request.onreadystatechange
=
updatePage; } // ajax 处理 数据后返回的 结果 // 年龄 +1 并输入到 输入框中
function
updatePage(){
if
(request.readyState
==
4
)
if
(request.status
==
200
){ //得到 json str
var
jss
=
request.responseText; //加载到 javascript 类中 string -> jsBean
var
jsobj
=
eval('('
+
jss
+
')'); //使用和 java对象一样 ^_^ document.getElementById('xx').value
=
jsobj.name
+
':'
+
jsobj.avg ; } } //数据来源
function
DBdata(){
this
.name
=
'刘凯毅';
this
.avg
=
23
;
this
.init
=
function
(){ alert('呵呵'); } }
</
script
>
</
head
>
<
body
onload
=""
>
<
INPUT
id
='xx'
type
="text"
>
<
INPUT
id
='x'
type
="button"
onclick
="getCustomerInfo()"
value
="go"
>
</
body
>
</
html
>
为了方便明了我java方就使用了 server package servlet;
import java.io.IOException; import java.io.PrintWriter;
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
import org.apache.commons.jxpath.JXPathContext;
import net.sf.json.JSONObject;
public class Json extends HttpServlet { public void doGet(HttpServletRequest req,HttpServletResponse rpo)throws ServletException,IOException{ rpo.setCharacterEncoding("GBK"); req.setCharacterEncoding("GBK"); rpo.setContentType("text/html; charset=GBK"); PrintWriter out = rpo.getWriter() ; //得到 url 传入数据 String str = req.getParameter("jsonStr") ; //java 方 string -> javaBean JSONObject jso = JSONObject.fromString(str); //javaBean 使用jxpathcontxt解读更方便 ^_^ //其实jso中是以 map 形式存区的 有兴趣的可以自己动手写下哦 JXPathContext jx = JXPathContext.newContext(jso); try { //jxpath好处来了 avg + 1 jx.setValue("./avg", jx.getValue("./avg + 1 ") ); } catch (Exception e) {e.printStackTrace();} //以 jsonString 传出 out.print(jso.toString());
} }
web.xml(好象有点多嘴了 哈哈 方便下入门人了) <servlet> <servlet-name>json</servlet-name> <servlet-class>servlet.Json</servlet-class> </servlet> <servlet-mapping> <servlet-name>json</servlet-name> <url-pattern>/json</url-pattern> </servlet-mapping>
|