一醒颖、數(shù)據(jù)庫模塊(1)實戰(zhàn)

上一篇文章粗略介紹了數(shù)據(jù)庫模塊妻怎,地址:http://www.reibang.com/p/f9c1358cce8f

實戰(zhàn)

光說不練假把戲,要掌握一個框架泞歉,最快的方法還是不斷用框架做一些小功能蹂季。所以這一章主要利用數(shù)據(jù)庫模塊做一個小例子

一冕广、前期準(zhǔn)備

首先需要做的是安裝一個數(shù)據(jù)庫(目前只支持MySQL和oracle,前者親測可用)偿洁,并且創(chuàng)建幾張表撒汉。下面是我的表對應(yīng)創(chuàng)建語句:
其次就是把框架和對應(yīng)的依賴導(dǎo)入項目中。

CREATE TABLE `danmaku` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `type` VARCHAR(50) NOT NULL,
    `time` INT(11) NOT NULL,
    `nickname` VARCHAR(50) NOT NULL,
    `rid` VARCHAR(50) NOT NULL,
    `platform` VARCHAR(50) NOT NULL,
    `roomid` VARCHAR(50) NOT NULL,
    `content` VARCHAR(50) NOT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=3501
;

這是記錄著一個直播間的彈幕的表涕滋,字段名對應(yīng)的名字很好理解睬辐,就不介紹了。無視(rid

二宾肺、通過數(shù)據(jù)庫表生成對應(yīng)的java類

這里使用到的模塊是 autogenerate溯饵。

  • 1、配置數(shù)據(jù)庫信息锨用。
    autogenerate 是調(diào)用 db模塊與數(shù)據(jù)庫通信的丰刊,而db又是通過sql.xml文件配置好數(shù)據(jù)庫的地址,用戶名增拥,密碼等信息啄巧。所以我們第一件事就是在com.angroid.service創(chuàng)建sql.xml文件(db模塊會默認(rèn)在com.angroid.service包中讀取sql.xml文件,見源碼)掌栅。文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<sqlset>
    <datasource> 
        <property id="url" value="jdbc:mysql://你的數(shù)據(jù)庫地址/數(shù)據(jù)庫名?useUnicode=true&characterEncoding=utf-8&user=your_username&password=your_password" />   
        <property id="driver" value="org.mariadb.jdbc.Driver" />     
    </datasource>
    
    <sql id="room_history">
        <![CDATA[
            select * from room where roomid = {:roomid}
        ]]>
    </sql>
</sqlset>

在這份文件中可以看到兩個部分秩仆,一是 <datasource>標(biāo)簽,它是存放目標(biāo)數(shù)據(jù)庫的配置信息的猾封,db模塊通過讀取該標(biāo)簽澄耍,設(shè)置對應(yīng)的屬性。二是<sql>標(biāo)簽晌缘,它存放著對應(yīng)的sql查詢語句齐莲,為什么不放在java代碼中呢?我個人感覺是為了分離數(shù)據(jù)庫和業(yè)務(wù)層的直接聯(lián)系磷箕。

  • 2铅搓、開始執(zhí)行映射
    正確配置后,我們來到 com.angroid.autogenerate包中的DojoGene.java文件搀捷,它是一個特殊的java文件,包含main方法多望,也就是獨立于框架運行的嫩舟。運行該java文件,等待執(zhí)行完畢怀偷,你就可以在項目中看到多出一個 src-autogene文件夾家厌,里面含有兩個包,com.angroid.dojocom.angroid.service 椎工, 例如我:
生成后的截圖

這兩個包的文件都是 autogenerate 為我們創(chuàng)建的饭于,例如我上面的表 danmaku對應(yīng)生成的就是Danmaku.java文件蜀踏。 現(xiàn)在看看java文件里面包含什么內(nèi)容:

public class Danmaku implements DojoImpl {

    public Danmaku() {

    }
    public Danmaku(Integer id) {
        this.setId(id);
    }
    
    private boolean byId = false;
    protected Conditions conditions = new Conditions("danmaku");

    protected void byId(){
        if (byId){
            return;
        }
        dojo.byid(this, id, "danmaku");
        byId = true;
    }
    
    public boolean isEmpty(){
        return this.getId() == null;
    }

    public Danmaku order(String order) {
        conditions.order(order);
        return this;
    }

    public Danmaku size(int size) {
        conditions.size(size);
        return this;
    }

    public Danmaku start(int start) {
        conditions.start(start);
        return this;
    }

    public int start() {
        return conditions.start();
    }

    public int size() {
        return conditions.size();
    }

    public String order() {
        return conditions.order();
    }


    public Danmaku get() {
        return dojo.get(this.getClass(), conditions);
    }


    public List<Danmaku> query() {
        return dojo.query(this.getClass(), conditions);
    }

    public Danmaku filter(String filter, Object... values) {
        conditions.add(filter, values);
        return this;
    }

    public Danmaku join(String table, String filter, Object... values) {
        conditions.join(table, filter, values);
        return this;
    }

    public Danmaku set() throws Exception {
        BeanPersistence.insertOrUpdate(this, "danmaku");
        return this;
    }
    
    public Danmaku remove() throws Exception {
        BeanPersistence.remove(this, "danmaku");
        return this;
    }
       private String roomid;

    public String getRoomid(){
        byId();
        return roomid;
    }
    public Danmaku setRoomid(String roomid){
        if(!byId){
            byId = true;
        }
        this.roomid = roomid;
        return this;
    }
    public Danmaku roomidEqual(String roomid){
        conditions.add("roomid = ?", roomid);
        return this;
    }
    public Danmaku roomidNotEqual(String roomid){
        conditions.add("roomid <> ?", roomid);
        return this;
    }
    public Danmaku roomidContain(String roomid){
        conditions.add("roomid like '%'||?||'%'", roomid);
        return this;
    }
    public Danmaku roomidStart(String roomid){
        conditions.add("roomid like ?||'%'", roomid);
        return this;
    }
    public Danmaku roomidEnd(String roomid){
        conditions.add("roomid like '%'||?", roomid);
        return this;
    }
    public Danmaku roomidGreat(String roomid){
        conditions.add("roomid > ?", roomid);
        return this;
    }
    public Danmaku roomidLess(String roomid){
        conditions.add("roomid < ?", roomid);
        return this;
    }
    public Danmaku roomidGreatEqual(String roomid){
        conditions.add("roomid >= ?", roomid);
        return this;
    }
    public Danmaku roomidLessEqual(String roomid){
        conditions.add("roomid <= ?", roomid);
        return this;
    }
    public Danmaku roomidBetween(String start, String end){
        conditions.add("roomid between ? and ?", start, end);
        return this;
    }
    public Danmaku roomidIsNull(){
        conditions.add("roomid is null");
        return this;
    }
    public Danmaku roomidIsNotNull(){
        conditions.add("roomid is not null");
        return this;
    }

        ........省略

從上面java文件可知,他不僅將表中的字段映射到對應(yīng)java類的屬性掰吕,還對于每一個字段封裝了常用的查詢方法果覆。就像如果我想找到 roomid = 45 的表項,我可以這么寫:

Danmaku danmaku = new Danmaku().roomidEqual(45).get();
System.out.println(danmaku.getContent());

其中 get方法的功能是執(zhí)行查詢殖熟,并將查詢結(jié)果封裝成對應(yīng)的java類局待。之后你就可直接用 getContent()獲取彈幕對應(yīng)的內(nèi)容。(這里有坑菱属,現(xiàn)在這么理解就好)

  • 3钳榨、編寫業(yè)務(wù)代碼
    經(jīng)過上面的步驟,剩下的就是開始寫自己的的業(yè)務(wù)代碼了纽门,例如:
package alien.art;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.catalina.connector.Request;

import com.angroid.autogenerate.handler.vericode;
import com.angroid.db.SQLExecutor;
import com.angroid.dojo.Danmaku;
import com.angroid.dojo.Room;

public class test{
    
    public static void main(String[] args) {
        
        //單一結(jié)果查詢
        System.out.println("------------單一結(jié)果查詢-------------");
        Danmaku danmaku = new Danmaku().idEqual(1).get();
        System.out.println(danmaku.getNickname()+ ":" +danmaku.getContent());
        
        //多結(jié)果查詢
        System.out.println("------------多重結(jié)果查詢-------------");
        List<Danmaku> list = new Danmaku().platformEqual("ios").query();
        for(Danmaku demo : list) {
            System.out.println(demo.getNickname()+ ":" + demo.getContent());
        }
    }

}

/* 控制臺結(jié)果顯示:

------------單一結(jié)果查詢-------------
select danmaku.* from `danmaku` where 1=1
and id = ?
[1]
小風(fēng)吹雪中:法師能玩薛耻。不過要確位移的
------------多重結(jié)果查詢-------------
select danmaku.* from `danmaku` where 1=1
and platform = ?
[ios]
小風(fēng)吹雪中:法師能玩。不過要確位移的
找妹子不花錢:這隊友我擦赏陵!意識沒有
絕對不是聲控:怕太乙的
小八咕嚕嚕:饼齿。隊友太不靈性
貧困山區(qū)的漢子:所有英雄的大都能打斷的
仙女爸爸0818:害怕
仙女爸爸0818:我的小妲己不敢玩了
mimimimi失:這是王者局嗎?
呼蘭大俠就是我:王昭君不是有護盾么瘟滨,也可以拉出來候醒??不破
天若有情3774:這英雄不好玩杂瘸!玩李白倒淫!
鵺1314:還是不知道大招是干什么的
絕對不是聲控:不會削多少的
貧困山區(qū)的漢子:大招穿越
....省略
*/

ps:可以思考控制臺打印的那一句sql語句是在哪個模塊打印出來的

對應(yīng)的數(shù)據(jù)是:

數(shù)據(jù)

到此我們直接用到的是 autogeneratedojo 模塊,下一章還會介紹剩余兩個模塊的使用(更加低層實現(xiàn))败玉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末敌土,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子运翼,更是在濱河造成了極大的恐慌返干,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件血淌,死亡現(xiàn)場離奇詭異矩欠,居然都是意外死亡,警方通過查閱死者的電腦和手機悠夯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門癌淮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沦补,你說我怎么就攤上這事乳蓄。” “怎么了夕膀?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵虚倒,是天一觀的道長美侦。 經(jīng)常有香客問我,道長魂奥,這世上最難降的妖魔是什么菠剩? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮捧弃,結(jié)果婚禮上赠叼,老公的妹妹穿的比我還像新娘。我一直安慰自己违霞,他們只是感情好嘴办,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著买鸽,像睡著了一般涧郊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上眼五,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天妆艘,我揣著相機與錄音,去河邊找鬼看幼。 笑死批旺,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诵姜。 我是一名探鬼主播汽煮,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棚唆!你這毒婦竟也來了暇赤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤宵凌,失蹤者是張志新(化名)和其女友劉穎鞋囊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞎惫,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡溜腐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瓜喇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挺益。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖欠橘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情现恼,我是刑警寧澤肃续,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布黍檩,位于F島的核電站,受9級特大地震影響始锚,放射性物質(zhì)發(fā)生泄漏刽酱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一瞧捌、第九天 我趴在偏房一處隱蔽的房頂上張望棵里。 院中可真熱鬧,春花似錦姐呐、人聲如沸殿怜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽头谜。三九已至,卻和暖如春鸠澈,著一層夾襖步出監(jiān)牢的瞬間柱告,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工笑陈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留际度,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓涵妥,卻偏偏與公主長得像乖菱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子妹笆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容