⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 database.java

📁 用JAVA写的qq,为qq的跨平台使用提供了可能,一直都很讨厌tencent不为linux提供方便,自己写了一个qq,希望有人继续完善,我现在没空做了
💻 JAVA
字号:
//Database.java
/**
@author Joedan
*/
import java.sql.*;
import java.util.*;

class Database
{
	static final String 数据源 = "JQQDatabase";
	static final String 用户数据表 = "用户数据";
	static final String 用户数据表_用户id字段名 = "id";
	static final String 用户数据表_用户pswd字段名 = "pswd";
	static final String 用户数据表_用户name字段名 = "name";
	static final String 用户所加好友表 = "用户所加好友";
	static final String 用户被加资料表 = "用户被加资料";
	static final String 用户所加好友表_用户id字段名 = "id";
	static final String 用户所加好友表_好友id字段名 = "id2";
	static final String 用户被加资料表_用户id字段名 = "id";
	static final String 用户被加资料表_对方id字段名 = "id2";
	static final Hashtable UserOnLine = new Hashtable();//存放在线用户

	static Enumeration _UserOnLine = UserOnLine.keys();//存放在线用户列表

	static final byte NUM = 10;//每次请求在线用户列表时返回的列表最大长度

	Connection con;
	Statement stmt;
//临时变量
//	Vector vct = new Vector();//不可用,多线程使其出错
	byte bi;
	
	Database()
	{
		try
		{
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
			con = DriverManager.getConnection("jdbc:odbc:" + 数据源, "", "");
			stmt = getStatement();
		}
		catch(Exception e)
		{
			e.printStackTrace();
			System.exit(0);
		}
	}
	Statement getStatement()
	{
		try
		{
			return con.createStatement();
		}
		catch(Exception e)
		{
			e.printStackTrace();
			System.exit(0);
		}
		return null;
	}
	boolean 是否存在(String id)//返回id是否存在
	{
		Statement stmt = getStatement();
		ResultSet rs;
		rs = Query(stmt, "select * from " + 用户数据表 + " where " + 用户数据表_用户id字段名 + " = " + id);
		try
		{
			if (rs.next())
				return true;
		}
		catch(Exception e){}
		return false;
	}
	Enumeration 好友列表(String id)//返回id的好友列表
	{
		Statement stmt = getStatement();
		ResultSet rs;
		Vector vct = new Vector();
		rs = Query(stmt, "select " + 用户所加好友表_好友id字段名 + " from " + 用户所加好友表 + " where " +
		           用户所加好友表_用户id字段名 + " = " + id);
		try
		{
			while(rs.next())
				vct.add(rs.getString(1));
		}
		catch(Exception e){}
		return vct.elements();
	}
	Enumeration 被加列表(String id)//返回哪些用户加id为好友
	{
		Statement stmt = getStatement();
		ResultSet rs;
		Vector vct = new Vector();
		rs = Query(stmt, "select " + 用户被加资料表_对方id字段名 + " from " + 用户被加资料表 + " where " +
		           用户被加资料表_用户id字段名 + " = " + id);
		try
		{
			while(rs.next())
				vct.add(rs.getString(1));
		}
		catch(Exception e){}
		return vct.elements();
	}
	boolean 添加用户(String id, String name, String pswd)//添加新用户
	{
		return Update("insert into " + 用户数据表 + " values(" + id + ", '" + name + "', '" + pswd + "')");
	}
	boolean 添加好友(String id1, String id2)//id1添加id2为好友
	{
		if (Update("insert into " + 用户所加好友表 + " values(" + id1 + ", " + id2 + ")") &&
		    Update("insert into " + 用户被加资料表 + " values(" + id2 + ", " + id1 + ")"))
			return true;
		try
		{
			con.rollback();//可行性等待验证
		}
		catch(Exception e){}
		return false;
	}
	boolean 删除好友(String id1, String id2)//id1删除好友id2
	{
		if (Update("delete from " + 用户所加好友表 + " where " + 用户所加好友表_用户id字段名 + " = " + id1 +
		           "and " + 用户所加好友表_好友id字段名 + " = " + id2) &&
		    Update("delete from " + 用户被加资料表 + " where " + 用户被加资料表_用户id字段名 + " = " + id2 +
		           "and " + 用户被加资料表_对方id字段名 + " = " + id1))
			return true;
		try
		{
			con.rollback();//可行性等待验证
		}
		catch(Exception e){}
		return false;
	}
	void 添加在线用户(String id, String ip, String port)//添加在线用户
	{
		UserOnLine.put(id, ip + "," + port);
	}
	void 删除在线用户(String id)//删除在线用户
	{
		UserOnLine.remove(id);
	}
	Enumeration 在线用户列表()//获取在线用户列表
	{
		if (UserOnLine.size() < NUM)
			return UserOnLine.keys();
		Vector vct = new Vector();
		for (bi = 0; _UserOnLine.hasMoreElements() && bi < NUM; bi++)//提取NUM个在线用户,start
			vct.add(_UserOnLine.nextElement());
		if (bi < NUM)
		{
			_UserOnLine = UserOnLine.keys();//很慢
			for (; _UserOnLine.hasMoreElements() && bi < NUM; bi++)
				vct.add(_UserOnLine.nextElement());
		}//提取NUM个在线用户,end
		return vct.elements();
	}
	boolean 修改密码(String id, String pswd)//修改密码
	{
		return Update("update " + 用户数据表 + " set " + 用户数据表_用户pswd字段名 + " = '" + pswd + "' where " +
		              用户数据表_用户id字段名 + " = " + id);
	}
	boolean 修改用户名(String id, String name)//修改用户名
	{
		return Update("update " + 用户数据表 + " set " + 用户数据表_用户name字段名 + " = '" + name + "' where " +
		              用户数据表_用户id字段名 + " = " + id);
	}
	boolean 是否在线(String id)//返回id是否在线
	{
		return UserOnLine.containsKey(id);
	}
	String 获取用户名(String id)//返回id的用户名
	{
		Statement stmt = getStatement();
		ResultSet rs;
		rs = Query(stmt, "select " + 用户数据表_用户name字段名 + " from " + 用户数据表 + " where " +
		           用户数据表_用户id字段名 + " = " + id);
		try
		{
			if (rs.next())
				return rs.getString(1);
		}
		catch(Exception e){}
		return null;
	}
	String 获取在线用户的地址(String id)//返回在线id的ip和port;格式:ip,port
	{
		return (String)UserOnLine.get(id);
	}

	synchronized ResultSet Query(Statement stmt, String sql)
	{
提示(sql);
		try
		{
			if (con.isClosed())//这里和Update()混起来可能会有问题
			{
				con = DriverManager.getConnection("jdbc:odbc:" + 数据源, "", "");
				stmt = con.createStatement();
			}
			return stmt.executeQuery(sql);
		}
		catch(Exception e)
		{
			return null;
		}
	}
	synchronized boolean Update(String sql)
	{
/*
		try
		{
			return stmt.executeUpdate(sql) > 0;
		}
		catch(Exception e)
		{
			return false;
		}
*/
//数据更新到数据库的问题等待解决
		try
		{
			return stmt.executeUpdate(sql) > 0 && refresh();
		}
		catch(Exception e)
		{
			return false;
		}
	}
	boolean refresh()//数据更新到数据库的问题等待解决
	{
		try
		{
			con.close();
			con = DriverManager.getConnection("jdbc:odbc:" + 数据源, "", "");
			stmt = getStatement();
			return true;
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return false;
		}
	}
	static void 提示(String s)
	{
		System.out.println(s);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -