一、数据库元信息的获取
数据库的元数据信息:指数据库和表等的定义信息。
元数据:数据库、表、列的定义信息。
Connection.getMetaData()
DataBaseMetaData对象
getURL():返回一个String类对象,代表数据库的URL。
getUserName():返回连接当前数据库管理系统的用户名。
getDatabaseProductName():返回数据库的产品名称。(告诉habuneite方言是什么)
getDatabaseProductVersion():返回数据库的版本号。
getDriverName():返回驱动驱动程序的名称。
getDriverVersion():返回驱动程序的版本号。
isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。
//注意导包是java.sql.*的,不是MySQL的。
//数据库元信息用户编写框架用的
public class DbMetaDataDemo {
@Test//数据库元信息的获取
public void test1() throws SQLException{
Connection conn = DBCPUtil.getConnection();
//DatabaseMetaData:关于数据库的整体综合信息。
DatabaseMetaData dmd = conn.getMetaData();
System.out.println(dmd.getDatabaseProductName());
conn.close();
}//打印 MySQL
@Test//PreparedStatement中的参数元信息:得到占位的个数
public void test2() throws SQLException{
Connection conn = DBCPUtil.getConnection();
PreparedStatement stmt = conn.prepareStatement("???");
//可用于获取关于 PreparedStatement 对象中每个参数标记的类型和属性信息的对象
ParameterMetaData pmd = stmt.getParameterMetaData();
//获取占位符的个数
int count = pmd.getParameterCount();
System.out.println(count);//打印3
stmt.close();conn.close();
}
@Test//结果集的元信息:ResultSetMetaData
public void test3() throws SQLException{
Connection conn = DBCPUtil.getConnection();
PreparedStatement stmt = conn.prepareStatement("select * from account where name='aaa'");
ResultSet rs = stmt.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int count = rsmd.getColumnCount();//得到结果集列数
for(int i=1;i<=count;i++){
//获取指定列的表目录名称。
String columnName = rsmd.getCatalogName(i);
//得到获取指定列的 SQL 类型
int columnTyep = rsmd.getColumnType(i);
System.out.println(columnName+":"+columnTyep);
}//打印day13:4 day13:12 day13:7
rs.close();stmt.close();conn.close();
}
} |
结果集的元信息:ResultSetMetaData,可以对这个类的每个方法试用一下
二、编写自定义的JDBC框架
与具体的东西无关才叫框架(DataSource),尽量降低依赖,先写好模板。
mySQL里面的日期和字符串一样,但其他的数据库不一样
建立核心类DbAssist
public class DbAssist {
private DataSource dataSource;
public DbAssist(DataSource dataSource){
this.dataSource = dataSource;
}
// 要能执行增、删、改,都不需要返回值//想要是同一个事务,就必须保证conn相同
public void update(String sql,Object[] params) {
Connection conn = null;
PreparedStatement stmt = null;
try{
conn = dataSource.getConnection();
//创建语句,设置参数
stmt = conn.prepareStatement(sql);
//得到sql中的占位符的个数
ParameterMetaData pmd = stmt.getParameterMetaData();
int questionCount = pmd.getParameterCount();
if(questionCount>0){
if(params==null||params.length!=questionCount){
//如果有占位符,
|