一、数据库模块(1)实战

上一篇文章粗略介绍了数据库模块,地址:http://www.jianshu.com/p/f9c1358cce8f

实战

光说不练假把戏,要掌握一个框架,最快的方法还是不断用框架做一些小功能。所以这一章主要利用数据库模块做一个小例子

一、前期准备

首先需要做的是安装一个数据库(目前只支持MySQL和oracle,前者亲测可用),并且创建几张表。下面是我的表对应创建语句:
其次就是把框架和对应的依赖导入项目中。

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
;

这是记录着一个直播间的弹幕的表,字段名对应的名字很好理解,就不介绍了。无视(rid

二、通过数据库表生成对应的java类

这里使用到的模块是 autogenerate

  • 1、配置数据库信息。
    autogenerate 是调用 db模块与数据库通信的,而db又是通过sql.xml文件配置好数据库的地址,用户名,密码等信息。所以我们第一件事就是在com.angroid.service创建sql.xml文件(db模块会默认在com.angroid.service包中读取sql.xml文件,见源码)。文件如下:


     
           
             
    
    
    
        
    


在这份文件中可以看到两个部分,一是 标签,它是存放目标数据库的配置信息的,db模块通过读取该标签,设置对应的属性。二是标签,它存放着对应的sql查询语句,为什么不放在java代码中呢?我个人感觉是为了分离数据库和业务层的直接联系。

  • 2、开始执行映射
    正确配置后,我们来到 com.angroid.autogenerate包中的DojoGene.java文件,它是一个特殊的java文件,包含main方法,也就是独立于框架运行的。运行该java文件,等待执行完毕,你就可以在项目中看到多出一个 src-autogene文件夹,里面含有两个包,com.angroid.dojocom.angroid.service , 例如我:
生成后的截图

这两个包的文件都是 autogenerate 为我们创建的,例如我上面的表 danmaku对应生成的就是Danmaku.java文件。 现在看看java文件里面包含什么内容:

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 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文件可知,他不仅将表中的字段映射到对应java类的属性,还对于每一个字段封装了常用的查询方法。就像如果我想找到 roomid = 45 的表项,我可以这么写:

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

其中 get方法的功能是执行查询,并将查询结果封装成对应的java类。之后你就可直接用 getContent()获取弹幕对应的内容。(这里有坑,现在这么理解就好)

  • 3、编写业务代码
    经过上面的步骤,剩下的就是开始写自己的的业务代码了,例如:
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) {
        
        //单一结果查询
        System.out.println("------------单一结果查询-------------");
        Danmaku danmaku = new Danmaku().idEqual(1).get();
        System.out.println(danmaku.getNickname()+ ":" +danmaku.getContent());
        
        //多结果查询
        System.out.println("------------多重结果查询-------------");
        List list = new Danmaku().platformEqual("ios").query();
        for(Danmaku demo : list) {
            System.out.println(demo.getNickname()+ ":" + demo.getContent());
        }
    }

}

/* 控制台结果显示:

------------单一结果查询-------------
select danmaku.* from `danmaku` where 1=1
and id = ?
[1]
小风吹雪中:法师能玩。不过要确位移的
------------多重结果查询-------------
select danmaku.* from `danmaku` where 1=1
and platform = ?
[ios]
小风吹雪中:法师能玩。不过要确位移的
找妹子不花钱:这队友我擦!意识没有
绝对不是声控:怕太乙的
小八咕噜噜:。队友太不灵性
贫困山区的汉子:所有英雄的大都能打断的
仙女爸爸0818:害怕
仙女爸爸0818:我的小妲己不敢玩了
mimimimi失:这是王者局吗?
呼兰大侠就是我:王昭君不是有护盾么,也可以拉出来??不破
天若有情3774:这英雄不好玩!玩李白!
鵺1314:还是不知道大招是干什么的
绝对不是声控:不会削多少的
贫困山区的汉子:大招穿越
....省略
*/

ps:可以思考控制台打印的那一句sql语句是在哪个模块打印出来的

对应的数据是:

数据

到此我们直接用到的是 autogeneratedojo 模块,下一章还会介绍剩余两个模块的使用(更加低层实现)。

你可能感兴趣的:(一、数据库模块(1)实战)