my blog my blog

Category: Java
Eclipse插件ERMaster离线安装附下载

 

ERMaster奶牛以前介绍过一次,但是发上来的安装网址是http://ermaster.sourceforge.net/update-site/,说sf吧其实挺蛋疼的,墙哇,不解释,不过有sf的源就能顺利安装么,NO。把ermaster的目录整个wget了下来,看了下,根下一个文件是site.xml。文件内容是

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <site> 
  3.    <description url="/"> 
  4.       update-site at sourceforge.net 
  5.    </description> 
  6.    <feature url="features/org.insightech.er.feature_1.0.0.v20121127-2328.jar" id="org.insightech.er.feature" version="1.0.0.v20121127-2328"> 
  7.       <category name="ermaster"/> 
  8.    </feature> 
  9.    <category-def name="ermaster" label="ERMaster"/> 
  10. </site> 

看url直接指向了目录features下的那个jar文件,打开之,得到文件feature.xml,内容

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <feature 
  3.       id="org.insightech.er.feature" 
  4.       label="ERMaster" 
  5.       version="1.0.0.v20121127-2328" 
  6.       provider-name="Insightech.org" 
  7.       plugin="org.insightech.er"> 
  8.  
  9.    <description url="http://ermaster.sourceforge.net"> 
  10.         <!--- ... ---> 
  11.    </description> 
  12.     
  13.    <copyright url="http://ermaster.sourceforge.net"> 
  14.         <!--- ... ---> 
  15.    </copyright> 
  16.     
  17.    <license url="http://ermaster.sourceforge.net"> 
  18.         <!--- ... ---> 
  19.    </license> 
  20.  
  21.    <url> 
  22.       <update label="ERMaster" url="http://downloads.sourceforge.net/project/ermaster/ermaster"/> 
  23.    </url> 
  24.  
  25.    <requires> 
  26.       <import plugin="org.eclipse.ui"/> 
  27.       <import plugin="org.eclipse.core.runtime"/> 
  28.       <import plugin="org.eclipse.gef"/> 
  29.       <import plugin="org.eclipse.ui.views"/> 
  30.       <import plugin="org.eclipse.ui.ide"/> 
  31.       <import plugin="org.eclipse.core.resources"/> 
  32.       <import plugin="org.eclipse.core.expressions"/> 
  33.    </requires> 
  34.  
  35.    <plugin 
  36.          id="org.insightech.er" 
  37.          download-size="0" 
  38.          install-size="0" 
  39.          version="1.0.0.v20121127-2328" 
  40.          unpack="false"/> 
  41.  
  42. </feature> 

继续看url行,又绕回去了对不对对不对,好嘛,饶了一圈,还是去http://downloads.sourceforge.net/project/ermaster/ermaster更新嘛,但是这个有plugin的信息,那么我们把这个url直接替换成"/"更换到文件中,然后把目录结构打包下就可以直接eclipse装了,那样子文件就都本地了。好了,直接附上包,把包解压缩后用那个local文件安装的方法选择目录安装就可以了。

点击下载ERMaster离线安装包

小结

 

1.button

js监听一个button的click事件,preventDefault()无效,不一定是js没写对,而是button有没有定义type=“button”,在一个form表单中,button如果不定义的话,默认就做submit处理了,所以请求直接就发出去了,监听也没用。

2.hibernate查询分页

最简单的还是hibernate的query直接在querystring中进行限定,限定setFirstResult()和setMaxResults()。比如我们要从第11条记录开始查询,那么我们可以这样子写

  1. String queryString = "select m from Profile as m where m." 
  2.                     + propertyName1 + "= ? and m." + propertyName2 + "= ?"
  3.             Query queryObject = getSession().createQuery(queryString) 
  4.                     .setFirstResult(10).setMaxResults(10); 
  5.             queryObject.setParameter(0, value1); 
  6.             queryObject.setParameter(1, value2); 
  7.             List<?> s = (List<?>) queryObject.list(); 
  8.             return s; 

这样子返回一个查询结果的list,然后迭代出来就可以了,当然,这只是查询部分的,如果要写分页的话,还需要count()等来辅助进行。

3.jquery的.on()

如果我们直接用$(document).ready(function(){})来做的话,对于使用ajax调用产生的新的dom元素,用一般的.click()等事件监听是不会起到作用的,在老版本的jQuery中使用.live()可以来进行对未来元素和现有元素的监听工作,但是新版本的建议是使用.on()来进行处理,这样子新生成的元素也就自然而然的可以监听到了。

4.jquery的遍历

遍历的话jquery的方法真的很好用,特别是选择器,很方便,.parent()、.children()、.prev()、.next()用起来非常省事儿。

5.jquery的ajax

  1. var data = {"userid" : $('input[name="userid"]').val(), 
  2. "phonenum" : $('input[name="phonenum"]').val(), 
  3. "email" : $('input[name="email"]').val() 
  4. }; 
  5. $.post('profile-update', data, function(data, textStatus, jqXHR) { 
  6. if (jqXHR.success(function() { 
  7.     alert("success"); 
  8. }) 
  9. ); 

当然,也可以直接连缀上一个.success()来处理,可以看http://api.jquery.com/jQuery.post/

6.hibernate的casecade级联

对于一对多或者多对多的情况,如果删除主表中的记录,那么以主表的主键做外键的其它表就会产生错误,导致删除失败,需要设置hibernate的配置文件casecade为delete,这样子删除的时候就可以自动把这些也删除了,当然还有其它的选项,感兴趣的话可以直接查找casecade的相关内容。

Java Date类型数据格式化输出

 

Java的Date直接输出样子十分不爽,借助SimpleDateFormat可以输出为自己希望的格式,而且十分方便。

日期和时间模式 结果
"yyyy.MM.dd G 'at' HH:mm:ss z" 2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy" Wed, Jul 4, '01
"h:mm a" 12:08 PM
"hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time
"K:mm a, z" 0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa" 02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z" Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ" 010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ" 2001-07-04T12:08:56.235-0700

这是SimpleDateFormat支持的输出格式,其实通过第一条我们就可以随便定义我们的输出了,只要知道年月日时分秒,然后自己添加词到输出的String就可以了。直接上一个例子就都明白了。

  1. import java.text.SimpleDateFormat; 
  2. import java.util.Date; 
  3.  
  4. public class dateformat { 
  5.  
  6.     public static void main(String[] args) { 
  7.         // TODO Auto-generated method stub 
  8.         Date date = new Date(); 
  9.         String sdf = new SimpleDateFormat("yyyy'年'MM'月'dd'日' HH:mm:ss"
  10.                 .format(date); 
  11.         System.out.print(sdf); 
  12.  
  13.     } 
  14.  

输出结果是:2013年04月26日 18:11:12

(奶牛时间,格式自己定就ok了,直接用‘’将文字分隔开就可以了,很方便)

Hibernate一对多查询方法小记

 

其实,这个地方我真心不是太明白,甚至说很混乱,但是有DAO和VO就啥都当对象来吧。

比如两个表User和Profile,通过外键将其关联起来,user的主键为profile的外键,通过Hibernate生成DAO和VO,则userDAO中会有很多查询user的方法,而user的VO会多一个set类的getProfiles(),如何通过这个set来查询VO的profile信息呢,查了一些资料,算是知道怎么回事儿了。

  1. public Set getProfiles() { 
  2.         return this.profiles; 

user VO的get方法得到的是profile类型的set,也就是说这个set迭代出来的是profile对象。使用方法可以是:

  1. User user = new User(); 
  2. Set<Profile> profileset = user.getProfiles(); 
  3. Iterator<Profile> iterator = profileset.iterator(); 
  4. While(iterator.hasNext()){ 
  5.         Profile profile = iterator.next(); 
  6.         System.out.print(profile.getEmail); 

这样子就迭代出来了。

对于profile的VO也同样有public User getUser()方法,可以直接返回user VO对象。

ProfileDAO如何通过外键来查找vo对象的方法:

  1. ProfileDAO profiledao = new ProfileDAO(); 
  2. Iterator<Profile> i = profiledao.findByProperty("user.id",1).iterator(); 
  3. while(i.hasNext()){ 
  4.      Profile p = i.next(); 
  5.      System.out.print(p.getEmail); 

有了上面的互相查询的方法,这个看着仿佛是多此一举,不过也还算可用。

github使用的基本方法

 

好吧,只说最基本的。

1.安装git环境

2.建立repo,从github的个人页面建立

3.初始化

  1. mkdir nenew 
  2. cd nenew 
  3. touch README.md 
  4. vim README.md 
  5. git init 
  6. git add README.md 
  7. git commit -m "set up git repo by nenew" 
  8. git remote add origin https://github.com/xxxx/nenew.git 
  9. git push -u origin master 

这时候你的第一条readme就已经更新到了你的repo。

4.之后的使用

  1. touch a,b,c,d 
  2. git add ./ 
  3. git commit -a -m "a b c d files added" 
  4. git push origin master 

这是最基本的使用方法,当然,git提供了众多功能,可以参考:https://gitcafe.com/GitCafe/Help

hibernate真心挺折腾的

 

还是比较习惯mysql直接用sql语句来查询,HQL还需要习惯习惯再习惯哇。

这两天折腾Hibernate真的挺纠结的,可能我对于对象这东西的理解太水了,先ermaster做了数据库,然后用hibernate的逆向工程生成了hibernate的对象类,然后就sb了。

映射那里仔细看下,才知道,表b外键关联表a主键的时候,并木有在表b的对象类中直接生成表a主键,而是直接把表a的对象给引入进去了。呃,解释有点儿混乱。这样子,就说设计的两个表吧,主表是main,有主键id,生成的对象类是Main,然后副表是profile,有主键profileid和外键id,生成的副表对象类是Profile。

  1. Profile p = new Profile(); 
  2. Main m = new Main(); 
  3. p.setMain (m); 
  4. session.saveOrUpdate(p) 

这样子就把一个新的profile对象存上了,但是p并没有外键属性id,因此无法用HQL的from Profile  where id = x来查询,但是其实p是有p.main的,所以要查询的时候使用from Profile where main.id = x来获得已添加的p对象。挺绕的。可能map映射改下就不用那么麻烦了。可能数据库的结构还要变,把isxxx的判断都放到main表中,明天再思考这个问题。

还有那个from xxx.class 1这个东东,明天再查查。

 

设计数据库ER模型图利器ERMaster

 

ERMaster是eclipse的一个插件,用于设计ER模型图。提供的功能包括:从数据库导入关系生成ER图,导出设计图,导出DDL数据定义语句等。目前完整支持的数据库包括 MySQL、PostgreSQL 和Oracle (developing) DB2 (developing) HSQLDB (developing) SQLITE (developing) SQLServer (developing)。

安装方法很简单,只要在eclipse的插件里面添加地址就可以安装了

  1. http://ermaster.sourceforge.net/update-site/ 

使用也很方便,table直接拖出来,然后1toN NtoN之类的关系都可以直接搞定,并且可以导出ddl,在mysql下直接source下就生成数据表了,ermaster还可以生成测试数据,但是需要自己配置下,比如enum跟boolean的值会有问题。

总之还是很好用的,推荐下。

Java调用Apache commons codec实现md5加密

 

org.apache.commons.codec.digest
Class DigestUtils

java.lang.Object
  extended by org.apache.commons.codec.digest.DigestUtils

static String md5Hex(String data)
          Calculates the MD5 digest and returns the value as a 32 character hex string.

apache commons codec下载:http://commons.apache.org/proper/commons-codec/download_codec.cgi

实现方法:

  1. import org.apache.commons.codec.digest.*; 
  2.  
  3. public class md5another { 
  4.     public void md5create(String input) { 
  5.         System.out.print("32bit result:" + DigestUtils.md5Hex(input) + "\n"); 
  6.         System.out.print("16bit result:" 
  7.                 + DigestUtils.md5Hex(input).substring(824) + "\n"); 
  8.     } 
  9.  
  10.     public static void main(String[] args) { 
  11.  
  12.         md5another a = new md5another(); 
  13.         a.md5create("nenew"); 
  14.     } 

 

java编程md5实现方法

 

毕业设计要做一个论文在线管理系统,所以加密这块儿呢,必不可少的,首选还是md5,md5一次加密现在也都有库可查了,所以打算采用二次加密,昨天找了下资料,发现java有专门的类可以来实现,奶牛不是搞算法那块儿料,所以算法实现的就不要看了。下面来分析下。

java.security
Class MessageDigest

java.lang.Object
  extended by java.security.MessageDigestSpi
      extended by java.security.MessageDigest

具体使用到的方法有两个:

  1. 方法:getInstance(String algorithm) 
  2. 描述:Returns a MessageDigest object that implements the specified digest algorithm.
  3. algorithm的可以使用值有:DSA, SHA-1, MD5, DES, and DES3 
  4. 详情可以看:
  5. http://docs.oracle.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html#ProviderImplReq 
  6. 返回值: static MessageDigest    
  7.  
  8. 方法:digest(byte[] input) 
  9. 描述:Performs a final update on the digest using the specified array of bytes
  10. then completes the digest computation. 
  11. 返回值: byte[]  

首先用getInstance("md5")方法来选择md5加密,然后用digest(byte[] input)来得到加密后的128位密文byte数组,而我们平时看到的md5密文是32位或者是16位的,因此需要转换。直接用digest(byte[] input)就可以免去使用update(byte[] input) 的那步了。

digest(byte[] input)返回的是16组8位二进制数,需要转换为2位十六进制数,然后依次转换可以得到32位的md5密文,截取32位密文的8~24位即为16位md5密文。

具体实现代码:

 

  1. import java.security.MessageDigest; 
  2. import java.security.NoSuchAlgorithmException; 
  3.  
  4. public class md5 { 
  5.     public String str; 
  6.  
  7.     public void md5create(String input) { 
  8.         try { 
  9.             MessageDigest md = MessageDigest.getInstance("MD5"); 
  10.             byte b[] = md.digest(input.getBytes()); 
  11.  
  12.             int i; 
  13.  
  14.             StringBuffer buf = new StringBuffer(""); 
  15.             for (int offset = 0; offset < b.length; offset++) { 
  16.                 i = b[offset]; 
  17.                 if (i < 0
  18.                     i += 256
  19.                 if (i < 16
  20.                     buf.append("0"); 
  21.                 buf.append(Integer.toHexString(i)); 
  22.  
  23.             } 
  24.             str = buf.toString(); 
  25.             System.out.println("32bit result: " + buf.toString());// 32位的加密 
  26.             System.out.println("16bit result: " 
  27.                     + buf.toString().substring(824));// 16位的加密 
  28.         } catch (NoSuchAlgorithmException e) { 
  29.             // TODO Auto-generated catch block 
  30.             e.printStackTrace(); 
  31.  
  32.         } 
  33.     } 
  34.  
  35.     public static void main(String agrs[]) { 
  36.         md5 md5object = new md5(); 
  37.         md5object.md5create("nenew");// 加密nenew 
  38.     } 
  39.  

 

毕设来了

 

2013年的毕业设计,比以往时候来得更晚一些。认识的人早早的都拿到毕设题目神马的了,只有我们学校还迟迟的到开学才抽签选题目。学校压根儿就没安排神马实习,这是我觉得大学比较大的遗憾,哪怕实习水点儿也好哇,总比没有得强。

说说毕设,毕设选的嵌入式软件方向的宿老师,说真心话,大学里面论教学,我最喜欢宿老师的教学风格,有问题直接查官方文档,对于教学的内容也很好的把握,从基础开始,但并不缺少对于后期的一些提要,java课是我大学觉得最有意思的课。

毕设方向也是java相关的,可以选android应用开发,也可以选java web,奶牛想了不少,也开始看java web方面的书籍了,得寻思上手哇,然后js神马的后期也得学起,html5 css3的能用就用,咋说新东西还是会让人眼前一亮的吧。

只想踏踏实实的把毕设做好,大学就毕业了,总不想自己虚度最后的时光,浑浑噩噩混日子神马的是不可取的。