下面程序主要实现的功能就是,主函数实例化一个对象,Session类仅仅调用其save(Student s)方法,即可将此数据插入到数据库中。
首先数据库database名称:jspdemo
数据库建表语句:
create table _student
( id int primary key,
name varchar(20),
age int
);
用户实体类student.java
package com.lenovo.test;
public class Student {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
主测试函数:
package com.lenovo.test;
public class StudentTest {
public static void main(String args [])throws Exception{
Student stu = new Student();
stu.setId(95001);
stu.setName("易");
stu.setAge(21);
Session session = new Session();
session.save(stu);
}
}
其中重点的就是Session.java,代码如下:
package com.lenovo.test;
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;
public class Session {
private String tableName = "_student";
private Map <String,String> cfs = new HashMap<String,String>();
private String dbDriver = "org.gjt.mm.mysql.Driver";
private String dbUrl = "jdbc:mysql://localhost:3306/jspdemo";
private String dbUser = "root";
private String dbPwd = "123456";
private Connection conn = null;
private PreparedStatement pstmt = null;
private String [] methodNames;
public void save(Student stu) throws Exception{
String sql = creteSQL();
Class.forName(dbDriver);
conn = DriverManager.getConnection(dbUrl, dbUser, dbPwd);
pstmt = conn.prepareStatement(sql);
for(int i=0;i<methodNames.length;i++){
Method m = stu.getClass().getMethod(methodNames[i]);
Class c = m.getReturnType();
if(c.getName().equals("int")){
Integer returnValue = (Integer)m.invoke(stu);
pstmt.setInt(i+1,returnValue);
}else if(c.getName().equals("java.lang.String")){
String returnValue = (String)m.invoke(stu);
pstmt.setString(i+1, returnValue);
}
}
int i = pstmt.executeUpdate();
System.out.println(i);
pstmt.close();
conn.close();
}
private String creteSQL() {
String str1 = "";
String str2 = "";
int index = 0;
//取得str1字符串和student类属性的get方法
for(String s:cfs.keySet()){
str1 = str1 + s + ",";
String temp = cfs.get(s);
methodNames [index++] = "get"+ Character.toUpperCase(temp.charAt(0))+temp.substring(1);
}
str1 = str1.substring(0,str1.length()-1);
//取得str2字符串和所有的get方法
for(int i=0;i<cfs.size();i++){
str2 = str2 + "?,";
}
str2 = str2.substring(0,str2.length()-1);
String sql = "insert into "+tableName+"("+str1+") values("+str2+")";
return sql;
}
public Session(){
cfs.put("_id","id");
cfs.put("_name","name");
cfs.put("_age","age");
methodNames = new String [cfs.size()];
}
}
这里需要说明的问题就是
1.createSQL()函数,这里主要实现的就是一个字符串的拼接。拼成如下所示:“insert into _student(_id,_name,_age) values(?,?,?)”要想达到这样的效果,就必须对相应的字符串进行相应的处理。字符串的拼接,大小写字符的装换,截取字符串等等。 当然这里还需要实现的一个功能就是,取得所有的get***()方法。
2.save(Student s)方法,这里主要实现的功能就是,第一数据库的连接,这里不再重复说明。第二就是取得PreparedStatement对象后,就有之后处理的语句,pstmt.set***(i,value)所以如何处理这样的代码?在这里用到了相应的反射控制。诸如,通过方法名,取得相应的方法,从而得到相应的返回值类型,以及执行此方法后所得到的返回结果等等。在这个函数中,我觉得这里才是最重要的一点吧。对于个中细节,也是值得好好揣摩的。