配置文件
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