源文件:
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 cfs=new HashMap();//为什么用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 cfs=new HashMap();//为什么用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,其他配置正常