多属性对象创建公用RowMapper

ゞ 浴缸里的玫瑰 2022-08-07 09:59 197阅读 0赞
  1. 接着[上一篇博文][Link 1],继续写一下,如果给多属性的大对象,如何创建公用的rowmapper
  2. 假如有应用对象App,包含属性如下
  3. /**
  4. * 应用实体类
  5. * @author Administrator
  6. */
  7. public class App {
  8. // 应用ID
  9. private String id;
  10. // 名称
  11. private String name;
  12. // 发布时间
  13. private Date createTime;
  14. // 应用类型
  15. private AppType appType;
  16. // 应用访问地址
  17. private String appVisitedAddress;
  18. // 应用图标
  19. private Image appImage;
  20. }
  21. 其中应用类型和图标又分别为类
  22. /**
  23. * 应用类型实体
  24. * @author Administrator
  25. */
  26. public class AppType {
  27. // 类型ID
  28. private String typeId;
  29. // 类型名称
  30. private String typeName;
  31. }
  32. /**
  33. * 图标实体类
  34. * @author Administrator
  35. */
  36. public class Image {
  37. // 图标ID
  38. private String imageId;
  39. // 退保路径
  40. private String imageUrl;
  41. }
  42. 假如要查询出一个App对象的话,那么映射的属性共有idnamecreateTime appVisitedAddress 四个单属性 appType appImage 两个对象属性。
  43. 但是 查询的时候,并不需要每次都将所有的属性查询出来,然后组装为App 对象的实例,那么每次都写一个App RowMapper 类吗?显然比较浪费。
  44. 我们可以使用前一篇博文讲过的,根据查询结果集中是否存在该属性列来决定是否映射该属性,写一个公用的AppRowMapper类。
  45. import java.sql.ResultSet;
  46. import java.sql.SQLException;
  47. import org.springframework.jdbc.core.RowMapper;
  48. import com.bbs.entity.App;
  49. import com.bbs.entity.AppType;
  50. import com.bbs.entity.Image;
  51. public class AppRowMap implements RowMapper<App> {
  52. @Override
  53. public App mapRow(ResultSet rs, int index) throws SQLException {
  54. // APPType 类
  55. AppType appType = new AppType();
  56. // typeId属性映射
  57. if (isExistColumn(rs, "typeId")) {
  58. appType.setTypeId(rs.getString("typeId"));
  59. }
  60. // typeName属性
  61. if (isExistColumn(rs, "typeName")) {
  62. appType.setTypeName(rs.getString("typeName"));
  63. }
  64. // AppImage 类
  65. Image appImage = new Image();
  66. // imageId 属性
  67. if (isExistColumn(rs, "imageId")) {
  68. appImage.setImageId(rs.getString("imageId"));
  69. }
  70. // imageName 属性
  71. if (isExistColumn(rs, "imageName")) {
  72. appImage.setImageUrl(rs.getString("imageName"));
  73. }
  74. final App app = new App();
  75. // 应用id
  76. if (isExistColumn(rs, "id")) {
  77. app.setId(rs.getString("id"));
  78. }
  79. // 应用name
  80. if (isExistColumn(rs, "name")) {
  81. app.setName(rs.getString("name"));
  82. }
  83. // 创建时间
  84. if (isExistColumn(rs, "createTime")) {
  85. app.setCreateTime(rs.getDate("createTime"));
  86. }
  87. // 访问地址
  88. if (isExistColumn(rs, "appVisitedAddress")) {
  89. app.setAppVisitedAddress(rs.getString("appVisitedAddress"));
  90. }
  91. app.setAppImage(appImage);
  92. app.setAppType(appType);
  93. return app;
  94. }
  95. /**
  96. * 判断查询结果集中是否存在某列
  97. * @param rs 查询结果集
  98. * @param columnName 列名
  99. * @return true 存在; false 不存咋
  100. */
  101. public boolean isExistColumn(ResultSet rs, String columnName) {
  102. try {
  103. if (rs.findColumn(columnName) > 0 ) {
  104. return true;
  105. }
  106. }
  107. catch (SQLException e) {
  108. return false;
  109. }
  110. return false;
  111. }
  112. }
  113. 这样,当我们第一次仅查询出idname时,和第二次查询出idappVisitAddress时便可共用一个AppRowMap 对象。
  114. 这里我们只是一个简单的例子,给的对象属性都比较少,当然实际情况中,对象属性可能更多,而且关联对象更复杂时,这种方式便非常有效。因为在数据库查询结果集ResultSet中,如果直接去getString("notExistColumn") 时,会直接抛SQLExceptionisExistColumn(ResultSet rs, String columnName) 正是利用了 findColumn 方法的SQLException ,然后达到了是否存在该列的效果。

发表评论

表情:
评论列表 (有 0 条评论,197人围观)

还没有评论,来说两句吧...

相关阅读

    相关 33. 创建可管理的对象属性

    在面向对象编程中,我们把方法(函数)看作对象的接口。直接访问对象的属性可能是不安全的,或导致设计上不够灵活,但是使用调用方法在形式上不如访问属性简洁。例如: circ