上一篇文章粗略介紹了數(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.dojo
和com.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ù)是:
到此我們直接用到的是 autogenerate
和 dojo
模塊,下一章還會介紹剩余兩個模塊的使用(更加低層實現(xiàn))败玉。