用反射完成学生管理系统(包括数据库连接)
2014-10-27 21:49
357 查看
今天我终于将坑爹的万能数据库链接做好了第一步了,插入数据。
虽说很简单,但还是应该总结一些问题。
一路的坎坷只能现在表达了。
下面就是一些问题以及过程:
最重要的问题可能就是sql语句了,今天弄了好久的sql语句中的错误。
一、我们需要先来总结我们的sql几个语句:
判断表是否存在:
方法:
ResultSet getTables(String catalog,String schemaPattern,String tableNamePattern,String[] types)
参数:
catalog - 类别名称,因为存储在数据库中,所以它必须匹配类别名称。该参数为 "" 则检索没有类别的描述,为 null 则表示该类别名称不应用于缩小搜索范围
schemaPattern - 模式名称的模式,因为存储在数据库中,所以它必须匹配模式名称。该参数为 "" 则检索那些没有模式的描述,为 null 则表示该模式名称不应用于缩小搜索范围
tableNamePattern - 表名称模式,因为存储在数据库中,所以它必须匹配表名称
types - 要包括的表类型组成的列表,null 表示返回所有类型
返回:
ResultSet - 每一行都是一个表描述
下面是代码:
DatabaseMetaData meta = con.getMetaData();
ResultSet rsTable = meta.getTables(null, null, this.Clazz.getSimpleName(), null);
if(rsTable.next()){
表存在
}
判断完表后,我们就该做做下一步:如果没表,新建,添数据:
新建表的语句:
CREAT TABLE tablename (id varchar(255) , age int(255))
后面的参数是 : 你的变量名 变量类型(变量长度) , ......
添加数据的语句:
insert into tablename (id , age) values (1,1)
这里就不详解了
其他的连接数据库直接上代码:
//----------------------------- 连接数据库 --------------------------------------//
public Connection ConnectingMysql() throws SQLException{
String drivename = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/dbhouse";
String userName = "root";//mysql用户名
String password = "root";//mysql用户密码
try {
Class.forName(drivename);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
connection = DriverManager.getConnection(url, userName, password);
return connection;
}
//---------------------------------------------------------------------------------------//
还有个值得注意的地方:
关于最后执行sql语句的时候,statement这个接口下的三个带execute的方法,很容易混淆。
mysql
中execute、executeQuery和executeUpdate之间的区别:
http://blog.csdn.net/error/404.html?from=http%3a%2f%2fblog.csdn.net%2fmon_key_dt%2farticle%2fdetails%2f40516043
二、关于反射传递的数据
首先传入的是我要保存的对象名,通过newinstance()方法取出我的对象
Object object = this.Clazz.newInstance();
再来就是循环输出对象中的变量名和变量类型,提示输入
for (Field field : this.Clazz.getDeclaredFields())
System.out.println("please input "+field.getName()+"("+field.getType().getSimpleName()+"):");
String valueString = scanner.nextLine(); //输入数据
Object value = null;
if(field.getType().equals(String.class)) //判断数据类型
{
value = valueString;
}
......还有很多其他的类型判断我就不贴在这里了
每次输入完成,保存对象信息
field.set(object, value);
最后,保存数据给全局变量,以便最后传给数据库做准备
dataName += field.getName() + ","; //所有数据的名字
if(field.getType().equals(Integer.class) || field.getType().equals(int.class)){
data[dataLength ++] = field.getName() + " int(255),"; //为数据库的creat table 做准备
dataType += "int,"; //数据类型
System.out.println("datatype : " + dataType);
dataValue += valueString + ","; //数据值
System.out.println("datavalue : " + dataValue);
}
else {
data[dataLength ++] = field.getName() + " varchar(255),";
dataType += "varchar,";
System.out.println("datatype : " + dataType);
dataValue += valueString + ",";
System.out.println("datavalue : " + dataValue);
}
到这里,基本就已经完成了。数据库中的insert 以及create table 也直接上代码
不上台面的方法大家就睁一只眼闭一只眼吧。
//新建表
String tableMessage = "";
for(int i = 0 ; i < dataLength ; i++){
tableMessage += data[i];
}
String sql_newTable = "CREATE TABLE " + this.Clazz.getSimpleName() + "("
+ tableMessage.substring(0, tableMessage.length() - 1) + ")";
System.out.println(sql_newTable);
statement.execute(sql_newTable);
//插入数据
String sql_add = "insert into " + this.Clazz.getSimpleName() + "("
+ dataName.substring(0, dataName.length() - 1) + ") "//变量名
+ "values(" + dataValue.substring(0, dataValue.length() - 1) +")";//(?,?,?,?)
System.out.println(sql_add);
statement.executeUpdate(sql_add);
小白一枚,有错之处希望大家及时帮我改正。
虽说很简单,但还是应该总结一些问题。
一路的坎坷只能现在表达了。
下面就是一些问题以及过程:
最重要的问题可能就是sql语句了,今天弄了好久的sql语句中的错误。
一、我们需要先来总结我们的sql几个语句:
判断表是否存在:
方法:
ResultSet getTables(String catalog,String schemaPattern,String tableNamePattern,String[] types)
参数:
catalog - 类别名称,因为存储在数据库中,所以它必须匹配类别名称。该参数为 "" 则检索没有类别的描述,为 null 则表示该类别名称不应用于缩小搜索范围
schemaPattern - 模式名称的模式,因为存储在数据库中,所以它必须匹配模式名称。该参数为 "" 则检索那些没有模式的描述,为 null 则表示该模式名称不应用于缩小搜索范围
tableNamePattern - 表名称模式,因为存储在数据库中,所以它必须匹配表名称
types - 要包括的表类型组成的列表,null 表示返回所有类型
返回:
ResultSet - 每一行都是一个表描述
下面是代码:
DatabaseMetaData meta = con.getMetaData();
ResultSet rsTable = meta.getTables(null, null, this.Clazz.getSimpleName(), null);
if(rsTable.next()){
表存在
}
判断完表后,我们就该做做下一步:如果没表,新建,添数据:
新建表的语句:
CREAT TABLE tablename (id varchar(255) , age int(255))
后面的参数是 : 你的变量名 变量类型(变量长度) , ......
添加数据的语句:
insert into tablename (id , age) values (1,1)
这里就不详解了
其他的连接数据库直接上代码:
//----------------------------- 连接数据库 --------------------------------------//
public Connection ConnectingMysql() throws SQLException{
String drivename = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/dbhouse";
String userName = "root";//mysql用户名
String password = "root";//mysql用户密码
try {
Class.forName(drivename);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
connection = DriverManager.getConnection(url, userName, password);
return connection;
}
//---------------------------------------------------------------------------------------//
还有个值得注意的地方:
关于最后执行sql语句的时候,statement这个接口下的三个带execute的方法,很容易混淆。
mysql
中execute、executeQuery和executeUpdate之间的区别:
http://blog.csdn.net/error/404.html?from=http%3a%2f%2fblog.csdn.net%2fmon_key_dt%2farticle%2fdetails%2f40516043
二、关于反射传递的数据
首先传入的是我要保存的对象名,通过newinstance()方法取出我的对象
Object object = this.Clazz.newInstance();
再来就是循环输出对象中的变量名和变量类型,提示输入
for (Field field : this.Clazz.getDeclaredFields())
System.out.println("please input "+field.getName()+"("+field.getType().getSimpleName()+"):");
String valueString = scanner.nextLine(); //输入数据
Object value = null;
if(field.getType().equals(String.class)) //判断数据类型
{
value = valueString;
}
......还有很多其他的类型判断我就不贴在这里了
每次输入完成,保存对象信息
field.set(object, value);
最后,保存数据给全局变量,以便最后传给数据库做准备
dataName += field.getName() + ","; //所有数据的名字
if(field.getType().equals(Integer.class) || field.getType().equals(int.class)){
data[dataLength ++] = field.getName() + " int(255),"; //为数据库的creat table 做准备
dataType += "int,"; //数据类型
System.out.println("datatype : " + dataType);
dataValue += valueString + ","; //数据值
System.out.println("datavalue : " + dataValue);
}
else {
data[dataLength ++] = field.getName() + " varchar(255),";
dataType += "varchar,";
System.out.println("datatype : " + dataType);
dataValue += valueString + ",";
System.out.println("datavalue : " + dataValue);
}
到这里,基本就已经完成了。数据库中的insert 以及create table 也直接上代码
不上台面的方法大家就睁一只眼闭一只眼吧。
//新建表
String tableMessage = "";
for(int i = 0 ; i < dataLength ; i++){
tableMessage += data[i];
}
String sql_newTable = "CREATE TABLE " + this.Clazz.getSimpleName() + "("
+ tableMessage.substring(0, tableMessage.length() - 1) + ")";
System.out.println(sql_newTable);
statement.execute(sql_newTable);
//插入数据
String sql_add = "insert into " + this.Clazz.getSimpleName() + "("
+ dataName.substring(0, dataName.length() - 1) + ") "//变量名
+ "values(" + dataValue.substring(0, dataValue.length() - 1) +")";//(?,?,?,?)
System.out.println(sql_add);
statement.executeUpdate(sql_add);
小白一枚,有错之处希望大家及时帮我改正。
相关文章推荐
- 【学生信息管理系统 3】:数据库连接不上
- 学生信息管理系统(7)——应用程序与数据库连接
- 学生信息管理系统(5)——应用程序与数据库连接
- jdbc连接Oracle数据库实现学生管理系统(用数据库连接池支持多用户操作同一数据库)
- 小整理-学生管理系统加强版.连接数据库(并通过键盘输入存放学生信息到数据库)
- 学生信息管理系统——数据库引擎的连接(SQL Server验证)
- 学生信息管理系统(6)——应用程序与数据库连接
- 【学生信息管理系统 3】:数据库连接不上
- 学生信息管理系统3——连接数据库的前提
- 学生信息管理系统——数据库连接文件
- 用c++编学生管理系统,连接到sql,在显示记录按钮点后出现错误
- 学生成绩数据库管理系统设计!!!!!!跪求
- 【数据库】学生档案管理系统
- MFC和ACCESS数据库的连接(C_Answers团队开发学生信息管理系统所用)
- RDIFramework.NET — 基于.NET的快速信息化系统开发框架 - 5.3 数据库连接管理模块
- 终于完成了经典的学生信息管理系统
- 学生信息管理系统之数据库语句解析
- 连接到数据库的图书管理系统的用户…
- 学生信息管理系统总结 之 "数据库"
- 学生成绩数据库管理系统设计!!!!!!跪求