注册 登录
编程论坛 J2EE论坛

关于JDBC的插入问题

亮剑 发布于 2007-07-30 08:25, 1442 次点击
"insert into user values(?,?,?,?)";
如果我这句的第一个问号是ID 在数据库端设置成了 主键而且是自增的
我在JDBC中如何来写的 还需要不需要写这个参数 如果不需要我怎么解决这个第一个问号。
15 回复
#2
亮剑2007-07-30 08:36

public void insertUser(User user) throws SQLException {
String sql1 = "insert into user values(?,?,?,?)";
ps = con.prepareStatement(sql1);
user.setId(sum("user")+1);
ps.setInt(1, user.getId());
ps.setString(2, user.getPassword());
ps.setString(3, user.getName());
ps.setString(4, user.getActor());
ps.executeUpdate();

String sql2 = "insert into droit values(?,?)";
PreparedStatement ps1 = con.prepareStatement(sql2);
HashSet<Droit> ls = user.getDroits();
Integer j = sum("droit");
for (Iterator<Droit> it = ls.iterator(); it.hasNext();) {
Droit droit = it.next();
droit.setId(++j);
ps1.setInt(1, droit.getId());
ps1.setString(2, droit.getName());
ps1.executeUpdate();
}

String sql3 = "insert into u_d values(?,?)";
PreparedStatement ps2 = con.prepareStatement(sql3);
ps2.setInt(1, user.getId());
HashSet<Droit> dt = user.getDroits();
for (Iterator<Droit> tt = dt.iterator(); tt.hasNext();) {
Droit droit = tt.next();
ps1.setInt(2, droit.getId());
ps1.executeUpdate();
}

}
这个方法为什么总是抛
Parameter index out of range (1 > number of parameters, which is 0).
这个异常啊

#3
亮剑2007-07-30 08:39

private Integer sum(String table) {
String sql = "select max(id) from " + table;
try {
ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next()){
System.out.println(rs.getInt(1));
return rs.getInt(1);}
} catch (SQLException e) {
e.printStackTrace();
return 0;
}
return 0;

}

#4
Gramary2007-07-30 09:02
先解决你第一个问题``
你的ID是自动生成的话,就把那个问号去掉就可以了,不需要管它
#5
Gramary2007-07-30 09:06
你第二个问题
你用输出语句确定一下,是哪一句报的错`
这样看很郁闷````
#6
亮剑2007-07-30 10:00

程序代码:

package com.chen.dao.jdbc;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;


import com.chen.factory.ConnectionFactory;
import com.chen.pojo.Droit;
import com.chen.pojo.User;


public class UserDao {


    private Connection con;


    private PreparedStatement ps;


    public UserDao() {
        con = ConnectionFactory.getConnection();


    }


    public void deleteUser(Integer id) throws SQLException {
        String sql1 = \"delete from user where id = ?\";
        String sql2 = \"delete from u_d where user_id = ?\";
        ps = con.prepareStatement(sql1);
        ps.setInt(1, id);
        ps.executeUpdate();
        ps = con.prepareStatement(sql2);
        ps.setInt(1, id);
        ps.executeUpdate();
    }


    public User findUserById(Integer id) throws SQLException {
        String sql = \"select user.id,user.name,user.password,user.actor,droit.name \"
                + \"from user,u_d,droit \"
                + \"where user.id=u_d.user_id and droit.id=u_d.droit_id and user.id = ?\";


        ps = con.prepareStatement(sql);
        ps.setInt(1, id);
        ResultSet result = ps.executeQuery();
        User user = new User();
        HashSet<Droit> set = new HashSet<Droit>();
        while (result.next()) {
            user.setId(Integer.parseInt(result.getString(1)));
            user.setName(result.getString(2));
            user.setPassword(result.getString(3));
            user.setActor(result.getString(4));
            Droit droit = new Droit();
            droit.setName(result.getString(5));
            set.add(droit);
        }
        user.setDroits(set);
        return user;
    }


    public User findByName(String name, String psw) throws SQLException {
        String sql = \"select user.id,user.name,user.password,user.actor,droit.name \"
                + \"from user,u_d,droit where user.id=u_d.user_id and \"
                + \"droit.id=u_d.droit_id and user.name = ? and user.password = ?\";
        ps = con.prepareStatement(sql);
        ps.setString(1, name);
        ps.setString(2, psw);
        ResultSet result = ps.executeQuery();
        User user = new User();
        HashSet<Droit> set = new HashSet<Droit>();
        while (result.next()) {
            user.setId(Integer.parseInt(result.getString(1)));
            user.setName(result.getString(2));
            user.setPassword(result.getString(3));
            user.setActor(result.getString(4));
            Droit droit = new Droit();
            droit.setName(result.getString(5));
            set.add(droit);
        }
        user.setDroits(set);
        return user;
    }


    public HashSet findUserByAll() throws SQLException {
        String sql1 = \"select user.id,user.name,user.password,user.actor from user \";
        String sql2 = \"select droit.id,droit.name from u_d,user,droit \"
                + \" where u_d.droit_id=droit.id and u_d.user_id = ?\";


        HashSet<User> users = new HashSet<User>();
        ps = con.prepareStatement(sql1);
        ResultSet rs1 = ps.executeQuery();
        while (rs1.next()) {
            User user = new User();
            user.setId(Integer.parseInt(rs1.getString(1)));
            user.setName(rs1.getString(2));
            user.setPassword(rs1.getString(3));
            user.setActor(rs1.getString(4));
            ps = con.prepareStatement(sql2);
            ps.setLong(1, user.getId());
            ResultSet rs2 = ps.executeQuery();
            HashSet droits = new HashSet();
            while (rs2.next()) {
                Droit droit = new Droit();
                droit.setId(rs2.getInt(1));
                droit.setName(rs2.getString(2));
                droits.add(droit);
            }
            user.setDroits(droits);
            users.add(user);
        }
        return users;


    }


    public void addUser(User user) throws SQLException {
        String sql1 = \"insert into user values(?,?,?,?)\";
        ps = con.prepareStatement(sql1);
        user.setId(sum(\"user\")+1);
        System.out.println(user.getId());
        ps.setInt(1, user.getId());
        ps.setString(2, user.getPassword());
        ps.setString(3, user.getName());
        ps.setString(4, user.getActor());
        ps.executeUpdate();


        String sql2 = \"insert into droit values(?,?)\";
        PreparedStatement ps1 = con.prepareStatement(sql2);
        HashSet<Droit> ls = user.getDroits();
        Integer j = sum(\"droit\");
        for (Iterator<Droit> it = ls.iterator(); it.hasNext();) {
            Droit droit = it.next();
            droit.setId(++j);
            ps1.setInt(1, droit.getId());
            ps1.setString(2, droit.getName());
            ps1.executeUpdate();
        }


         String sql3 = \"insert into u_d values(?,?)\";
         PreparedStatement ps2 = con.prepareStatement(sql3);
         ps2.setInt(1, user.getId());
         HashSet<Droit> dt = user.getDroits();
            for (Iterator<Droit> tt = dt.iterator(); tt.hasNext();) {
                Droit droit = tt.next();
                ps2.setInt(2, droit.getId());
                ps2.executeUpdate();
            }
        
    }


    public void modifyUser(User user) throws SQLException {
        /*
         * String sql1 = \"update user set user_name=?,password = ? where id=?\";
         * String sql2 = \"update user_actor_droit set actor_id = ?,droit_id =?
         * where user_id=?\"; try { ps = con.prepareStatement(sql1);
         * ps.setString(1, user.getName()); ps.setString(2, user.getPassword());
         * ps.setString(3, user.getId()); ps.executeUpdate();
         *
         * ps = con.prepareStatement(sql2); Actor actor = user.getActor(); for
         * (Iterator<Droit> it = actor.getDroit().iterator(); it.hasNext();) {
         * Droit droit = it.next(); ps.setString(1, actor.getId());
         * ps.setString(2, droit.getId()); ps.setString(3, user.getId());
         * ps.executeUpdate(); } } catch (SQLException e) { e.printStackTrace(); }
         */
        String sql1 = \"update user set name=?,password=?,actor=? where id=?\";
        String sql2 = \"update u_d set droit_id =? where user_id=?\";
        ps = con.prepareStatement(sql1);
        ps.setString(1, user.getName());
        ps.setString(2, user.getPassword());
        ps.setString(3, user.getActor());
        ps.setInt(4, user.getId());
        ps.executeUpdate();
        ps = con.prepareStatement(sql2);
        for(Iterator it = user.getDroits().iterator();it.hasNext();){
            Droit droit  = (Droit) it.next();
            ps.setInt(1, droit.getId());
            ps.setInt(2, user.getId());
            ps.executeUpdate();
        }        
    }


    private Integer sum(String table) {
        String sql = \"select max(id) from \" + table;
        try {
            ps = con.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            while (rs.isLast()){
                System.out.println(rs.getInt(1));
                return rs.getInt(1);}
        } catch (SQLException e) {
            e.printStackTrace();
            return 0;
        }
        return 0;


    }


    public boolean close() {
        try {
            ps.close();
            ConnectionFactory.close();
            return true;
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }


    public HashSet findByActor(String actor) throws SQLException {
        HashSet users = new HashSet();
        String sql1 = \"select user.id,user.name,user.password,user.actor from user\";
        String sql2 = \"select droit.id,droit.name from u_d,droit where u_d.droit_id=droit.id and u_d.user_id = ?\";
        ps = con.prepareStatement(sql1);
        ResultSet rs = ps.executeQuery();
        while(rs.next()){
            User user = new User();
            user.setId(rs.getInt(1));
            user.setName(rs.getString(2));
            user.setPassword(rs.getString(3));
            user.setActor(rs.getString(4));
            HashSet<Droit> droits = new HashSet();
            ps = con.prepareStatement(sql2);
            ps.setInt(1, user.getId());
            ResultSet rs2 = ps.executeQuery();
            while(rs2.next()){
                Droit droit = new Droit();
                droit.setId(rs2.getInt(1));
                droit.setName(rs2.getString(2));
                droits.add(droit);
            }
            user.setDroits(droits);
            users.add(user);
        }
        return users;
    }
}

#7
亮剑2007-07-30 10:02
以下是引用Gramary在2007-7-30 9:02:10的发言:
先解决你第一个问题``
你的ID是自动生成的话,就把那个问号去掉就可以了,不需要管它

我把问号去掉 就不能运行了

#8
亮剑2007-07-30 10:03
System.out.println(rs.getInt(1));
你指这条吗 它没有报错啊 它能够成功的返回数据库中的记录条数
#9
千里冰封2007-07-30 10:07
以下是引用亮剑在2007-7-30 10:02:45的发言:

我把问号去掉 就不能运行了

假如你的表中有如下几列

id,name,sex,password,address;

其中id是自动生成的,那么你插入的时候这样写就以了

insert into xxx ([name],[sex],[password],[address]) values(?,?,?,?)

这样就可以了,这样你就可以指定要插入哪几列

#10
Gramary2007-07-30 10:41

你会用断点吗??
用断点来确定是哪句出现错误,你才能改啊` 我现在是不知道你的错误是哪个地方``
#11
susan0019832007-07-30 11:54
这个我知道,
在输入的地方加个空格就行了.
#12
支离破碎2007-07-30 22:19

自动增长就去掉ID,然后加字段列表.

#13
susan0019832007-07-31 09:32
楼主的问题解决了吗?
#14
guoxhvip2007-08-01 15:19

有自动增长列就可以少要个问号了吧

#15
小轩子2007-08-06 18:14
你把问号去掉一个,把需要的字段前面加上去比如
insert into xxx (username,password,address)
values (?,?,?);

把那个自动增长的ID不要加进去。
#16
瞌睡虫虫2007-08-07 20:22

赞成楼上,自动增长的根本不会让你自己去添加啊!

1