【Lolttery】項目開發日誌 - (二) 數據庫的二三事

 

基本的框架定好了以後,就是數據庫的問題咯。在框架上咱們選用瞭如今比較流行的mybatis框架。

html

mybatis與spring的整合十分簡單: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>

 

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

 

一、mybatis不能將表名做爲參數數據庫

這一點是個挺坑爹的事情。源於但願寫一個公用的刪除接口。刪除指定表中指定id的數據。mybatis

根據百度的結果,mybatis並不能將表名做爲參數。app

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

<bean id = "jdbcTemplate"   
         class = "org.springframework.jdbc.core.JdbcTemplate">   
         <property name = "dataSource" ref="dataSource"/>   
    </bean>

很簡單就可使用。學習

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

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

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+"");
    }

 

二、關於bean的問題

mybatis須要一大堆的bean來作各類存儲: 查詢條件,查詢結果,數據庫實體巴拉巴拉……

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

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

不過說回來,有各類代碼補全,生成一個Bean也不是很麻煩的事情。可是如何組織這些bean纔是麻煩的事情。爲了不往後混亂,咱們給bean的命名制定了一套規則,以數據庫表名爲基本實體,用先後綴和包名進行標識。

 

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

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

大致的流程就是這樣的:

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

而後在UserBlogs裏面複製User的參數,加一個List<Blogs> blogs。

(2)作映射。主要是爲了不User中的參數和Blog中的參數有重名,會致使框架不知道該把字段交給誰

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

而後就可使用sql進行聯合查詢,會拿到一個帶着博客列表的用戶信息。

具體的代碼仍是看人家大神的博客比較好:

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

 

四、仍是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);
    }
相關文章
相關標籤/搜索