【Lolttery】项目开发日志 (二) 数据库的二三事
基本的框架定好了之后,就是數(shù)據(jù)庫的問題咯。在框架上我們選用了現(xiàn)在比較流行的mybatis框架。
mybatis與spring的整合十分簡單:
<!-- 配置sqlSessionFactory --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 實例化sqlSessionFactory時需要使用上述配置好的數(shù)據(jù)源以及SQL映射文件 --><property name="dataSource" ref="dataSource" /><!--若使用注解配置sql,此處可以不用xml文件配置--><property name="mapperLocations" value="classpath:/mybatis/*.xml" /></bean> 復(fù)制代碼不過在使用過程中倒是遇到并解決了一些問題和疑惑
##1、mybatis不能將表名作為參數(shù)
這一點是個挺坑爹的事情。源于希望寫一個公用的刪除接口。刪除指定表中指定id的數(shù)據(jù)。
根據(jù)百度的結(jié)果,mybatis并不能將表名作為參數(shù)。
于是最后的解決方案是混用了spring的jdbcTemplate。只要一個配置:
<bean id = "jdbcTemplate" class = "org.springframework.jdbc.core.JdbcTemplate"> <property name = "dataSource" ref="dataSource"/> </bean> 復(fù)制代碼很簡單就可以使用。
jdbcTemplate簡單的封裝了jdbc操作,執(zhí)行一些與實體無關(guān)的sql的時候還是挺方便的。
在設(shè)計上id只有自增和字符串兩種,所以公用刪除方法也挺簡單的:
public void commonDelete(String table,Object id){if(id instanceof String)jdbcTemplate.execute("delece from "+table+" where id=\""+id+"\"");elsejdbcTemplate.execute("delete from "+table+" where id="+id+"");} 復(fù)制代碼##2、關(guān)于bean的問題
mybatis需要一大堆的bean來做各種存儲: 查詢條件,查詢結(jié)果,數(shù)據(jù)庫實體巴拉巴拉……
剛剛遇到這個問題的時候著實嚇到了我。仿佛看到了一個項目100個類有80個都是各種bean……
目前看來,這是一個不可避免的問題。所以準備用mybatis的童鞋也做好面對一大堆的bean的準備。
不過說回來,有各種代碼補全,生成一個Bean也不是很麻煩的事情。但是如何組織這些bean才是麻煩的事情。為了避免日后混亂,我們給bean的命名制定了一套規(guī)則,以數(shù)據(jù)庫表名為基本實體,用前后綴和包名進行標(biāo)識。
##3、意外的學(xué)習(xí):mybatis聯(lián)合查詢
在搞bean的時候意外的百度到了mybatis的聯(lián)合查詢,發(fā)現(xiàn)還是挺強大的。
大體的流程就是這樣的:
(1)定義好一個聯(lián)合查詢的結(jié)果Bean,比如現(xiàn)在有User和Blog兩個bean,做一個UserBlogs
然后在UserBlogs里面復(fù)制User的參數(shù),加一個List blogs。
(2)做映射。主要是為了避免User中的參數(shù)和Blog中的參數(shù)有重名,會導(dǎo)致框架不知道該把字段交給誰
(3)根據(jù)映射做查詢。用簡單的聯(lián)合查詢sql語句,注意查詢結(jié)果的字段名要給別名,與映射好的字段一一對應(yīng)。
然后就可以使用sql進行聯(lián)合查詢,會拿到一個帶著博客列表的用戶信息。
具體的代碼還是看人家大神的博客比較好:
http://www.cnblogs.com/luxiaoxun/p/4035276.html
##4、還是bean的問題
有時候數(shù)據(jù)庫字段太多,寫插入、修改語句什么的還是挺鬧心的……
于是做了一個簡單的插入語句生成器:
/*** 根據(jù)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);}/*** 根據(jù)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);} 復(fù)制代碼總結(jié)
以上是生活随笔為你收集整理的【Lolttery】项目开发日志 (二) 数据库的二三事的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 获取控制器 nextResponder
- 下一篇: springcloud微服务实战 学习笔
