pojo类的属性与数据库表字段名一样时,java通过反射拼凑出相应的sql.

来源:互联网 发布:java 简单加密 编辑:程序博客网 时间:2024/05/16 02:20
转自csdn http://topic.csdn.net/u/20081102/09/2d46728d-fc23-47bc-b6da-e4638eb0d298.html
备忘:
  1. package hl.ghost.dao; 
  2. import java.lang.reflect.Field; 
  3. import java.lang.reflect.InvocationTargetException; 
  4. import java.lang.reflect.Method; 
  5. import java.sql.ResultSet; 
  6. import java.sql.SQLException; 
  7. import java.util.ArrayList; 
  8. import java.util.List; 
  9. import org.springframework.jdbc.core.JdbcTemplate; 
  10. import org.springframework.jdbc.core.RowMapper; 
  11. public class Session implements RowMapper { 
  12. private JdbcTemplate jdbcTemplate; 
  13. private Class clazz; 
  14. public int save(Object target, String table) { 
  15. StringBuilder sb = new StringBuilder("insert into "); 
  16. List list = new ArrayList(); 
  17. sb.append(table); 
  18. sb.append(" ("); 
  19. for (Field field : target.getClass().getDeclaredFields()) { 
  20. Object result = this.getObjectValue(field,target); 
  21. sb.append(field.getName()).append(","); 
  22. list.add(result); 
  23. sb.replace(sb.length() - 1, sb.length(), ")"); 
  24. sb.append(" values("); 
  25. for (int i = 0; i < target.getClass().getDeclaredFields().length; i++) { 
  26. sb.append("?,"); 
  27. sb.replace(sb.length() - 1, sb.length(), ")"); 
  28. return this.jdbcTemplate.update(sb.toString(), list.toArray()); 
  29. public int delete(Object target, String table) { 
  30. try { 
  31. return this.jdbcTemplate.update("delete from " + table 
  32. " where id=?"new Object[] { getObjectValue(target.getClass() 
  33. .getDeclaredField("id"),target) }); 
  34. catch (Exception e) { 
  35. e.printStackTrace(); 
  36. return 0
  37. public List <Object> selectObjectsByProperties(Object target, String table) 
  38. clazz=target.getClass(); 
  39. StringBuilder sb = new StringBuilder("select * from " + table 
  40. " where 1=1 "); 
  41. List <Object> list = new ArrayList <Object>(); 
  42. if (null != target) { 
  43. for (Field field : target.getClass().getDeclaredFields()) { 
  44. Object result = this.getObjectValue(field,target); 
  45. if (result != null) { 
  46. sb.append(" and ").append(field.getName()).append("=? "); 
  47. list.add(result); 
  48. return this.jdbcTemplate.query(sb.toString(), list.toArray(), this); 
  49. public Object mapRow(ResultSet rs, int arg1) throws SQLException { 
  50. Object object = null
  51. try { 
  52. object = clazz.getConstructor(null).newInstance(); 
  53. for (Field field : clazz.getDeclaredFields()) { 
  54. Method method = clazz.getMethod("set" 
  55. new StringBuffer(field.getName()).replace(01, field 
  56. .getName().substring(01).toUpperCase()), 
  57. new Class[] { field.getType() }); 
  58. method.invoke(object, new Object[] { rs.getObject(field 
  59. .getName())}); 
  60. catch (Exception e) { 
  61. e.printStackTrace(); 
  62. return object; 
  63. public Object getObjectValue(Field field,Object target) { 
  64. Object result = null
  65. try { 
  66. Method method = target.getClass().getMethod( 
  67. "get" 
  68. new StringBuffer(field.getName()).replace(01
  69. field.getName().substring(01
  70. .toUpperCase()), null); 
  71. result = method.invoke(target,null); 
  72. catch (Exception e) { 
  73. e.printStackTrace(); 
  74. return result; 
  75. public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { 
  76. this.jdbcTemplate = jdbcTemplate; 
  77. 这是建立在jdbcTemplate上的ormapping,只要你的类的属性与数据表的字段名字一样,且有id这个主键,那么就可以用这个Session做增删查,比如你有个表 users(id,uname,upassword)  ,类User(id,uname,upassword). 
  78. 那么你就可以用上面的session对users这个表做增删改查, 
  79. User user=new User(); 
  80. user.setId(1); 
  81. user.setUname("zhangsan"); 
  82. user.setUpassword("password"); 
  83. session.save(user,"users");//增加 
  84. session.delete(user,"users");//删除 
  85. //他会跟据你user的属性的值进行组合查询,下面是按name,password的组合查询。 
  86. User user=new User(); 
  87. user.setUpassword("password"); 
  88. user.setUname("zhangsan"); 
  89. session.selectObjectsByProperties(user,"users");