preparedStatement.executeUpdate语句不能执行

public boolean updateStaff(Staff staff) {
try {
if (connection == null) {
connection = ConnectionFactory.getConnection();
}
String sql = "update staff set staff_name=?,staff_auth=? where staff_id=?";
PreparedStatement preparedStatement = connection
.prepareStatement(sql);

        preparedStatement.setString(1, staff.getStaffName());
        preparedStatement.setString(2, staff.getStaffAuth());
        preparedStatement.setInt(3, staff.getStaffId());
        int row = preparedStatement.executeUpdate();
        if (row >= 1) {
            return true;
        } else {
            return false;
        }

    } catch (Exception e) {
        e.printStackTrace();
        return false;
    } finally {
        ConnectionFactory.closeConnection(connection);
    }
}

调用:
Staff staff = new Staff();
staff.setStaffId(123);
staff.setStaffName("2");
staff.setStaffAuth("gh");
StaffDaoImpl staffDaoImpl = new StaffDaoImpl();
boolean i = staffDaoImpl.updateStaff(staff);
System.out.println(i);


不报错,参数都能正常传送,执行了preparedStatement.executeUpdate();返回0,不知道哪里有问题,各位大神帮帮忙啊

6个回答

该方法用于在此PreparedStatement对象中执行SQL语句,该语句必须是一个数据操作语句,如INSERT、UPDATE、DELETE,或者是无返回内容的SQL语句。

语法  executeUpdate() 

示例  下面的代码利用executeUpdate方法向数据库插入一条记录。
Connection conn = ……      //省略部分代码
String sql = "INSERT INTO users(username,pwd) VALUES ("lisi","123456")";
PreparedStatement ps = conn.prepareStatement(sql);
int i =ps.executeUpdate();     //执行
System.out.println(i);      //成功插入记录,打印1

这是我百度的,说明你代码没有问题,应该是逻辑有问题,你的sql应该有问题!!!更新有问题是不报错误的,这点要注意,
看看你的字段啥的都匹配好了么,插入都写对了吗

lycorisradiata_1
lycorisradiata_1 用命令行将SQL语句复制到数据库中,是可以执行的;这样sql语句还是会有问题吗
4 年多之前 回复

你这样把sql语句写死,把你数据库里的值,你直接写在代码里,看看能执行吗

String sql = "update staff set staff_name=?,staff_auth=? where staff_id=?";

问号直接写数据,下面不插入,直接执行,看看返回1么

lycorisradiata_1
lycorisradiata_1 直接赋值,可以返回1,正确执行了。上面的语句哪里出错了吗,参数插不进去?
4 年多之前 回复

碰到同样的问题。
而且非常明显:setString(1,"xxx") 和 setString(1,"xxx "),两者的差别是空格。有没有空格效果不一样,必须将参数填充空格到字段所需的长度。

但这样对编程是很麻烦的,我总不能老关注字段的长度。

各位大咖有没有解决办法?

我也遇到了同样的问题,请问这个解决了没?

preparedstatement.executeUpdate()不需要返回值

lycorisradiata_1
lycorisradiata_1 把返回值得部分去掉,还是不能执行。数据库里的数据根本变动不了
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于preparedstatement.executeUpdate方法
我在自己写一个JDBC工具类。但卡在了update方法的实现。工具类目前的代码如下: public final class HDBTools { // 数据库url,username,password private static String URL = "jdbc:mysql://localhost:3306/shiyan?" + "useUnicode=true&characterEncoding=UTF8"; private static String URN = "root"; private static String PSW = "root"; private static HDBTools hdb = null; private HDBTools(){} // 单例模式 public static HDBTools getHDBTools() { // 延迟加载 if (hdb == null) { // 双重锁,防止多个线程同时访问 synchronized (HDBTools.class) { // 双重锁,调度程序的偶然情况 if (hdb == null) { hdb = new HDBTools(); } } } return hdb; } // 静态代码块 static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } // 链接 private Connection conn = null; // 结果集 private ResultSet resultSet = null; // 语句 private PreparedStatement preparedstatement = null; //get the connection of database private Connection getConn() throws SQLException { return DriverManager.getConnection(URL, URN, PSW); } public List<Map<String,Object>> findAll(String sql,Object[] objs) throws SQLException{ List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); conn = getConn(); preparedstatement = (PreparedStatement) conn.prepareStatement(sql); for(int i = 0;i<objs.length;i++){ preparedstatement.setObject(i+1, objs[i]); } resultSet = (ResultSet) preparedstatement.executeQuery(); ResultSetMetaData rsmd = preparedstatement.getMetaData(); // 取得结果集列数 int columnCount = rsmd.getColumnCount(); Map<String, Object> data = null; while(resultSet.next()){ data = new HashMap<String, Object>(); // 每循环一条将列名和列值存入Map for (int i = 1; i < columnCount; i++) { data.put(rsmd.getColumnLabel(i), resultSet.getObject(rsmd.getColumnLabel(i))); } // 将整条数据的Map存入到List中 list.add(data); } close(resultSet, preparedstatement, conn); return list; } public int update(String sql,Object[] objs) throws SQLException{ conn = getConn(); preparedstatement = (PreparedStatement) conn.prepareStatement(sql); for(int i = 0;i<objs.length;i++){ preparedstatement.setObject(i+1, objs[i]); } System.out.println(preparedstatement); int rows = preparedstatement.executeUpdate(sql); close(resultSet, preparedstatement, conn); return rows; } public void close(ResultSet rs, PreparedStatement pst, Connection conn) { try { if (rs != null) { rs.close(); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (pst != null) { pst.close(); } } catch (SQLException e) { e.printStackTrace(); } finally { if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } } } 测试代码如下: HDBTools hdbt = HDBTools.getHDBTools(); int i = hdbt.update("insert into stu (name,address,money) values (?,?,?)", new Object[]{"hanshuai","changchun",10000}); System.out.println(i); 运行测试代码,预处理完成的SQL语句以及出现的异常如下: com.mysql.jdbc.PreparedStatement@14b2db7: insert into stu (name,address,money) values ('hanshuai','changchun',10000) Exception in thread "main" com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?,?,?)' at line 1 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2941) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715) at com.mysql.jdbc.Connection.execSQL(Connection.java:3243) at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1343) at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1260) at com.shuai.utils.jdbc.HDBTools.update(HDBTools.java:101) at com.shuai.utils.jdbc.Demo.main(Demo.java:12) 异常说,我的SQL 语句有问题,但是我将预处理后的SQL语句输出到控制台(见控制台结果第一行),将控制台SQL语句拷贝到SQL yang 中,运行数据添加成功。也就是说SQL语句没有问题。我感觉是我对preparedstatement.executeUpdate方法的理解出现了问题。希望各路大神不吝赐教。
executeUpdate()执行不了
jdbc连接数据库,执行到executeUpdate()时就一直没反应,试过输出语句,在此前可以输出,此后就没反应了,代码如下: public static boolean insert(int id, String pwd, String name, String phone, String email){ boolean flag = false; Connection conn = null; PreparedStatement prep = null; try { conn = DriverManager.getConnection(url, dbUser, dbPassword); String sql = "insert into user_001(id,password,name,phone,email) " + "values(?,?,?,?,?)"; prep = conn.prepareStatement(sql); prep.setInt(1, id); prep.setString(2, pwd); prep.setString(3, name); prep.setString(4, phone); prep.setString(5, email); System.out.println("before n"); int n = prep.executeUpdate(); System.out.println("n:" + n); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(prep != null){ try { prep.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(conn != null){ try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return flag; }
请指教,很急,谢谢
源文件: import java.lang.reflect.Method; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.HashMap; import java.util.Map; import com.sty.hibernate.model.Student; public class Session { // ping sql 需要这些配置方法,但成员变量中不能有语句,所以写一个构造方法 String tableName = "_student"; Map<String,String> cfs=new HashMap<String,String>();//为什么用map字段名与属性名一一对应 // 因为?中有int和string的类型,插入数据的方法不统一,所以采用了hibernate的反射机制,即下面的 String[] methodName;//某个属性对应的调用某个方法名,然后存到字符数组里;String[] methordName=new String[cfs.size()]; //放在这是错误的,因为还没初始化 public Session(){ cfs.put("_id", "id");//数据库中的_id对应属性id cfs.put("_name", "name"); cfs.put("_age", "age"); methodName=new String[cfs.size()]; } //这样当调用craateSQL时map、tableName中就有值了 public void save(Student s) throws Exception { // String TableName = "_Student"; // Map<String,String> cfs=new HashMap<String,String>();//为什么用map字段名与属性名一一对应 // cfs.put("_id", "id");//数据库中的_id对应属性id // cfs.put("_name", "name"); // cfs.put("_age", "age"); // 此部分应该写在配置文件里 String sql=createSQL(); Class.forName("com.mysql.jdbc.Driver"); Connection conn=DriverManager.getConnection("jdbc:mysql://localhost/hibernate","root","sty"); PreparedStatement ps=conn.prepareStatement(sql); for(int i=0;i<methodName.length;i++){//先拿到方法,然后执行方法,然后执行返回结果,再将其结果添加到?中去 Method m=s.getClass().getMethod(methodName[i]);//getClass()先拿到student类,getMethod(mName)将method的名字传入 Class r=m.getReturnType();//获取返回的class类型 System.out.println(r.getName()+"|"+m.getName()); if(r.getName().equals("java.lang.String")){ String returnValue=(String)m.invoke(s);//m.invoke(obj, args)因为没有参数所以省略args;m.invoke(s)返回的是object类型 ps.setString(i+1, returnValue); } if(r.getName().equals("int")){ Integer returnValue=(Integer)m.invoke(s);//m.invoke(obj, args)因为没有参数所以省略args;m.invoke(s)返回的是object类型 ps.setInt(i+1, returnValue); } } ps.executeUpdate(); ps.close(); conn.close(); } private String createSQL() { String str1=""; int index =0;//循环变量 for(String s:cfs.keySet()){ String v=cfs.get(s);//获取cfs.put("_id", "id");中value的值,即id v=Character.toUpperCase(v.charAt(0))+v.substring(1);//方法名的首字母改为大写 methodName[index]="get"+v; str1+=s+","; index++; } str1=str1.substring(0,str1.length()-1); String str2=""; for(int i=0;i<cfs.size();i++){ str2+="?,"; } str2 = str2.substring(0,str2.length()-1); String sql="insert into"+tableName+"("+str1+")"+"values ("+str2+")"; return sql; } } 问题提示: int|getId int|getAge java.lang.String|getName Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'hibernate.into_student' doesn't exist at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) at com.mysql.jdbc.Util.getInstance(Util.java:384) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3566) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3498) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2113) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2409) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2327) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2312) at Session.save(Session.java:60) at StudentTest.main(StudentTest.java:11) 不知道是什么原因,谢谢 数据库是MySQL,其他配置正常
hibernate mysql 报错 简单问题
[code="java"] Hibernate: update tb_news_radio set state='审核否决', shenhe_name='admin', shenhe_time=now() where id=135 2012-02-05 12:31:08,984 [http-5000-1] ERROR org.hibernate.util.JDBCExceptionReporter - Data truncation: Data truncated for column 'shenhe_time' at row 1 org.hibernate.exception.DataException: could not execute update query at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:100) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.hql.ast.exec.BasicExecutor.execute(BasicExecutor.java:107) at org.hibernate.hql.ast.QueryTranslatorImpl.executeUpdate(QueryTranslatorImpl.java:419) at org.hibernate.engine.query.HQLQueryPlan.performExecuteUpdate(HQLQueryPlan.java:283) at org.hibernate.impl.SessionImpl.executeUpdate(SessionImpl.java:1168) at org.hibernate.impl.QueryImpl.executeUpdate(QueryImpl.java:117) at com.acec.house.service.admin.AdminManager.shipinPass(AdminManager.java:442) at com.acec.house.service.admin.AdminManager$$FastClassByCGLIB$$c5f9ca65.invoke(<generated>) at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149) at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:700) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635) at com.acec.house.service.admin.AdminManager$$EnhancerByCGLIB$$2536b346.shipinPass(<generated>) at com.acec.house.actions.admin.AdminAction.shipinPass(AdminAction.java:1002) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:440) at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:279) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242) at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:163) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:249) at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:148) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:93) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:128) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:104) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:148) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:128) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:468) at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:76) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Unknown Source) Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data truncated for column 'shenhe_time' at row 1 at com.mysql.jdbc.SQLError.convertShowWarningsToSQLWarnings(SQLError.java:717) at com.mysql.jdbc.MysqlIO.scanForAndThrowDataTruncation(MysqlIO.java:3031) at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1241) at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:685) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1400) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1314) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1299) at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:102) at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:102) at org.hibernate.hql.ast.exec.BasicExecutor.execute(BasicExecutor.java:98) ... 87 more 报这个错。我在数据库直接执行sql语句可以执行。 public void shipinPass(Integer id, String pass, String userName) { if(pass.equals("true")) manager.createQuery("update NewsRadioEO set state='审核通过',shenheName='"+userName+"',shenheTime=now() where id="+id).executeUpdate(); else manager.createQuery("update NewsRadioEO set state='审核否决',shenheName='"+userName+"',shenheTime=now() where id="+id).executeUpdate(); } 这样却不行了,我把shenheTime=now() 改成shenheTime='2012-05-05'却可以执行 求指导 [/code]
java.sql.SQLException错误
运行StuDialog.class出现下面错误提示,初学Java请求帮助找出下面是什么原因? java.sql.SQLException: No value specified for parameter 2 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929) at com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2560) at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2536) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2383) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2327) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2312) at com.studentmanager.StuAddDialog.actionPerformed(StuAddDialog.java:109) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:6216) at javax.swing.JComponent.processMouseEvent(JComponent.java:3265) at java.awt.Component.processEvent(Component.java:5981) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4583) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4413) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2475) at java.awt.Component.dispatchEvent(Component.java:4413) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:178) at java.awt.Dialog$1.run(Dialog.java:1051) at java.awt.Dialog$3.run(Dialog.java:1103) at java.security.AccessController.doPrivileged(Native Method) at java.awt.Dialog.show(Dialog.java:1101) at java.awt.Component.show(Component.java:1516) at java.awt.Component.setVisible(Component.java:1468) at java.awt.Window.setVisible(Window.java:841) at java.awt.Dialog.setVisible(Dialog.java:991) at com.studentmanager.StuAddDialog.<init>(StuAddDialog.java:73) at com.studentmanager.StuDialog.actionPerformed(StuDialog.java:109) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:6216) at javax.swing.JComponent.processMouseEvent(JComponent.java:3265) at java.awt.Component.processEvent(Component.java:5981) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4583) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4413) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2475) at java.awt.Component.dispatchEvent(Component.java:4413) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 1、StuDialog.class如下: package com.studentmanager; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Vector; public class StuDialog extends JFrame implements ActionListener{ //定义一些控件 JPanel jp1,jp2; JLabel jl1; JButton jb1,jb2,jb3,jb4; JTable jt; JScrollPane jsp; JTextField jtf; public static void main(String[] args) { // TODO Auto-generated method stub StuDialog stuDialog=new StuDialog(); } public StuDialog() { jp1=new JPanel(); jtf=new JTextField(10); jb1=new JButton("查询"); jb1.addActionListener(this); jl1=new JLabel("请输入名字"); //把各个控件加入到jp1 jp1.add(jl1); jp1.add(jtf); jp1.add(jb1); jp2=new JPanel(); jb2=new JButton("添加"); jb2.addActionListener(this); jb3=new JButton("修改"); jb4=new JButton("删除"); //把各个按钮就加入到jp2 jp2.add(jb2); jp2.add(jb3); jp2.add(jb4); /*//rowData可以存放多行 Vector hang=new Vector(); hang.add("sp001"); hang.add("孙悟空"); hang.add("男"); hang.add("25"); hang.add("火锅山"); hang.add("少林派"); //加入到rowData rowData.add(hang);*/ //创建一个数据模型对象 StuModel sm=new StuModel(); //初始化JTable jt=new JTable(sm); //初始化Jsp JScrollPane jsp=new JScrollPane(jt); //把jsp放入JFrame this.add(jsp); this.add(jp1,"North"); this.add(jp2,"South"); this.setSize(400,300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub //判断是哪个按钮被点击 if(e.getSource()==jb1) { System.out.println("用户想查询"); //因为把表的现实的数据封装到StuModel中,那么我们就可以 //简单完成查询 //查询数据库,更新JTable String name=this.jtf.getText().trim(); //写一个SQL语句 String sql="select * from stu where stuName='"+name+"'"; //构建新的数据模型,并更新 StuModel sm=new StuModel(sql); //更新JTable jt.setModel(sm); //当用户点击添加 } else if(e.getSource()==jb2) { StuAddDialog sa=new StuAddDialog(this,"添加学生",true); //重新再获得新的数据模型 } } } 2、StuAddDialog.class如下: package com.studentmanager; import java.awt.*; import javax.swing.*; import java.util.*; import java.awt.event.*; import javax.swing.JDialog; import java.sql.*; public class StuAddDialog extends JDialog implements ActionListener { //定义我需要的swing控件 JPanel jp1,jp2,jp3; JTextField jtf1,jtf2,jtf3,jtf4,jtf5,jtf6; JButton jb1,jb2; JLabel jl1,jl2,jl3,jl4,jl5,jl6; //owner 它的父窗口 //title窗口名 //model指定是模式窗口,还是非模式窗口 public StuAddDialog(Frame owner,String title,boolean modal) { super(owner,title,modal);//调用父类构造方法,达到模式对话框效果 jl1=new JLabel("学号"); jl2=new JLabel("姓名"); jl3=new JLabel("性别"); jl4=new JLabel("年龄"); jl5=new JLabel("籍贯"); jl6=new JLabel("系别"); jtf1=new JTextField(); jtf2=new JTextField(); jtf3=new JTextField(); jtf4=new JTextField(); jtf5=new JTextField(); jtf6=new JTextField(); jb1=new JButton("添加"); jb1.addActionListener(this); jb2=new JButton("取消"); jp1=new JPanel(); jp2=new JPanel(); jp3=new JPanel(); //设置布局 jp1.setLayout(new GridLayout(6,1)); jp2.setLayout(new GridLayout(6,1)); jp1.add(jl1); jp1.add(jl2); jp1.add(jl3); jp1.add(jl4); jp1.add(jl5); jp1.add(jl6); jp2.add(jtf1); jp2.add(jtf2); jp2.add(jtf3); jp2.add(jtf4); jp2.add(jtf5); jp2.add(jtf6); jp3.add(jb1); jp3.add(jb2); this.add(jp1,BorderLayout.WEST); this.add(jp2,BorderLayout.CENTER); this.add(jp3,BorderLayout.SOUTH); jb1.addActionListener(this); //展现 this.setSize(300,250); //this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } public void actionPerformed(ActionEvent e) { if(e.getSource()==jb1) { //对用户点击添加按钮后的响应动作 //连接数据库 Connection ct=null; Statement stmt=null; ResultSet rs=null; PreparedStatement psmt=null; //连接数据库,判断用户是否合法 try{ //1加载驱动 Class.forName("com.mysql.jdbc.Driver"); //2创建连接对象,注册驱动程序并打开连接对象 ct=DriverManager.getConnection("jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=GBK","root","123456"); psmt=ct.prepareStatement("select * from stu"); //3获取语句对象 //stmt=ct.createStatement(); //与编译语句对象 psmt=ct.prepareStatement("insert into stu values(?,?,?,?,?,?)"); //给参数赋值 psmt.setString(1,jtf1.getText()); psmt.setString(1,jtf2.getText()); psmt.setString(1,jtf3.getText()); psmt.setString(1,jtf4.getText()); psmt.setString(1,jtf5.getText()); psmt.setString(1,jtf6.getText()); //4执行操作 psmt.executeUpdate(); this.dispose();//关闭对话框 }catch(ClassNotFoundException e1) { e1.printStackTrace(); }catch(SQLException e2) { e2.printStackTrace(); } finally { //释放语句对象,连接对象 try { if(rs!=null) rs.close(); if(stmt!=null) stmt.close(); if(ct!=null) ct.close(); }catch(Exception e2) { e2.printStackTrace(); } } } } @Override public Container getContentPane() { // TODO Auto-generated method stub return super.getContentPane(); } @Override public void setContentPane(Container contentPane) { // TODO Auto-generated method stub super.setContentPane(contentPane); } }
saveOrUpdate为什么不能智能处理???
首先,数据库表是空的,在程序里调用saveOrUpdate方法,产生的sql语句却是 update user set user_name=?, real_name=?, password=?, sex=?, birthday=?, email=?, address=?, telephone=?, qq=?, authority=?, remarks=?[color=red] where user_id=?[/color]这样当然会出错,明明数据库根本没有数据,为什么执行的是修改 表结构 CREATE TABLE USER( user_id INT PRIMARY KEY NOT NULL[color=red],//不是自增[/color] user_name VARCHAR(30), real_name VARCHAR(20), PASSWORD VARCHAR(20), sex VARCHAR(3), birthday VARCHAR(30), email VARCHAR(40), address VARCHAR(50), telephone VARCHAR(20), qq VARCHAR(15), authority VARCHAR(50), remarks VARCHAR(50) 配置入下 xx.hbm.xml <hibernate-mapping> <class name="com.flex.model.User" table="user" > <id name="userId" type="java.lang.Integer"> <column name="user_id" /> <generator class="native"></generator> </id> <property name="userName" type="java.lang.String"> <column name="user_name" length="30" /> </property> <property name="realName" type="java.lang.String"> <column name="real_name" length="20" /> </property> <property name="password" type="java.lang.String"> <column name="password" length="20" /> </property> <property name="sex" type="java.lang.String"> <column name="sex" length="3" /> </property> <property name="birthday" type="java.lang.String"> <column name="birthday" length="30" /> </property> <property name="email" type="java.lang.String"> <column name="email" length="40" /> </property> <property name="address" type="java.lang.String"> <column name="address" length="50" /> </property> <property name="telephone" type="java.lang.String"> <column name="telephone" length="20" /> </property> <property name="qq" type="java.lang.String"> <column name="qq" length="15" /> </property> <property name="authority" type="java.lang.String"> <column name="authority" length="50" /> </property> <property name="remarks" type="java.lang.String"> <column name="remarks" length="50" /> </property> </class> </hibernate-mapping> =[color=red]===============================================[/color] 调用方法源码 hibernate本身的org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdateAll public void saveOrUpdateAll(final Collection entities) throws DataAccessException { executeWithNativeSession(new HibernateCallback<Object>() { public Object doInHibernate(Session session) throws HibernateException { checkWriteOperationAllowed(session); for (Object entity : entities) { [color=red]session.saveOrUpdate(entity);[/color] } return null; } }); [color=red]================================================[/color] 错误日志 22 11:31:28,668 [http-8080-2] ERROR org.hibernate.event.def.AbstractFlushingEventListener- Could not synchronize database state with session org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1 at org.hibernate.jdbc.BatchingBatcher.checkRowCount(BatchingBatcher.java:92) at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:78) at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:57) at org.hibernate.jdbc.BatchingBatcher.addToBatch(BatchingBatcher.java:33) at org.hibernate.persister.entity.BasicEntityPersister.update(BasicEntityPersister.java:1982) at org.hibernate.persister.entity.BasicEntityPersister.updateOrInsert(BasicEntityPersister.java:1909) at org.hibernate.persister.entity.BasicEntityPersister.update(BasicEntityPersister.java:2149) at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:75) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:239) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:223) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:137) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:274) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:730) at org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:394) at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:366) at org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdateAll(HibernateTemplate.java:707) at com.flex.dao.impl.UserDAO.saveOrUpdateAll(UserDAO.java:68) at com.flex.service.impl.IUserServiceImpl.saveOrUpdateAll(IUserServiceImpl.java:25) at com.flex.web.UserAction.saveAll(UserAction.java:32) at com.flex.web.UserAction.getAllUser(UserAction.java:23) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at flex.messaging.services.remoting.adapters.JavaAdapter.invoke(JavaAdapter.java:418) at flex.messaging.services.RemotingService.serviceMessage(RemotingService.java:183) at flex.messaging.MessageBroker.routeMessageToService(MessageBroker.java:1400) at flex.messaging.endpoints.AbstractEndpoint.serviceMessage(AbstractEndpoint.java:1005) at flex.messaging.endpoints.amf.MessageBrokerFilter.invoke(MessageBrokerFilter.java:103) at flex.messaging.endpoints.amf.LegacyFilter.invoke(LegacyFilter.java:158) at flex.messaging.endpoints.amf.SessionFilter.invoke(SessionFilter.java:44) at flex.messaging.endpoints.amf.BatchProcessFilter.invoke(BatchProcessFilter.java:67) at flex.messaging.endpoints.amf.SerializationFilter.invoke(SerializationFilter.java:166) at flex.messaging.endpoints.BaseHTTPEndpoint.service(BaseHTTPEndpoint.java:291) at flex.messaging.MessageBrokerServlet.service(MessageBrokerServlet.java:353) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 上面日志执行了user.setUserId(id),,数据库不是自增 在创建User这个对象时 不执行user.setUserId(id);这时生成的sql是插入语句,但是会出现如下错误 因为userid不能为空,数据库又不是自增的原因 2011-11-22 11:49:04,052 [http-8080-3] DEBUG org.hibernate.util.JDBCExceptionReporter- could not insert: [com.flex.model.User] [insert into user (user_name, real_name, password, sex, birthday, email, address, telephone, qq, authority, remarks) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)] java.sql.SQLException: Field 'user_id' doesn't have a default value at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3603) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3535) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1989) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2150) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2119) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2415) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2333) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2318) at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:1759) at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:2178) at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:34) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:239) at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:240) at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:160) at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:95) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:184) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:173) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:96) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:69) at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:468)
发现一个神奇的问题 prepareStatement setString方法的问题
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class noSelect_Test { /* * 非查询sql语句 */ public static int nonSelect(String sql,String...args){ System.out.println( args.length); //通过工具类获取数据库连接 Connection conn=DBUtils.getConnection(); PreparedStatement ps=null; int rs = 0; try { ps= conn.prepareStatement(sql); for(int i=1;i<=args.length;i++){ int c=i; /* System.out.println( args.length); System.out.println(i); System.out.println(u); ps.setString(i++, u);*/ System.out.println(i); System.out.println(args[c-1]); ps.setString(i, args[c-1]); } rs=ps.executeUpdate(sql); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBUtils.close(null, ps, conn); } return rs; } public static void main(String args[]){ String sql="insert into t_login (username,userpwd)values(?,?)"; nonSelect(sql,"57656","25456"); } } 以上是操作 下面是 2 kaishi 1 57656 57656 2 25456 25456 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?,?)' at line 1 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:526) at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) at com.mysql.jdbc.Util.getInstance(Util.java:384) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3566) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3498) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2562) at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1664) at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1583) at com.vince.jdbc.noSelect_Test.nonSelect(noSelect_Test.java:35) at com.vince.jdbc.noSelect_Test.main(noSelect_Test.java:49) 你们说该怎么搞
jdbc无法执行删除操作
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Scanner; public class delt { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //装载驱动 Connection con=null; PreparedStatement pre=null; Scanner input=new Scanner(System.in); System.out.print("输入要删除的姓名:"); String name=input.next(); try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //得到数据库的连接对象 String url="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=us"; con=DriverManager.getConnection(url,"sa","123456"); //编写SQL语句 String sql="delete name from st where name=?"; //建立一个预处理对象 pre=con.prepareStatement(sql); pre.setString(1,name); System.out.println("11"); int i=pre.executeUpdate(); //con.commit(); System.out.println("22"); if(i>0) System.out.println("删除成功"); else System.out.println("操作未成功"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } ``` ``` 输入要删除的姓名:王二 11 com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 'name' 无效。 at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(Unknown Source) at com.microsoft.sqlserver.jdbc.IOBuffer.processPackets(Unknown Source) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.getPrepExecResponse(Unknown Source) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(Unknown Source) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PreparedStatementExecutionRequest.executeStatement(Unknown Source) at com.microsoft.sqlserver.jdbc.CancelableRequest.execute(Unknown Source) at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeRequest(Unknown Source) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(Unknown Source) at delt.main(delt.java:33)
从Oracle的结果集rs通过getInt(1)取回递增值报错无效的列类型
<% request.setCharacterEncoding("gbk"); //解决中文乱码 String action = request.getParameter("action");//验证跳转方式是从submit按钮链接过来的,因为有name为action的值post if(action != null && action.equals("post")) { String title = request.getParameter("title"); String cont = request.getParameter("cont"); cont.replaceAll("\n", "<br>");//将文本输出的换行改为html形式,展示时才是换行的结构 Connection conn = DB.getConnection(); //设置conn来避免潜在的断电问题start conn.setAutoCommit(false); int rootid = 5; //用preparedstatement语句操作数据库插入语句start String sql = "insert into BBS values(seq_BBS.nextval,0,?,?,?,1,0,sysdate)"; PreparedStatement psmt = DB.createpsmt(conn,sql,Statement.RETURN_GENERATED_KEYS); //因为psmt的处理语句里有递增序列seq_BBS.nextval要处理 psmt.setInt(1, rootid); psmt.setString(2, cont); //所以可以返回这个要处理的递增值 psmt.setString(3, title); psmt.executeUpdate(); ///用preparedstatement语句操作数据库插入语句end ResultSet rsKeys = psmt.getGeneratedKeys(); //返回递增的值,因为只psmt处理了一条记录,所以返回值就是一个 rsKeys.next(); rootid = rsKeys.getInt(1); //通过取结果集的位置为1的值来拿出递增值 Statement stmt = DB.createstmt(conn); stmt.executeUpdate("update BBS set rootid = " + rootid + "where id =" + rootid); conn.commit(); conn.setAutoCommit(true); //设置conn来避免潜在的断电问题send DB.close(rsKeys); DB.close(stmt); DB.close(psmt); DB.close(conn); response.sendRedirect("Show_BBS_Tree2.jsp"); } %>
Sql语句,当在页面插入一个字段的时候,和数据库中的表字段进行对比,有这个名字就数量相加
Sql语句,当在页面插入一个字段的时候,和数据库中的表字段进行对比,有这个名字就数量相加,没有的话重新加入一条新的记录,Sql语句怎么实现? 当我页面添加的是“利群”时,添加一盒,那么数据库中利群这条记录中的num字段中的4变成5,如果是页面添加的是“黄鹤楼”同理,如果添加的不是name字段中的这两个,就新插入一条数据。Sql语句怎么写??急急急。 是Mysql的数据库![图片说明](https://img-ask.csdn.net/upload/201501/21/1421807496_813407.png) public static void selectName(Kcgl kcgl){ ConnectionPool pool = ConnectionPool.getInstance(); Connection connection = pool.getConnection();//链接到数据源 PreparedStatement ps=null; ResultSet rs=null; //Kcgl kcgls = new Kcgl(); String seq = " select goods_stock_id,name,num from goods_stock where name = ? "; try { ps = connection.prepareStatement(seq); ps.setString(1, kcgl.getName());//第一个参数是设置参数的序数位置,第二个参数是设置给参数的值 System.out.println(ps+"+ffffffff"); rs=ps.executeQuery();//返回不为空的结果集 //System.out.println(rs+"mmmmmmmmm"); if(rs==null){ //String seqq = "update goods_stock set num=? where goods_stock_id = ?"; System.out.println(rs.getString("name")+"+pppppppppppp"); String seqq = "INSERT INTO goods_stock (name, spec, num, goods_type_id) VALUES (?, ?, ?, ?)"; ps = connection.prepareStatement(seqq); ps.setString(1, kcgl.getName()); ps.setString(2, kcgl.getSpec()); ps.setInt(3, kcgl.getNum()); ps.setString(4, kcgl.getGoods_type_id()); // 执行更新操作 ps.executeUpdate(); } else{ while(rs.next()) {//取得结果集,一定要用while,循环输出 System.out.println("555555555555"); int num2 = Integer.valueOf(kcgl.getNum())+Integer.valueOf(rs.getInt("num")); String seq3 = "update goods_stock set num=? where goods_stock_id = ?"; ps = connection.prepareStatement(seq3); ps.setInt(1, kcgl.getNum()); ps.setString(2, kcgl.getGoods_stock_id()); ps.executeUpdate(); } } } catch(SQLException e) { e.printStackTrace(); //return null; } finally { DBUtil.closeResultSet(rs); DBUtil.closePreparedStatement(ps); pool.freeConnection(connection); } } 这个是我的那个JDBC的方法,应该怎么改啊,
不懂省略的catch方法应该怎么写?
package com.huizhi.users.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import com.huizhi.database.DatabaseDAO; import com.huizhi.users.action.Users; public class UsersDAO { private Connection con; private PreparedStatement pt; private ResultSet rs; public boolean findUsers(String username){ boolean flag=false; con=DatabaseDAO.getConnection(); try{ pt=con.prepareStatement("select*from users where username=?"); //获得PreparedStatement对象 pt.setString(1,username); //为参数赋值 rs=pt.executeQuery(); //执行查询语句,获取结果集 if (rs.next()){ //若果继续执行,表示用户名存在 flag=true; } }catch(SQLException e){ //捕获异常信息 e.printStackTrace(); }finally{ DatabaseDAO.closeRs(rs); //关闭相应资源 DatabaseDAO.closePt(pt); //关闭PreparedStatement DatabaseDAO.closeCon(con); //关闭数据库连接 } return flag; } public int save(Users users) { // TODO Auto-generated method stub int i=0; con=DatabaseDAO.getConnection(); try{ pt=con.prepareStatement("inset into users(username,password,"+"name,nic,sex,age,email,phone,selfshow)values(?,?,?,?,?,?,?,?,?)"); pt.setString(1,users.getUsername()); pt.setString(2,users.getPassword()); pt.setString(3,users.getName()); pt.setString(4,users.getNic()); pt.setString(5,users.getSex()); pt.setInt(6,users.getAge()); pt.setString(7,users.getEmail()); pt.setString(8, users.getPhone()); pt.setString(9,users.getSelfshow()); i=pt.executeUpdate(); // 省略catch()和finally()方法 return i; } }
PreparedStatement 预编译原理
<p><strong><span>preparedStatement 有三大优点:</span></strong></p> <p><span><span>一.代码的可读性和可维护性. </span></span></p> <p><span><span>二.PreparedStatement尽最大可能提高性能. </span></span></p> <p><span><span>三.最重要的一点是极大地提高了安全性. </span></span></p> <p> </p> <p><span><span>其中一和三的确很易理解。 关于性能的提高也是最有价值的这点, 我对其原理还有些质疑。 </span></span></p> <p> </p> <p> </p> <div class="quote_title">网上一:</div> <div class="quote_div">SQL 语句被预编译并且存储在 PreparedStatement 对象中,其后可以使用该对象高效地多次执行该语句。 <br> </div> <p><span style="color: #ff0000;">问题:</span>预编译在JDBC中完成的?还是数据库中?即便存在preparedStatement中,如果这个preparedStatement 对象不被缓存起来,其后又如何重复使用,多次执行? (一些webserver会缓存preparedStatement)</p> <p>我想关于其性能的提高主要得需要数据库的支持。 </p> <div class="quote_title">oracle 性能优化 写道</div> <div class="quote_div">共享SQL语句 <br>  为了不重复解析相同的SQL语句,在第一次解析之后, ORACLE将SQL语句存放在内存中。 <br>可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询。 <br> </div> <p><span><span><span><span><span><span style="font-size: x-small;"><span style="color: #008000;">个人理解:</span>预编译是利用数据库的SQL共享来实现的,因为当使用preparedStatement 的时候,尽管参数不同,但是在语句中用?来替代。 因此很多语句就完全相同。(这个道理和J2EE的server缓存preparedStatement 的道理应该是一样的)</span></span></span></span></span></span></p> <p> </p> <p><span><span><span><span><span><span><span style="font-size: x-small;"><span style="color: #ff0000;">问题:</span>但是如果是这样的话,那么oracle的多表查询岂不是并无预编译效果?</span></span></span></span></span></span></span></p> <p> </p> <p><span><span><span><span><span><span style="font-size: x-small;"><span><span><span><span><span><span><span style="color: #ff0000;">问题:</span></span></span></span></span></span></span>关于缓存:是否根据创建preparedStatement的语句来做为Key来map的?例如以下:是否检查匹配insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)来确定是否用已经有的执行路径来执行? </span></span></span></span></span></span></p> <p><span><span><span><span style="font-size: x-small;"><span>perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)"); </span></span></span></span></span></p> <p><span> </span></p> <p><span><strong>以下几篇从网络上搜索到的三篇文章:</strong></span></p> <p><span> </span></p> <div class="quote_title"><span>CSDN 写道</span></div> <div class="quote_div"><span>一.代码的可读性和可维护性. <br>虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次: <br><br>stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')"); <br><br>perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)"); <br>perstmt.setString(1,var1); <br>perstmt.setString(2,var2); <br>perstmt.setString(3,var3); <br>perstmt.setString(4,var4); <br>perstmt.executeUpdate(); <br><br>不用我多说,对于第一种方法.别说其他人去读你的代码,就是你自己过一段时间再去读,都会觉得伤心. <br><br>二.PreparedStatement尽最大可能提高性能. <br>每一种数据库都会尽最大努力对预编译语句提供最大的性能优化.因为预编译语句有可能被重复调用.所以语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行.这并不是说只有一个Connection中多次执行的预编译语句被缓存,而是<span style="color: #0000ff;">对于整个DB中,只要预编译的语句语法和缓存中匹配.那么在任何时候就可以不需要再次编译而可以直接执行.而statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配.</span>比如: <br>insert into tb_name (col1,col2) values ('11','22'); <br>insert into tb_name (col1,col2) values ('11','23'); <br>即使是相同操作但因为数据内容不一样,所以整个个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.这样每执行一次都要对传入的语句编译一次. <br><br>当然并不是所以预编译语句都一定会被缓存,数据库本身会用一种策略,比如使用频度等因素来决定什么时候不再缓存已有的预编译结果.以保存有更多的空间存储新的预编译语句. <br><br>三.最重要的一点是极大地提高了安全性. <br><br>即使到目前为止,仍有一些人连基本的恶义SQL语法都不知道. <br>String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'"; <br>如果我们把[' or '1' = '1]作为varpasswd传入进来.用户名随意,看看会成为什么? <br><br>select * from tb_name = '随意' and passwd = '' or '1' = '1'; <br>因为'1'='1'肯定成立,所以可以任何通过验证.更有甚者: <br>把[';drop table tb_name;]作为varpasswd传入进来,则: <br>select * from tb_name = '随意' and passwd = '';drop table tb_name;有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行. <br><br>而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.(前提是数据库本身支持预编译,但上前可能没有什么服务端数据库不支持编译了,只有少数的桌面数据库,就是直接文件访问的那些)只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的statement,有可能要对drop,;等做费尽心机的判断和过虑. </span></div> <p><span> </span></p> <p> </p> <div class="quote_title"><span>论坛 写道</span></div> <div class="quote_div"> <span><span style="font-size: x-small;">1,执行效率:Statement 采取直接编译 SQL 语句的方式,扔给数据库去执行,而 </span></span><span><span><span style="font-size: x-small;"><span style="color: #0000ff;">PreparedStatement 则先将 SQL 语句预编译</span>一遍,再填充参数,这样效率会高一些。JDK 文档说:SQL 语句被预编译并且存储在 PreparedStatement 对象中,其后可以使用该对象高效地多次执行该语句。 <br><br>2,代码可读性:Statement 中 SQL 语句中需要 Java 中的变量,加就得进行字符串的运算,还需要考虑一些引号、单引号的问题,参数变量越多,代码就越难看,而且会被单引号、双引号搞疯掉;而 PreparedStatement,则不需要这样,参数可以采用“?”占位符代替,接下来再进行参数的填充,这样利于代码的可读性,并且符合面向对象的思想。 <br><br>3,安全性:Statement 由于可能需要采取字符串与变量的拼接,很容易进行 SQL 注入攻击,而 PreparedStatement 由于是预 <br>编译,再填充参数的,不存在 SQL 注入问题。 <br></span></span></span> </div> <p><span> </span></p> <div class="quote_title"><span>Oracle 优化 写道</span></div> <div class="quote_div"><span>3. 共享SQL语句 <br>  为了不重复解析相同的SQL语句,在第一次解析之后, ORACLE将SQL语句存放在内存中。这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享。 因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的执行路径。 ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用。 <br><br>  可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询。 </span></div><br /><strong>问题补充:</strong><br />感谢geeksun的回答,我的理解是: <br />问题1, PreparedStatement是jdbc 驱动包里的一个类,并不是说存储在jdbc中。 <br />问题2, 我认为多表查询不支持预编这是不可能的。 <br />问题3, 我想这样提问可能更好一些。 <br />java 方法如下: <br />protected boolean updateSalary(Connection conn,BigDecimal x,String ID) throws SQLException{ <br /> PreparedStatement pstmt = null; <br /> try { <br /> pstmt = conn.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?"); <br /> pstmt.setBigDecimal(1, x); <br /> pstmt.setString(2, ID); <br /> return true; <br /> } finally{ <br /> if (pstmt!=null){ <br /> pstmt.close(); <br /> } <br /> } <br /> <br /> } <br /> <br /> <br />第一次调用以后,是否会缓存PreparedStatement, 这个在用weblogic这种server的时候是可以肯定的。因为从数据源的来connection是一个包装类,不是jdbc驱动的connection,而用connection来创建的PreparedStatement也是封装类。因此尽管pstmt.close().但是实际被封装的PreparedStatement并未关闭。 <br />但是是第二次调用这个方法,会重新conn.prepareStatement, 这个时候我想应该是根据语句来作为key来寻找缓存的preparedStatement,但是尽管取到缓存。 如果没有Database的配合,效率也很难提高多少。 <br /><strong>问题补充:</strong><br />谢谢geeksun的帮忙,Sql的共享我想肯定是支持多表的。 至于高速缓存应该讲的是结果的缓存。 <br />但是你对PreparedStatement的观点我认为是不对的。 因为这个对象肯定是在WebServer端的, 不可能跑到数据库那端。K-V对应的K值应该就是创建这个对象的那条语句,只是需要一个精通人士的肯定。
JDBC使用占位符的插入语句插入不成功是什么原因
``` …… public static void insert(String name,String password) throws Exception{ Connection conn = null; PreparedStatement st = null; ResultSet rs =null; conn = DbUtils.getConn(); String sql="insert into User(name,password) values(?,?)"; st = conn.prepareStatement(sql); st.setString(1,name); st.setString(2, password); int num = st.executeUpdate(sql); if(num>0){ System.out.println("插入成功!!"); } DbUtils.release(conn, st, rs); } public static void main(String args[]) throws Exception{ …… IUserDao.insert("hello","89790"); …… } } ``` +----------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+-------+ | userID | int(11) | YES | | NULL | | | name | varchar(255) | YES | | NULL | | | sex | varchar(255) | YES | | NULL | | | birthday | date | YES | | NULL | | | password | varchar(255) | YES | | NULL | | +----------+--------------+------+-----+---------+-------+ 一直报错,但是不知道是怎么错了。求教 orz Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?,?)' at line 1 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:526) at com.mysql.jdbc.Util.handleNewInstance(Util.java:404) at com.mysql.jdbc.Util.getInstance(Util.java:387) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:939) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2547) at com.mysql.jdbc.StatementImpl.executeUpdateInternal(StatementImpl.java:1541) at com.mysql.jdbc.StatementImpl.executeLargeUpdate(StatementImpl.java:2605) at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1469) at dao.IUserDao.insert(IUserDao.java:107) at dao.IUserDao.main(IUserDao.java:120) 表名没错,id不是自增的,没有primarykey。把sql写死是可以插入的,用“?”就不行了,为什么呢?
JAVA JDBC数据库连接报错,求大神解决
``` package com.es.CH30_jdbc; import java.sql.Connection; import java.sql.Date; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class GetXt16 { public void insert(String name, int age, String brithday, String gender, int math, int chinese, int english) { Connection connection=null; //Statement st=null; PreparedStatement pst=null; try { Class.forName("com.mysql.jdbc.Driver"); connection = DriverManager.getConnection( "jdbc:mysql:///test", "root", "123456"); // st = connection.createStatement(); // String sql = "insert into xt16 values (null,'" + name + "','" + age // + "','" + brithday + "','" + gender + "','" + math + "','" // + chinese + "','" + english + "')"; // int i = st.executeUpdate(sql); String sql="insert into xt16 values(?,?,?,?,?,?,?,?)"; pst=connection.prepareStatement(sql); pst.setString(1, null); pst.setString(2,name); pst.setInt(3,age); pst.setString(4, brithday); pst.setString(5, gender); pst.setInt(6, math); pst.setInt(7, chinese); pst.setInt(8, english); int i = pst.executeUpdate(); if(i>0){ System.out.println("添加成功"); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }finally{ try { connection.close(); pst.close(); //st.close(); } catch (SQLException e) { e.printStackTrace(); } } } public void update(String name, int id){ Connection connection = null; PreparedStatement pst = null; try { //加载驱动 Class.forName("com.mysql.jdbc.Driver"); //连接数据库 connection = DriverManager.getConnection("jdbc:mysql:///test", "root", "123456"); //创建prepareStatement对象,进行sql预编译 String sql="update xt16 set name=? where id=?"; pst = connection.prepareStatement(sql); pst.setString(1, name); pst.setInt(2, id); int i = pst.executeUpdate(); if(i > 0){ System.out.println("更新成功"); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }finally{ try { pst.close(); connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void main(String[] args) { GetXt16 gx = new GetXt16(); //gx.xt16(); //gx.insert("baby", 33, "1976-10-22", "女",67, 87, 56); gx.update("周杰伦", 2); } } ``` 警告: Thu Aug 11 16:01:55 CST 2016 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification. 换成jdbc:mysql:///test?autoReconnect=true&useSSL=false"后警告没了,但是update SQL还是没被执行。但是insert语句能被执行。 JDBC和mysql都是官网的最新版本
关于if(rs.next()){}else{},每次运行直接显示else分支的语句,求帮忙
<% Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); //加载驱动、 String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=liuben"; String user="sa"; String password="961213"; Connection conn= DriverManager.getConnection(url,user,password); PreparedStatement stmt1=conn.prepareStatement("select * from t_user where username=?"); PreparedStatement stmt=conn.prepareStatement("insert into t_user values(?,?)"); String c=request.getParameter("name"); String a=request.getParameter("name"); String b=request.getParameter("psword"); stmt.setString(1,a); stmt.setString(2,b); stmt1.setString(1,c); ResultSet rs=stmt1.executeQuery(); if(rs.next()){ out.print("用户名已存在,请使用其他的用户名"); }else{ int i=stmt.executeUpdate(); out.print("注册成功"); } } conn.close(); %>
帮帮忙,看看应该改哪里,谢谢
package javaJDBC; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /* * //采用PreparedStatement添加数据 */ public class InsertTest02 { public static void main(String[] args) { Connection conn = null; PreparedStatement pstmt = null; try{ //加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); //连接数据库 String dbUrl = "jdbc:mysql://localhost:3306/student"; String username = "root"; String password = "mysql"; //执行PreparedStatement语句,执行SQL String name = "莫燕"; String number = "123456"; String class1 = "1102"; int score = 97; String sql = "insert into stu(name, number, class1, scoree) values (?, ?, ?, ?)"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, name); pstmt.setString(2, number); pstmt.setString(3, class1); pstmt.setInt(4, score); pstmt.executeUpdate(); System.out.println("添加员工成功"); }catch(ClassNotFoundException e){ e.printStackTrace(); }catch(SQLException e){ e.printStackTrace(); }finally{ try{ //关闭原则:从里到外 if(pstmt != null) pstmt.close(); if(conn != null) conn.close(); }catch(SQLException e){ e.printStackTrace(); } } } } Exception in thread "main" java.lang.NullPointerException at javaJDBC.InsertTest02.main(InsertTest02.java:29)
事务提交过程,出现异常,但是回滚事务失败,这是什么原因
/** *实现事务:Tom 对Jerry 转账500元 * */ public class TransactionTest { public static void update(Connection conn,String sql,Object ... args){ PreparedStatement pstmt = null; try{ pstmt = conn.prepareStatement(sql);//通过SQL语句 创建PreparedStatement 对象。 //利用 for 循环对 SQL 语句中的 PreparedStatement 占位符 ,更新数据。 for(int i = 0;i < args.length;i++){ pstmt.setObject((i+1), args[i]); } //更新执行。 pstmt.executeUpdate(); }catch(Exception e){ e.printStackTrace(); }finally{ //关闭数据库连接。 JDBCTools.release(null, pstmt, null); } } public static void main(String[] args) { Connection conn = null; try{ conn = JDBCTools.getConnection(); //取消默认的提交方式 conn.setAutoCommit(false); String sql = "UPDATE user SET balance = balance - 500 WHERE id = 2000001"; update(conn, sql); /*此处会 报com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException,Table 'ming.users' doesn't exist 但是,整个事务却没有回滚。*/ sql = "UPDATE users SET balance = balance + 500 WHERE id = 2000002"; update(conn,sql); //若事务操作正常,则提交事务 conn.commit(); } catch(Exception e){ //若事务操作出现异常,则需要在异常处理中回滚事务 try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } finally{ JDBCTools.release(null, null, conn); } } }
JDBC-ODBC桥连接时出现空指针异常
我在用 jdbc-odbc 桥连方式操作 sql server 数据库时出现空指针异常 Connection ct = null; Statement sm = null; try { //(1)加载驱动(作用是把需要的驱动程序加入内存) Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //(2)得到连接(指定连接到哪个数据库) ct = DriverManager.getConnection("jdbc:odbc:mytest"); System.out.println("数据库成功连接"); //(3)创建Statement或者preparedStatement sm = ct.createStatement(); //(4)执行CRUD //添加一条数据到dept表 int i = sm.executeUpdate("insert into dept values('50','security','beijing')"); if(i==1){ System.out.println("添加成功"); }else{ System.out.println("添加失败"); } } catch (Exception e) { e.printStackTrace(); }finally{ //以上的语句执行完成之后需要关闭数据源 //关闭的顺序:谁先创建谁后关闭 try{ if(sm != null){ sm.close(); } if(ct != null){ ct.close(); } }catch (SQLException e){ e.printStackTrace(); } } 出现异常描述如下: java.lang.NullPointerException at sun.jdbc.odbc.JdbcOdbcDriver.initialize(JdbcOdbcDriver.java:436) at sun.jdbc.odbc.JdbcOdbcDriver.connect(JdbcOdbcDriver.java:153) at java.sql.DriverManager.getConnection(DriverManager.java:664) at java.sql.DriverManager.getConnection(DriverManager.java:270) at JDBC_ODBC.main(JDBC_ODBC.java:28) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
将截断字符串或二进制数据问题,Java,sql
我开的长度足够大了,可是还是报错 ``` ![图片说明](https://img-ask.csdn.net/upload/201602/17/1455723342_499331.png) ``` public void actionPerformed(ActionEvent e) { if(e.getSource()==jb1){ Connection ct=null; Statement stm=null; PreparedStatement ps=null; ResultSet rs=null; //Statement stmt=null; try { //加载驱动 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //创建连接对象 String url="jdbc:sqlserver://localhost:1433;databaseName=master"; //注册驱动程序,打开连接 ct=DriverManager.getConnection(url,"sa","ksj123456."); //预编译语句对象 String sql="insert into stu values(?,?,?,?,?,?)"; ps=ct.prepareStatement(sql); //参数赋值 ps.setString(1, jtf1.getText()); ps.setString(2, jtf1.getText()); ps.setString(3, jtf1.getText()); ps.setString(4, jtf1.getText()); ps.setString(5, jtf1.getText()); ps.setString(6, jtf6.getText()); //执行操作 ps.executeUpdate(); this.dispose(); ``` ```
相见恨晚的超实用网站
搞学习 知乎:www.zhihu.com 简答题:http://www.jiandati.com/ 网易公开课:https://open.163.com/ted/ 网易云课堂:https://study.163.com/ 中国大学MOOC:www.icourse163.org 网易云课堂:study.163.com 哔哩哔哩弹幕网:www.bilibili.com 我要自学网:www.51zxw
花了20分钟,给女朋友们写了一个web版群聊程序
参考博客 [1]https://www.byteslounge.com/tutorials/java-ee-html5-websocket-example
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
字节跳动视频编解码面经
引言 本文主要是记录一下面试字节跳动的经历。 三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时
开源一个功能完整的SpringBoot项目框架
福利来了,给大家带来一个福利。 最近想了解一下有关Spring Boot的开源项目,看了很多开源的框架,大多是一些demo或者是一个未成形的项目,基本功能都不完整,尤其是用户权限和菜单方面几乎没有完整的。 想到我之前做的框架,里面通用模块有:用户模块,权限模块,菜单模块,功能模块也齐全了,每一个功能都是完整的。 打算把这个框架分享出来,供大家使用和学习。 为什么用框架? 框架可以学习整体
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成喔~) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch
深深的码丨Java HashMap 透析
HashMap 相关概念 HashTab、HashMap、TreeMap 均以键值对像是存储或操作数据元素。HashTab继承自Dictionary,HashMap、TreeMap继承自AbstractMap,三者均实现Map接口 **HashTab:**同步哈希表,不支持null键或值,因为同步导致性能影响,很少被使用 **HashMap:**应用较多的非同步哈希表,支持null键或值,是键值对...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
Python 基础(一):入门必备知识
目录1 标识符2 关键字3 引号4 编码5 输入输出6 缩进7 多行8 注释9 数据类型10 运算符10.1 常用运算符10.2 运算符优先级 1 标识符 标识符是编程时使用的名字,用于给变量、函数、语句块等命名,Python 中标识符由字母、数字、下划线组成,不能以数字开头,区分大小写。 以下划线开头的标识符有特殊含义,单下划线开头的标识符,如:_xxx ,表示不能直接访问的类属性,需通过类提供
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
JDK12 Collectors.teeing 你真的需要了解一下
前言 在 Java 12 里面有个非常好用但在官方 JEP 没有公布的功能,因为它只是 Collector 中的一个小改动,它的作用是 merge 两个 collector 的结果,这句话显得很抽象,老规矩,我们先来看个图(这真是一个不和谐的图????): 管道改造经常会用这个小东西,通常我们叫它「三通」,它的主要作用就是将 downstream1 和 downstre...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
相关热词 c#选择结构应用基本算法 c# 收到udp包后回包 c#oracle 头文件 c# 序列化对象 自定义 c# tcp 心跳 c# ice连接服务端 c# md5 解密 c# 文字导航控件 c#注册dll文件 c#安装.net
立即提问