您的位置:首页 > 编程语言 > Java开发

java反射示例:数据库数据反射为java对象

2017-12-20 18:32 429 查看

首先,准备必要的对象:

数据库连接在最后讲解

...
private static Connection con;
private static Statement stm;
private static PreparedStatement pps;
private static ResultSet rss;
//列名-列类型 map
private static HashMap<String,String> column_type=new HashMap<>();


通过DatabaseMetaData对象获取列名和列类型

后面需要通过列名来给对应名字的变量赋值,通过列类型赋予给变量正确的数据类型

private static void setMetaData(Class clazz) {
//获取类的名字
String name=clazz.getSimpleName();
try {
DatabaseMetaData meta=con.getMetaData();
rss=meta.getColumns(con.getCatalog(), "root", name, "%");

while(rss.next()) {
column_type.put(rss.getString("COLUMN_NAME"), rss.getString("TYPE_NAME"));
}
} catch (Exception e) {
e.printStackTrace();
}
}


通过反射获取类对象

下面是读取数据反射为类对象的操作,类对象反射写入数据库可以借此类推

/**
* 通过id查询对象
* @param id 对象id
* @param clazz  类
*/
private static Object getObjectById(int id,Class clazz) {
Object o=null;
//获取类的名字
String name=clazz.getSimpleName();

//如果 列名-列类型 map为空,获取一下
if(column_type.size()==0)
setMetaData();
try {
//查询数据(通过类名查对应的表)
pps=con.prepareStatement("SELECT * FROM "+name+" WHERE id=?");
pps.setInt(1, id);
rss=pps.executeQuery();

//获取类实例
o=clazz.newInstance();

//查询结果
if(rss.next()) {
//遍历列名
for(String name:column_type.keySet()) {
//查找类中对应的变量
Field f=c.getDeclaredField(name);

//获取数据库中的类型 & 类中的类型(末尾类型)
String type=column_type.get(name),
field_type=f.getType().getSimpleName();

//获取类中变量的set方法
Method m=c.getMethod("set"+upwordFirstCase(name), f.getType());

switch(type) {
//字符串类型
case "VARCHAR":
if(field_type.equals("String"));{       //判断两种类型是否相容
m.invoke(o, rss.getString(name));   //执行set方法,写入类对象
}
break;
//整形
case "INT":
if(field_type.equals("int")||field_type.equals("Integer"));{
m.invoke(o, rss.getInt(name));
}
break;
//日期类型
case "DATE":
if(field_type.equals("Date"));{
m.invoke(o, rss.getDate(name));
}
break;
}
}
}
}catch(Exception e) {
e.printStackTrace();
}
return o;
}

/**
* 使字符串首字母大写
* 示例:name-->Name
* 通过此方法获取的字符串前面加上set、get后,用于获取实体类中自动生成的getter,setter方法
* @param s  需要首字母大写的字符串
*/
private static String upwordFirstCase(String s) {
char first=s.charAt(0);
if(first>='a'&&first<='z')
first-=32;
return first+s.substring(1);
}


附:数据库连接



此包需要导入构建路径

//连接准备
private static final String DRIVER="org.gjt.mm.mysql.Driver",
URL="jdbc:mysql://localhost:3306/test?useSSL=true",
USER="root",
PASS="root";


//连接
private static void
4000
init() {
try {
Class.forName(DRIVER);
con=DriverManager.getConnection(URL, USER, PASS);
stm=con.createStatement();
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
}


[b]小生水平有限,欢迎大家指点[/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 java 数据 反射