问题描述
源文件: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对应属性idcfs.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的值,即idv=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|getIdint|getAgejava.lang.String|getNameException in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'hibernate.into_student' doesn't existat 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,其他配置正常 问题补充:pxb1988 写道
解决方案
String sql="insert into<空格>"+tableName+"("+str1+")"+"values ("+str2+")";
解决方案二:
你表的配置文件有问题,检查实体表的配置文件,如果你用jpa注解,就看看注解是不是哪里出错了!如果也不是的话,在试试,Table 'hibernate.into_student' 表是hibernate.into_sutdent.你的表名是错误的,你生产sql语句的时候String sql="insert into"+tableName+"("+str1+")"+"values ("+str2+")"; 那个tableName就是hibernate.into_sutdent.你要做下处理!不知到我说的对不!