Java MYSQL JDBC错误

Java MYSQL JDBC错误,java,mysql,jdbc,Java,Mysql,Jdbc,这是一个简单的程序,我使用jdbc和sql在数据库中创建了两个表 Connection con=null; try { Class.forName("com.mysql.jdbc.Driver"); con=DriverManager.getConnection("jdbc:mysql://localhost:3306/","root","root"); try { Statement st=con.createStatement(); st.executeUpdate("CREATE DATA

这是一个简单的程序,我使用jdbc和sql在数据库中创建了两个表

Connection con=null;
try
{
Class.forName("com.mysql.jdbc.Driver");
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/","root","root");
try
{
Statement st=con.createStatement();
st.executeUpdate("CREATE DATABASE IF NOT EXISTS ARCPAGE");
st.executeUpdate("USE ARCPAGE");
st.executeUpdate("CREATE TABLE IF NOT EXISTS User(user_id integer NOT NULL AUTO_INCREMENT,user_name varchar(20) NOT NULL,user_pass varchar(20) NOT NULL,PRIMARY KEY (user_id))");
st.executeUpdate("CREATE TABLE IF NOT EXISTS Usermap(user_name varchar(20) NOT NULL,role_name varchar(20) NOT NULL)");
ResultSet res=st.executeQuery("SELECT * FROM USER");
res.next();
ResultSet resmap=st.executeQuery("SELECT * FROM USERMAP WHERE USER_NAME='"+res.getString("user_name")+"'");
/*error line */ res.next();
resmap=st.executeQuery("SELECT * FROM USERMAP WHERE USER_NAME='"+res.getString("user_name")+"'");
}
catch(SQLException e)
{
    System.out.println("SQL ERROR");
}
}
catch(Exception e)
{
    System.out.println("ERROR");
}
在执行代码时,我从catch块中得到一个“SQL错误”。在进一步的调查中,我发现错误来自我标记的/ERROR行/。我做错了什么

-克丽珊

关于e.printstacktrace()

java.sql.SQLException:结果集关闭后不允许操作
位于com.mysql.jdbc.ResultSet.checkClosed(ResultSet.java:652)
位于com.mysql.jdbc.ResultSet.next(ResultSet.java:5942)
trees.TreeBean.(TreeBean.java:51)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(未知源)
位于sun.reflect.delegatingConstructor或AccessorImpl.newInstance(未知源)
位于java.lang.reflect.Constructor.newInstance(未知源)
位于java.lang.Class.newInstance0(未知源)
位于java.lang.Class.newInstance(未知源)
位于com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:184)
位于com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:98)
在com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:405)上
在com.sun.faces.mgbean.BeanManager.create(BeanManager.java:265)上
位于com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:191)
位于com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:73)
在javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
位于com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:71)
位于org.apache.el.parser.astiIdentifier.getValue(astiIdentifier.java:69)
位于org.apache.el.parser.AstValue.getValue(AstValue.java:112)
在org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
位于com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:106)
位于javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:190)
位于javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:178)
位于javax.faces.component.UIOutput.getValue(UIOutput.java:164)
位于org.primefaces.util.ComponentUtils.getStringValueToRender(ComponentUtils.java:61)
位于org.primefaces.component.inputtext.inputExtrender.encodeMarkup(inputExtrender.java:86)
位于org.primefaces.component.inputtext.inputExtrender.encodeEnd(inputExtrender.java:53)
位于javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:879)
位于com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:308)
位于com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:181)
位于com.sun.faces.renderkit.html_basic.GridRenderer.encodechildrender(GridRenderer.java:125)
位于javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:849)
位于javax.faces.component.UIComponent.encodeAll(UIComponent.java:1643)
位于javax.faces.render.Renderer.encodeChildren(Renderer.java:164)
位于javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:849)
位于javax.faces.component.UIComponent.encodeAll(UIComponent.java:1643)
位于javax.faces.component.UIComponent.encodeAll(UIComponent.java:1646)
位于javax.faces.component.UIComponent.encodeAll(UIComponent.java:1646)
位于javax.faces.component.UIComponent.encodeAll(UIComponent.java:1646)
位于org.primefaces.component.tabview.TabViewRenderer.encodeContents(TabViewRenderer.java:180)
位于org.primefaces.component.tabview.TabViewRenderer.encodeMarkup(TabViewRenderer.java:120)
位于org.primefaces.component.tabview.TabViewRenderer.encodeEnd(TabViewRenderer.java:61)
位于javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:879)
位于javax.faces.component.UIComponent.encodeAll(UIComponent.java:1650)
位于javax.faces.component.UIComponent.encodeAll(UIComponent.java:1646)
位于javax.faces.component.UIComponent.encodeAll(UIComponent.java:1646)
在com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:389)
位于com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:127)
位于com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:117)
位于com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
在com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:135)上
位于javax.faces.webapp.FacesServlet.service(FacesServlet.java:309)
位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
位于org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
位于org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
位于org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
位于org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
位于org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
位于org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
位于org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
位于org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
位于org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
位于java.lang.Thread.run(未知源)
用户表没有任何数据。因此,在调用
res.next()
pelase之前,请检查它是否有一些数据,如
if(res.hasNext()){…}

已编辑

为您的案例提出的解决方案

ResultSet res=st.executeQuery("SELECT * FROM USER");
while( !res.next() )
{
    String sql = "SELECT * FROM USERMAP WHERE USER_NAME=?"
    PreparedStatement ps = con.prepareStatement(sql);
    // put parameters
    setString( 1, res.getString('user_name') );
    ResultSet resmap=st.executeQuery();
    ....
    do work with resmap
    ....
    resmap.close();
}
res.close();
更好的SQL也可以让它变得更简单

我们可以使用

ResultSet resmap=st.executeQuery(
              "SELECT m.* FROM USER u, USERMAP m WHERE u.user_name = m.user_name");
while( !res.next() )
{
    ...
}
resmap.close();

这样,您只创建一个结果集并获得所需的结果。

此代码有很多错误:

  • 首选准备好的报表
    ResultSet res=st.executeQuery("SELECT * FROM USER");
    while( !res.next() )
    {
        String sql = "SELECT * FROM USERMAP WHERE USER_NAME=?"
        PreparedStatement ps = con.prepareStatement(sql);
        // put parameters
        setString( 1, res.getString('user_name') );
        ResultSet resmap=st.executeQuery();
        ....
        do work with resmap
        ....
        resmap.close();
    }
    res.close();
    
    ResultSet resmap=st.executeQuery(
                  "SELECT m.* FROM USER u, USERMAP m WHERE u.user_name = m.user_name");
    while( !res.next() )
    {
        ...
    }
    resmap.close();
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.LinkedHashMap;
    import java.util.Map;
    
    
    public class SqlDemo {
    
        private static final String SELECT_USER_ROLE_SQL =
                "SELECT m.user_name, m.user_role " +
                "FROM User as u " +
                "JOIN Usermap as m" +
                "ON u.user_name = m.user_name ";
    
        public Map<String, String> getAllUserRoles(Connection connection) {
            Map<String, String> userRoles = new LinkedHashMap<String, String>();
    
            PreparedStatement ps = null;
            ResultSet rs = null;
    
            try {
                ps = connection.prepareStatement(SELECT_USER_ROLE_SQL);
                rs = ps.executeQuery();
                while (rs.next()) {
                    String user = rs.getString("user_name");
                    String role = rs.getString("user_role");
                    userRoles.put(user, role);
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            finally {
                close(rs);
                close(ps);
            }
    
            return userRoles;
        }
    
        private static void close(ResultSet rs) {
            try {
                if (rs != null) rs.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        private static void close(Statement st) {
            try {
                if (st != null) st.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }