工具类:获取任意数据库下任意数据表的字段信息

配置文件 

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/d_student
user=root
password=123456

 获取连接的类

这个类通过读取文件,创建连接,需求中的“任意数据库”由该类实现,只要更改配置文件即可。

package com.imooc.util;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

import org.junit.Test;
/*
 * 由于每次操作数据库都需要创建一个JDBC连接对象,步骤相同,多次操作数据库就会形成许多冗余代码
 * 故我将创建连接的部分代码封装成工具类的一个方法,在外部通过调用本类的getConnection()方法,就能
 * 返回一个Connection对象
 * 
 */
public class JDBCUtil {
	/*
	 * jdbc变量
	 */
	private  static String driver;
	private  static String url;
	private  static String user;
	private  static String password;
	/*
	 * 构造器私有,不允许外部创建对象,外部只能够通过类名调用本类的方法
	 */
	private JDBCUtil() {
		
	}
	/*
	 * 本方法用于加载配置文件中的信息,并返回一个Connection对象
	 */
	@Test
	public static Connection getConnection() {
		InputStream in=null;//声明一个字节输入流
		Properties ps=null;//声明Properties对象,读取文件中的键值对
		Connection con = null;//声明jdbc连接
		try {
			in=JDBCUtil.class.getClassLoader()
                    .getResourceAsStream("/db.properties");//动态获取配置文件的路径
			ps=new Properties();//创建Properties对象
			ps.load(in);//加载键值对信息
			/*
			 * 获取配置文件中键值对的value值,getProperty(String key)方法,传入key,返回value
			 */
			driver=ps.getProperty("driver");
			url=ps.getProperty("url");
			user=ps.getProperty("user");
			password=ps.getProperty("password");
			/*
			 * 加载驱动与创建连接
			 */
			Class.forName(driver);//加载驱动
			con = DriverManager.getConnection(url, user, password);
		} catch (IOException | ClassNotFoundException | SQLException e) {
			e.printStackTrace();
		}
		return con;//返回jdbc连接
	}
	
}

获取指定数据库下任意数据表信息的类 

这个类中封装了的所有方法,都只需要传入一个数据库对应的数据表实例,即可返回相应的字段信息。

package com.imooc.util;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;



/*
 * 本类的作用是获取任意数据表的字段信息的类
 * 
 * 可返回任意数据库下任意数据表的表名/字段数/字段名/字段java类型(完全限定名和简单名称)
 */
public class ColumnInfo<T> {
	
	/*
	 * 构造器私有化,不允许创建对象
	 */
	private ColumnInfo() {
		
	}
	/*
	 * 获取数据表的表名
	 */
	public static <T> String getTableName(T t) {
		/*
		 * 变量声明
		 */
		String tableName=null;
		try {
			Connection con = JDBCUtil.getConnection();//获取数据库连接
			String simpleName = t.getClass().getSimpleName();//获取数据库下任意数据表对应的实体类名
			tableName="t_"+simpleName.substring(0, 1).toLowerCase()+simpleName.substring(1);//获取表名
		}catch(Exception e) {
			e.getMessage();
		}
		return tableName;//返回表的名字
		
	}
	
	/*
	 * 获取数据表字段总数的方法,传入数据表对应的实体类对象,返回字段总数
	 */
	public static <T> int getColumnCount(T t) {
		ResultSetMetaData rm =ColumnInfo.selectTable(t);//获取表的元信息
		int columnTotal=0;
		try {
			columnTotal=rm.getColumnCount();//获取字段总数
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return columnTotal;
		
	}
	/*
	 * 获取数据表中字段名的方法,
	 * 
	 * 传入数据表的实体类对象和字段的下标,从1开始
	 */
	public static <T> String getColumnName(T t,int index) {
		ResultSetMetaData rm =ColumnInfo.selectTable(t);//获取表的元信息
		int columnTotal=ColumnInfo.getColumnCount(t);//获取数据表字段总数
		String columnName=null;
		if(t!=null) {
			for(int i=0;i<columnTotal;i++) {
				if((i+1)==index) {
					try {
						columnName=rm.getColumnName(index);//获取字段名称
					} catch (SQLException e) {
						e.printStackTrace();
					}
				}
			}
		}
		return columnName;
		
	}
	/*
	 * 获取数据表字段类型的方法,获取的是字段类型的java类型的完全限定名
	 * 
	 * 传入实体类对象和字段的下标,从1开始
	 */
	public static <T> String getColumnClassName(T t,int index) {
		ResultSetMetaData rm =ColumnInfo.selectTable(t);//获取表的元信息
		int columnTotal=ColumnInfo.getColumnCount(t);//获取数据表字段总数
		String columnClassName=null;
		try {
			if(t!=null) {
				for(int i=0;i<columnTotal;i++) {
					if((i+1)==index) {
						columnClassName=rm.getColumnClassName(index);//获取字段java类型的完全限定名
					}
				}
			}		
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return columnClassName;//返回字段java类型的完全限定名
		
	}
	/*
	 * 获取数据表字段类型的方法,获取的是字段类型的java类型
	 * 
	 * 传入实体类对象和字段的下标,从1开始
	 */
	public static <T> String getColumnClassSimpleName(T t,int index) {
		String columnClassSimpleName=null;
		try {
			columnClassSimpleName=Class.forName(ColumnInfo.getColumnClassName(t, index)).getSimpleName();//获取字段类型对应的java数据类型
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}	
		return columnClassSimpleName;	
	}

	
	/*
	 * 查询数据库下任意数据表所有信息的方法,并ResultSetMetaData对象返回
	 * 该对象那个中包含数据表的所有信息
	 */
	private static  <T> ResultSetMetaData selectTable(T t) {
		/*
		 * 变量声明
		 */
		Connection con =null;
		PreparedStatement ps =null;
		ResultSet rs =null;
		ResultSetMetaData rm =null;
		try {
			con = JDBCUtil.getConnection();//获取数据库连接
			String tableName=ColumnInfo.getTableName(t);//获取表名
			String sql="select * from "+tableName;//对数据库下任意数据表执行全表查询
			ps = con.prepareStatement(sql);
			rs = ps.executeQuery();//执行查询语句
			rm = rs.getMetaData();//获取数据表信息
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return rm;//将ResultSetMetaData对象返回
	}
}

测试类

package com.imooc.util;


import com.imooc.pojo.Emp;

public class Test {
	public static void main(String[] args) {
		System.out.println(ColumnInfo.getColumnCount(new Emp()));
		System.out.println(ColumnInfo.getTableName(new Emp()));
		System.out.println(ColumnInfo.getColumnName(new Emp(),2));
		System.out.println(ColumnInfo.getColumnClassName(new Emp(),2));
		
	}
}

运行结果:

8
t_emp
ename
java.lang.String

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二百四十九先森

你的打赏是我努力的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值