版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34461514/article/details/78856265
首先,准备必要的对象:
下面是需要用到的对象。数据库连接在最后讲解
...
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, "%");
// 从元数据获取每一列的 COLUMN_NAME(列名)和 TYPE_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 init() {
try {
Class.forName(DRIVER);
con=DriverManager.getConnection(URL, USER, PASS);
stm=con.createStatement();
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
}