首先我有三个表 现在的问题只涉及两个表
第一个表:
create table users(
id number(8) primary key,
username varchar(15) unique not null,
password varchar(16) not null,
roleid number(4) unique not null,
CONSTRAINT users_roleid_fk FOREIGN KEY(roleid) REFERENCES role(roleid) ON DELETE CASCADE
);
第二个表:
create table datas(
id number(8),
email varchar(30) unique not null,
school varchar(30),
city varchar(16),
age number(4) check(age between 0 and 200),
sex varchar(4) check(sex in('男','女')),
birthday date,
qq number(20),
telephone varchar(20),
CONSTRAINT datas_id_fk FOREIGN KEY(id) REFERENCES users(id) ON DELETE CASCADE
);
还有一个sequence:
create sequence Counter minvalue 1 nomaxvalue start with 1 increment by 1 nocache;我有一个JDBC java文件,比较长 目前就拿出两个方法 都是添加数据的方法:问题就在此(UserInformation是我的信息封装类,所有信息封装在这个java文件里)
public void addUsers(UserInformation user){
//编写一个添加数据sql语句
String sql = "insert into users values(" + "Counter.Nextval" + ",'" + user.getUsername() + "','" + user.getPassword() + "'," + user.getRoleid() + ")";
try{
int i = stm.executeUpdate(sql);
System.out.println("-----add user-------->" + i) ;
this.conn.commit();
}catch(SQLException e){
e.printStackTrace();
} }
public void addDatas(UserInformation user){
String sql = "insert into datas values(" + "Counter.CURRVAL" + ",'" + user.getEmail() + "','" + user.getSchool() + "','" + user.getCity() + "'," + user.getAge() + ",'" + user.getSex() + "',to_date('" + user.getBirthday() + "','yyyy-mm-dd')," + user.getQq() + "," + user.getTelephone() + ")";
System.out.println("addDatas()---sql---->" + sql) ;
try {
stm.executeUpdate(sql);
this.conn.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
jsp程序就不拿出来了:没什么程序下面是我的servlet文件:只拿出doPost部分
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
UserInformation user = new UserInformation();
user.setUsername(request.getParameter("register_username"));
user.setPassword(request.getParameter("register_password"));
user.setEmail(request.getParameter("register_email"));
user.setSchool(new String(request.getParameter("register_school").getBytes("ISO8859-1"),"GBK"));
user.setCity(new String(request.getParameter("register_school").getBytes("ISO8859-1"),"GBK"));
user.setAge(Integer.parseInt(request.getParameter("register_age")));
user.setSex(new String(request.getParameter("register_sex").getBytes("ISO8859-1"),"GBK"));
user.setBirthday(request.getParameter("register_birthday"));
user.setQq(Integer.parseInt(request.getParameter("register_qq")));
user.setTelephone(request.getParameter("register_telephone"));
user.setRoleid(Integer.parseInt(request.getParameter("register_roleid")));
MyJdbc jdbc = new MyJdbc();
jdbc.addUsers(user);
MyJdbc jdbc1 = new MyJdbc();
jdbc1.addDatas(user);
HttpSession session = request.getSession();
session.setAttribute("username_register", user.getUsername());
request.getRequestDispatcher("myjsptest/register_success.jsp").forward(request, response);
}每次添加的时候 都会出错 提示的意思就是我主表(users)中没有东西 所以外键表(datas)无法添加但是我在dos下select users表 里面有数据 datas中就没有数据 肯定不是数据类型 格式的问题请各位高手讲下 是不是两次添加之间要有间隔?
还有就是 是不是公司中 不用这个方法添加?有什么好方法吗?
第一个表:
create table users(
id number(8) primary key,
username varchar(15) unique not null,
password varchar(16) not null,
roleid number(4) unique not null,
CONSTRAINT users_roleid_fk FOREIGN KEY(roleid) REFERENCES role(roleid) ON DELETE CASCADE
);
第二个表:
create table datas(
id number(8),
email varchar(30) unique not null,
school varchar(30),
city varchar(16),
age number(4) check(age between 0 and 200),
sex varchar(4) check(sex in('男','女')),
birthday date,
qq number(20),
telephone varchar(20),
CONSTRAINT datas_id_fk FOREIGN KEY(id) REFERENCES users(id) ON DELETE CASCADE
);
还有一个sequence:
create sequence Counter minvalue 1 nomaxvalue start with 1 increment by 1 nocache;我有一个JDBC java文件,比较长 目前就拿出两个方法 都是添加数据的方法:问题就在此(UserInformation是我的信息封装类,所有信息封装在这个java文件里)
public void addUsers(UserInformation user){
//编写一个添加数据sql语句
String sql = "insert into users values(" + "Counter.Nextval" + ",'" + user.getUsername() + "','" + user.getPassword() + "'," + user.getRoleid() + ")";
try{
int i = stm.executeUpdate(sql);
System.out.println("-----add user-------->" + i) ;
this.conn.commit();
}catch(SQLException e){
e.printStackTrace();
} }
public void addDatas(UserInformation user){
String sql = "insert into datas values(" + "Counter.CURRVAL" + ",'" + user.getEmail() + "','" + user.getSchool() + "','" + user.getCity() + "'," + user.getAge() + ",'" + user.getSex() + "',to_date('" + user.getBirthday() + "','yyyy-mm-dd')," + user.getQq() + "," + user.getTelephone() + ")";
System.out.println("addDatas()---sql---->" + sql) ;
try {
stm.executeUpdate(sql);
this.conn.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
jsp程序就不拿出来了:没什么程序下面是我的servlet文件:只拿出doPost部分
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
UserInformation user = new UserInformation();
user.setUsername(request.getParameter("register_username"));
user.setPassword(request.getParameter("register_password"));
user.setEmail(request.getParameter("register_email"));
user.setSchool(new String(request.getParameter("register_school").getBytes("ISO8859-1"),"GBK"));
user.setCity(new String(request.getParameter("register_school").getBytes("ISO8859-1"),"GBK"));
user.setAge(Integer.parseInt(request.getParameter("register_age")));
user.setSex(new String(request.getParameter("register_sex").getBytes("ISO8859-1"),"GBK"));
user.setBirthday(request.getParameter("register_birthday"));
user.setQq(Integer.parseInt(request.getParameter("register_qq")));
user.setTelephone(request.getParameter("register_telephone"));
user.setRoleid(Integer.parseInt(request.getParameter("register_roleid")));
MyJdbc jdbc = new MyJdbc();
jdbc.addUsers(user);
MyJdbc jdbc1 = new MyJdbc();
jdbc1.addDatas(user);
HttpSession session = request.getSession();
session.setAttribute("username_register", user.getUsername());
request.getRequestDispatcher("myjsptest/register_success.jsp").forward(request, response);
}每次添加的时候 都会出错 提示的意思就是我主表(users)中没有东西 所以外键表(datas)无法添加但是我在dos下select users表 里面有数据 datas中就没有数据 肯定不是数据类型 格式的问题请各位高手讲下 是不是两次添加之间要有间隔?
还有就是 是不是公司中 不用这个方法添加?有什么好方法吗?
或者是你用到了事务插主表好没提交就开始插外键
你需要修改你的程序:
从建表语句来看,user的username是unique的,你可以考虑执行完user的插入后,把user表的对应这个username的id查出来,作为datas表的id,这样就可以了。
看错了,第二个用的是curval,所以单线程的情况应该是对的。但是多线程的情况会乱串
还有就是: 你主表数据加进去了………… 但是你字表数据的id是主键 但是也不是自动增长 !因为是主表的id ! 你把user给它去添加 它怎么知道主键id是多少呢 …… 如果是hibernate当然可以! 但是只是
jsp+servlet+JDBC 还不能做到 真正的面向对象编程!所以你添加完主表的数据之后需要去查询获得 id号
每次插入users表数据是 sequence就会加1 而datas表中就会取当前值而已
关键是 我的先后顺序就是这样:
MyJdbc jdbc = new MyJdbc();
jdbc.addUsers(user);
MyJdbc jdbc1 = new MyJdbc();
jdbc1.addDatas(user);可能代码的先后不能完全代表电脑执行时就是这样 或者说可能是同时执行 才造成总是报错误 所以求助下高手,在执行时 底层应该是什么样的 是不是真的是因为同时执行了 才错误 应该怎么改!
MyJdbc jdbc = new MyJdbc();
jdbc.addUsers(user);
MyJdbc jdbc1 = new MyJdbc();
jdbc1.addDatas(user);这种操作应该在一个事务中的,不知道LZ为什么要new2次。就目前的代码来看,单线程应该是没问题的,就是不知道你的MyJdbc中是否有其他能影响到sequence的地方
MyJdbc jdbc = new MyJdbc();
jdbc.addUsers(user);
MyJdbc jdbc1 = new MyJdbc();
jdbc1.addDatas(user);
----->>>
MyJdbc jdbc = new MyJdbc();
jdbc.addUsers(user);
jdbc.addDatas(user);
这样试试看。总体看来,你的代码很乱。
把con对象和sql语句混在一个类里面,而且没有看见在哪里关闭stmt和conn。