上一篇文章粗略介绍了数据库模块,地址: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.dojo
和com.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语句是在哪个模块打印出来的
对应的数据是:
到此我们直接用到的是 autogenerate
和 dojo
模块,下一章还会介绍剩余两个模块的使用(更加低层实现)。