【spring】joinしたselect結果をRowMapper(オブジェクト)で取得する

spring

以前select結果をRowMapper(オブジェクト)で取得する方法を紹介しました。
こちらの方法は、単独テーブル(join無し)を前提とした取得方法です。

今回紹介する方法は、joinしたテーブル結果をRowMapper(オブジェクト)で返却する方法を紹介します。

[スポンサーリンク]

今回紹介する方法は、以前紹介した方法よりも若干めんどくさい感じがします。(難しいのではなく、めんどくさい感じです。)

この章でやること

RowMapperを使って、joinしたselect結果をオブジェクトにして返却します。

springでDB操作する方法

過去にDB接続方法の記事を書きました。
DB接続がまだの方は、こちらを参照して下さい。
springのDB接続方法を解説

joinするテーブル(取得するテーブルデータ)

この2つのテーブルをJoinした結果を取得するプログラムを作っていきます。
リレーションキーは、category_idです。

  • m_category
  • t_site
  • joinするテーブルをオブジェクトで表す

    これが今回作成するプログラムの返却値となります。

    public class SiteJoinCategory {
        private Category category;
        private Site site;
        public Category getCategory() {
            return category;
        }
        public void setCategory(Category category) {
            this.category = category;
        }
        public Site getSite() {
            return site;
        }
        public void setSite(Site site) {
            this.site = site;
        }
    
    }
    

    t_siteテーブルのオブジェクトです。

    public class Site {
        private Integer siteId;
        private String siteName;
        private Integer categoryId;
    
        public Integer getSiteId() {
            return siteId;
        }
        public void setSiteId(Integer siteId) {
            this.siteId = siteId;
        }
        public String getSiteName() {
            return siteName;
        }
        public void setSiteName(String siteName) {
            this.siteName = siteName;
        }
        public Integer getCategoryId() {
            return categoryId;
        }
        public void setCategoryId(Integer categoryId) {
            this.categoryId = categoryId;
        }
    }
    

    m_categoryテーブルのオブジェクトです。

    public class Category {
        private Integer categoryId;
        private String categoryName;
    
        public Integer getCategoryId() {
            return categoryId;
        }
        public void setCategoryId(Integer categoryId) {
            this.categoryId = categoryId;
        }
        public String getCategoryName() {
            return categoryName;
        }
        public void setCategoryName(String categoryName) {
            this.categoryName = categoryName;
        }
    }
    

    joinしたselect結果をオブジェクトにして返却するプログラム

    前置きが長くなりましたが、ここがメインのプログラムです。(汗)

    @Component
    public class SiteJoinCategoryDao {
    
        @Resource
        private JdbcTemplate jdbcTemplate;
        
        public List<SiteJoinCategory> findAll() {
            String sql = "select site.*, cat.* " +
                            "from t_site site inner join m_category cat " +
                            "ON site.category_id = cat.category_id";
            RowMapper<SiteJoinCategory> rowMapper = new SiteCategoryRowMapper();
    
            List<SiteJoinCategory>  list = jdbcTemplate.query(sql, rowMapper);
            return list;
        }
    
        /**
         * RowMapper
         */
        protected class SiteCategoryRowMapper implements RowMapper<SiteJoinCategory> {
    
            @Override
            public SiteJoinCategory mapRow(ResultSet rs, int rowNum) throws SQLException {
                SiteJoinCategory siteJoinCategory = new SiteJoinCategory();
                Site site = new Site();
                Category category = new Category();
    
                site.setSiteId(rs.getInt("site.site_id"));
                site.setSiteName(rs.getString("site.site_name"));
                site.setCategoryId(rs.getInt("site.category_id"));
    
                category.setCategoryId(rs.getInt("cat.category_id"));
                category.setCategoryName(rs.getString("cat.category_name"));
                
                siteJoinCategory.setSite(site);
                siteJoinCategory.setCategory(category);
                return siteJoinCategory;
            }
        }
    }
    

    解説

    多少長くて分かりにくいサンプルですが、じっくり見てみると簡単なソースです。
    select結果は、SiteCategoryRowMapperオブジェクトを使って返却しています。
    このクラスは必ず、RowMapperをimplementsして使って下さい。

    mapRowメソッドで、各テーブルのselect結果をオブジェクトへ詰め込んで、さらにその親クラスにセットすることで、joinしたテーブル結果を返却しています。

    springMVCのバージョン

    org.springframework-versionは、3.1.0を使っています。
    javaは、1.7を使っています。

    最後に

    実際のプロジェクトでは、単発のselectよりも、joinしたselectを使うことの方が多いです。
    テーブルをjoinしても、RowMapperを応用すれば、一つのオブジェクトを返却することが出来ます。
    比較的簡単なのでしっかりおさえておきましょう!
    それでは!