【Lolttery】專案開發日誌 (二) 資料庫的二三事

晦若晨曦發表於2017-12-14

基本的框架定好了之後,就是資料庫的問題咯。在框架上我們選用了現在比較流行的mybatis框架。

mybatis與spring的整合十分簡單:

<!-- 配置sqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

        <!-- 例項化sqlSessionFactory時需要使用上述配置好的資料來源以及SQL對映檔案 -->
        <property name="dataSource" ref="dataSource" />

        <!--若使用註解配置sql,此處可以不用xml檔案配置-->
        <property name="mapperLocations" value="classpath:/mybatis/*.xml" />
    </bean>
複製程式碼

不過在使用過程中倒是遇到並解決了一些問題和疑惑

##1、mybatis不能將表名作為引數

這一點是個挺坑爹的事情。源於希望寫一個公用的刪除介面。刪除指定表中指定id的資料。

根據百度的結果,mybatis並不能將表名作為引數。

於是最後的解決方案是混用了spring的jdbcTemplate。只要一個配置:

<bean id = "jdbcTemplate" class = 
"org.springframework.jdbc.core.JdbcTemplate"> 
<property name = "dataSource" ref="dataSource"/> 
</bean>
複製程式碼

很簡單就可以使用。

jdbcTemplate簡單的封裝了jdbc操作,執行一些與實體無關的sql的時候還是挺方便的。

在設計上id只有自增和字串兩種,所以公用刪除方法也挺簡單的:

public void commonDelete(String table,Object id){
        if(id instanceof String)
            jdbcTemplate.execute("delece from "+table+" where id=\""+id+"\"");
        else
            jdbcTemplate.execute("delete from "+table+" where id="+id+"");
    }
複製程式碼

##2、關於bean的問題

mybatis需要一大堆的bean來做各種儲存: 查詢條件,查詢結果,資料庫實體巴拉巴拉……

剛剛遇到這個問題的時候著實嚇到了我。彷彿看到了一個專案100個類有80個都是各種bean……

目前看來,這是一個不可避免的問題。所以準備用mybatis的童鞋也做好面對一大堆的bean的準備。

不過說回來,有各種程式碼補全,生成一個Bean也不是很麻煩的事情。但是如何組織這些bean才是麻煩的事情。為了避免日後混亂,我們給bean的命名制定了一套規則,以資料庫表名為基本實體,用前字尾和包名進行標識。

##3、意外的學習:mybatis聯合查詢

在搞bean的時候意外的百度到了mybatis的聯合查詢,發現還是挺強大的。

大體的流程就是這樣的:

(1)定義好一個聯合查詢的結果Bean,比如現在有User和Blog兩個bean,做一個UserBlogs

然後在UserBlogs裡面複製User的引數,加一個List blogs。

(2)做對映。主要是為了避免User中的引數和Blog中的引數有重名,會導致框架不知道該把欄位交給誰

(3)根據對映做查詢。用簡單的聯合查詢sql語句,注意查詢結果的欄位名要給別名,與對映好的欄位一一對應。

然後就可以使用sql進行聯合查詢,會拿到一個帶著部落格列表的使用者資訊。

具體的程式碼還是看人家大神的部落格比較好:

http://www.cnblogs.com/luxiaoxun/p/4035276.html

##4、還是bean的問題

有時候資料庫欄位太多,寫插入、修改語句什麼的還是挺鬧心的……

於是做了一個簡單的插入語句生成器:

/**
     * 根據bean生成新增sql語句
     * @param table
     * @param bean
     */
    public static void genAddSql(String table,Class bean) {
        StringBuilder builder =new StringBuilder();
        builder.append("insert into ").append(table);
        StringBuilder preffix = new StringBuilder(" (");
        StringBuilder surffix = new StringBuilder("(");
        Method[] methods = bean.getMethods();
        for (Method method : methods) {
            String name = method.getName();
            if(name.equals("setId"))
                continue;
            if(name.startsWith("set")){
                preffix.append(name.substring(3).toLowerCase()).append(",");
                surffix.append("#{").append(name.substring(3).toLowerCase()).append("},");
            }
        }
        preffix.deleteCharAt(preffix.length()-1);
        surffix.deleteCharAt(surffix.length()-1);
        preffix.append(") values ");
        surffix.append(")");
        builder.append(preffix).append(surffix);
        System.out.println(builder);
    }
    /**
     * 根據bean生成修改sql語句
     * @param table
     * @param bean
     */
    public static void genUpdateSql(String table,Class bean) {
        StringBuilder builder =new StringBuilder();
        builder.append("update ").append(table).append(" set ");
        Method[] methods = bean.getMethods();
        for (Method method : methods) {
            String name = method.getName();
            if(name.equals("setId"))
                continue;
            if(name.startsWith("set")){
                String p = name.substring(3).toLowerCase();
                builder.append("<if test=\"#{").append(p).append("}!=null\">");
                builder.append(p).append("=#{").append(p).append("} ").append("</if>");
            }
        }
        builder.append("where id=#{id}");
        System.out.println(builder);
    }
複製程式碼

相關文章