现在都流行通过外站A账号去登陆B网站,从而为一些懒人用户免去再次注册账号的麻烦
当然,也必须要求此用户用外站A账号登陆本站B之后,重填B的信息,毕竟每个网站的用户信息表的结构是不同的,如果可以允许用户外站A账号登陆,又可以用本站B的账号登陆,那么程序就乱套了。
如果提供绑定服务,在后台的数据处理就多了一步,既要记录外站A账号的信息,又要为此用户建立本站B的账号信息。
举一个简单的例子,首先在数据库中建立3张表外站C用户信息表,本站D用户信息表,C与D的关联表,当然,本站的用户信息表一般是存在,用原来那张即可。
注意:此处的id都是自增列,下面的插入语句不用管这一列。c_d_link除主键外,各项都允许为空。
外键(参照完整性)的设置如下图:
那么在JAVA中把用户绑定信息入库的过程如下:
import java.sql.*;
class Dbcon {
// 此处连接数据库,不再赘述
public static Connection getCon() {
Connection con = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "root";
con = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
}
public class test {
private void go() {
// 假设网页外部请求:外站C的用户名为1,密码为2的信息与本站D的用户名为1,密码为2的信息绑定
String c_username = "1";
String c_password = "2";
String d_username = "1";
String d_password = "2";
// con是用来操作连接的,也就是连接句柄,rs是用来控制查询结果的
Connection con = new Dbcon().getCon();
ResultSet rs = null;
String sql = null;
// 外站C的用户信息验证略去,一般通过调用外站C提供的API来验证,登陆成功之后看看其绑定了没有
// 方法是查C表,是否已经存在这条信息
sql = "select * from c where username='" + c_username + "'";
try {
rs = con.prepareStatement(sql).executeQuery();
if (rs.next()) {
con.close();
} else {
// 如果登陆成功且未绑定,插入本站D的来的用户信息
sql = "INSERT INTO d(d_username,d_password) VALUES ('"
+ d_username + "','" + d_password + "') ";
// 注意:操作数据库的语句Insert into,update与查询数据库的语句select在Java的语句是不同的
// 操作数据库为con.createStatement().execute(sql);
// 查询数据库为rs
// =con.prepareStatement(sql).executeQuery();而且查询结果必须被rs接住
con.createStatement().execute(sql);
sql = "INSERT INTO c(c_username,c_password) VALUES ('"
+ c_username + "','" + c_password + "')";
con.createStatement().execute(sql);
// 用order by id desc命令查询刚刚插入c表的那条记录的id号,select语句嵌套在insert into中了
// limit 1为仅显示1条记录
sql = "insert into c_d_link(c_id) select id as c_id from c order by id desc limit 1;";
con.createStatement().execute(sql);
// 由于c_d_link表还没有插入完,所以用update把空项替换为查询结果
// 这就是c_d_link除主键外,其余各项允许为空的原因
// 首次插入用insert into,没有插入完毕用update
// 判断是否为空要注意是where d_id is null而不是 where
// d_id=null,后者是得不到任何想要的结果的,会出错的
sql = "update c_d_link set d_id=(select id as d_id from d order by id desc limit 1) where d_id is null;";
con.createStatement().execute(sql);
//记得完成所有操作之后关闭数据库的连接哦!人走带门!
con.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}