Java程序连接oracle数据库,并实现注册与登录功能

易错点:

1.运行时出错:ORA-00913: 值过多。
主要是因为程序里的参数个数与oracle 数据库中的表中的参数个数不一致。本程序中我在Oracle中创建的表有三个属性:

create table users(
    id number(7) primary key,
    name varchar2(10) unique,
    password varchar2(8)  not null   
);

但是一般登录都只需要用户输入用户名和密码,所以在下面的注册登录过程中,我将sql语句中的id写死为506。其实也可以让其自动生成id。方法如下:(其中cycle表示循环,cache 表示刷新)

create sequence auto_Id
   increment by 1
   start with 2016001
   minvalue 2016001
   maxvalue 2016999
   cycle
   cache 3

如果是用自动生成的id号,那么下面的程序中main方法里的sql语句需要修改为

String sql = "insert into sxt_users values ( auto_sxtId.nextval, ?, ?)";

2.另外一个容易出错的地方就是关流的时候了

public class JDBCRegister {
    //数据库,只连接一次就好;
    static Connection con = DBUtils.getConnectionOfDB();

    public static void main(String[] args) {
        String sql = "insert into sxt_users values( 506, ?, ?)";
        //输入用户名
        String name = Tools.inputString("请输入用户名》》");
        //判断用户名是否被注册过,使用循环判断
        boolean flag = isOnly(name);
        while(flag == false){
            System.out.println("用户名"+name+"已被注册");
            name = Tools.inputString("请直接登录或重新输入用户名》》");
            flag = isOnly(name);
        }
        //输入密码并使用循环判断
        String password = Tools.inputString("请输入密码》》");
        String regex = ".{6,8}";
        boolean f2 = password.matches(regex);
        while(f2== false){
            System.out.println("输入的密码长度应在6~8位之间");
            password = Tools.inputString("请重新输入密码");
        }
        //会话
        PreparedStatement pstmt = DBUtils.getPreparedStatementOfDB(con, sql);
        //为?填写数据
        try {
            pstmt.setObject(1, name);
            pstmt.setObject(2, password);
            int i = pstmt.executeUpdate();
            if(i>0){
                System.out.println("恭喜你,"+name+"注册成功");
                //跳转到登录界面
                System.out.println("请登录……");
                JDBCLogin.main(args);
            }else{
                System.out.println("注册失败,用户名重复");
            }
        } catch (SQLException e) {
            System.out.println("注册失败,用户名已经存在~~");
        } finally {
            //不是查询语句,不用获得结果集rs,所以也不用关闭它
            DBUtils.closeAll(con, pstmt, null);
        }
    }

    private static boolean isOnly(String name) {
        String sql = "select id from sxt_users where name= ?";
        boolean flag = true;
        PreparedStatement pstmt=null;
        ResultSet rs = null;
        try {
            pstmt = DBUtils.getPreparedStatementOfDB(con, sql);
            pstmt.setObject(1, name);
            //这里要获得结果集,进而判断表中是否存在用户名为name的结果。
            rs = DBUtils.getResultSetOfDB(pstmt);
            if(rs.next()){
                flag = false;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally{
            //con还要接着在主线程里使用,所以不能关;
            DBUtils.closeAll(null, pstmt, rs);
        }
        return flag;
    }
}
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值