java连数据库实现登录注册功能
4.0版本
主要不同是应用ArrayList链表 和map表存储信息,将每一个表看成一个list ,每一个属性字段及所属列的值看成一个map 直接对链表 map表进行操作。
版本四是最成熟、最完善的一个,它将所有的类和方法重新编排,在工具类和main类的基础上新增了查询类,登录类,注册类,添加类,也就是说把所有的操作都单独分开,一种操作是一种类。每一张表也新建类,login类里存放着用户账号和密码,Join类里存放着用户的个人信息,用户名,手机号,身份证号,出生年月。LoginInfoOp loginInfoOp=new LoginInfoOp();ArrayList list =loginInfoOp.query(name, “”);那么ArrayList表的类型不再是字符型和对象了,而是类类型。每一张链表的类型就是该类存放的数据。对表的操作还是通过每个类里的方法来实现,要注意方法也应该是ArrayList类型,如:public ArrayList register(String name)。把版本三里的每一个方法根据他的表结构还有增删改查的操作放入操作类里,建立对象直接调用。
类:
Tool 工具类、
LoginInfo 用户账号密码信息类、
LogininfoOP 用户登录类、
Register 用户注册类、
Main 主类、
Tool类:
1、定义全局变量
代码与1.0相同
2、定义工具类的查询方法:
类型为ArrayList<Map<string,object>>的query 1查询方法 ,
新建一个ArrayList<Map<string,object>>的对象list
加载驱动,添加到trycatch里
trycatch 创建数据库连接接口,构件查询器,定义resultset结果集,通过执行SQL语句获取到数据库数据。
重点:
<把resultset结果集转化为list类型
定义ResultSetMetadata的对象通过getMetaData方法获取关于 resultSet 对象中列的类型和属性信息的对象;
:循环查找数据集;
定义整型变量cl使用rsmd的getcolumnCount获取到数据集的列数;
定义一个hash表tempMap,存储属性名和属性值;
对刚刚的列数进行遍历:
定义关键字k通过rsmd对象的getColumnName获取属性名,并转化成string类型;
定义value值通过resultset对象的getObject方法;
在for循环外把tempMap添加到list链表中。
把关闭数据库操作放进去,依次关闭结果集,查询器,连接接口
最后返回list>
public ArrayList<Map<String, Object>> query1 (String sql)
{
ArrayList<Map<String, Object>> list =new ArrayList<Map<String,Object>>();
try {
Class.forName(className);
} catch (ClassNotFoundException e) {
// TODO: handle exception
e.printStackTrace();
}
try {
Connection connection=DriverManager.getConnection(url, user, password);
Statement statement=connection.createStatement();
resultSet=statement.executeQuery(sql);
//resultSet->list
ResultSetMetaData resultSetMetaData=resultSet.getMetaData();
//可用于获取关于 ResultSet 对象中列的类型和属性信息的对象
while(resultSet.next())//查找数据集
{
int cl=resultSetMetaData.getColumnCount();
//得到数据集的列数
Map<String, Object> tempMap=new HashMap<String, Object>();
//定义一个hash表,存储属性名和属性值
for(int i=1;i<=cl;i++)//遍历
{
String k=resultSetMetaData.getColumnName(i).toString();
Object v=resultSet.getObject(i);
tempMap.put(k,v);
}
list.add(tempMap);
}
if(resultSet!=null)
{
resultSet.close();
}
if (statement!=null) {
statement.close();
}
if (connection!=null) {
connection.close();
}
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
}
return list;
}
3、定义工具类的注入方法:
与1.0版本一样
LoginInfo类:
登录注册的数据 name pw 添加getset方法
public class LoginInfo {
//登录 注册的数据 传参方法
private String name;
private String pw;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
}
LoginInfoOp类:
定义 ArrayList 类型的方法query,形参为name,pw:
判断name pw 是否为空 ,是 输出为空 return中止执行
先定义一个ArrayList 类型的list对象,
定义一个SQL语句,where限制条件为1=1;1=1永远是成立的,返回TRUE,条件为真,就相当于select * from table,返回查询表中的所有数据。
判断name 是否为空 不为空 ,连接SQL语句,查询name名;
判断pw 是否为空 不为空 ,连接SQL语句,查询pw名;
重点:
定义Tool工具类对象;
在这里定义一个ArrayList<Map<String, Object>>的listdb链表,获取tool对象里的query1方法进行查询;
遍历listdb里的数据:
<定义一个LoginINfo类型的对象,用来储存值;
定义字段namedb pwdb通过listdb的方法获取对应属性列的数据并转化为string类型;String namedb=listdb.get(0).get(“name”).toString();
通过temp对象的set方法把namedb pwdb 传给temp;>
最后返回list;
public ArrayList<LoginInfo> query(String name,String pw) {
//登录
if(name.equals(""))
{
System.out.println("用户名为空");
return;
}
if (pw.equals("")) {
System.out.println("密码为空");
return;
}
ArrayList<LoginInfo> list =new ArrayList<LoginInfo>();
String sql="select * from data where 1=1";//1=1永远是成立的,返回TRUE,条件为真
//就相当于select * from table,返回查询表中的所有数据。
if(!name.equals(""))
{
sql=sql+" and name='"+name+"' ";
}
if (!pw.equals("")) {
sql=sql+" and password='"+pw+"' ";
}
Tool tool=new Tool();
ArrayList<Map<String, Object>> listdb=tool.query1(sql);
//从数据库获取用户密码表
for(int i=0;i<listdb.size();i++)
{
LoginInfo temp=new LoginInfo();//定义temp对象
//因为LoginOP存储着用户密码信息
String namedb=listdb.get(i).get("name").toString();
String pwdb=listdb.get(i).get("password").toString();
temp.setName(namedb);//LoginOp的temp对象 有getset方法 能传值
temp.setPw(pwdb);
list.add(temp);
}
return list;
}
Register类:
1、register方法:添加到list
定义ArrayList类型的register方法,形参为name:
定义ArrayList的list链表;
定义SQL语句,where 1 = 1;
判断是否为空 不为空 添加SQL语句 加上查询name字段;
重点:
定义Tool工具类对象;
在这里定义一个ArrayList<Map<String, Object>>的listdb链表,获取tool对象里的query1方法进行查询;
遍历listdb里的数据:
<定义一个LoginINfo类型的对象,用来储存值;
定义字段namedb 通过listdb的方法获取对应属性列的数据并转化为string类型;String namedb=listdb.get(0).get(“name”).toString();
通过temp对象的set方法把namedb 传给temp;>
最后返回list;
public ArrayList<LoginInfo> register(String name)
{
ArrayList<LoginInfo> list=new ArrayList<LoginInfo>();
String sql="select * from data where 1=1";
if(!name.equals(""))
{
sql=sql+" and name='"+name+"'";
}
Tool a=new Tool();
ArrayList<Map<String, Object>> listdb=a.query1(sql);
for (int i = 0; i < listdb.size(); i++) {
LoginInfo temp=new LoginInfo();
String namedb=listdb.get(i).get("name").toString();
temp.setName(namedb);
list.add(temp);
}
return list;
}
2、Updata方法:查看是否注入成功
这个方法主要是调用Tool类的update方法,每一张表都有一个查看是否注入成功的方法。
定义整型类型的Updata方法,形参为name,pw;
定义Tool类的对象tool;
编写SQL语句插入用户名密码;
定义整型变量k,获取到tool对象的update方法;
最后返回k;
public int Updata(String name,String pw)
{ Tool a=new Tool();
String sql="insert into data(name,password) values('"+name+"','"+pw+"')";
int k=a.update(sql);
return k;
}
Main类:
1、登录按钮监听:
定义全局变量name 、pw 获取到jtextfield的文本转化成string类型,去掉空格;
定义LoginInfoOp对象;
定义一个ArrayList类型的链表list,获取到logininfoOp对象的query方法,从数据库里查询用户名,传递参数为(name,"");
if判断list如果不为空,list长度大于零时,说明用户存在
定义dbpassword 获取list链表的第一行的数据库的密码,
String dbpassword=list.get(0).getPw();
判断输入的密码和数据库密码是否一样,
一样,登录成功;不一样,登录失败;
if判断不成立 ,登录失败。
LoginInfoOp loginInfoOp=new LoginInfoOp();
ArrayList<LoginInfo> list =loginInfoOp.query(name, "");
//逻辑
if (list!=null&&list.size()>0) {
String dbpassword=list.get(0).getPw();
if(pw.equals(dbpassword))
{
System.out.println("登录成功!");
} else {
System.out.println("登录失败");
}
} else {
System.out.println("用户不存在");
}
2、注册按钮监听:
定义全局变量name 、pw 获取到jtextfield的文本转化成string类型,去掉空格;
定义Register对象register;
定义ArrayList的list链表,获取到register对象的register方法;
if判断list如果不为空,list长度大于零时,说明用户存在,不能注册;
不成立开始执行:
定义整型变量k获取到register对象的Updata方法;
提示注册成功。
Register register =new Register();
ArrayList<LoginInfo> list =register.register(name);
if (list!=null&&list.size()>0) {
System.out.println("用户已存在!");
}
else {
int k=register.Updata(name, pw);
System.out.println("注册成功");
}