DataBaseMetaData的使用
功能:获取数据库的各种信息,如表名,字段名,数据库版本,存储过程等
/**
* 用于获取数据库的信息
* @throws ClassNotFoundException
*/
@Test
public void testDataBaseMetaData() throws ClassNotFoundException {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/music";
String username = "root";
String password = "002233";
Connection conn = null;
try {
conn = DriverManager.getConnection(url, username, password);
DatabaseMetaData dbmd = (DatabaseMetaData) conn.getMetaData();
System.out.println("数据库名和表名的分隔符:" + dbmd.getCatalogSeparator());//例如xxx.persons
System.out.println("数据库主版本号:" + dbmd.getDatabaseMajorVersion());
System.out.println("数据库次版本号:" + dbmd.getDatabaseMinorVersion());
System.out.println("数据库是什么数据库:" + dbmd.getDatabaseProductName());
System.out.println("数据库版本:" + dbmd.getDatabaseProductVersion());
System.out.println("默认事务级别:" + dbmd.getDefaultTransactionIsolation());
System.out.println("SQL关键字:" + dbmd.getSQLKeywords());
System.out.println("该数据库有如下几个数据库:");
ResultSet rs = dbmd.getCatalogs();
while(rs.next()){
String name = rs.getString("TABLE_CAT");
System.out.print(name + "\t");
}
System.out.println();
/*
* DatabaseMetaData提供了很多获取与数据库相关的信息,
* 关于更多的信息,可以查阅相关api
*/
} catch (Exception e) {
e.printStackTrace();
}finally{
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
ResultSetMetaData
功能:获取查询返回的结果集的各种信息,如列数,列名,列长度,对应的java类型,还有本身的数据等,可以用于做自己的工具类,把查询结果生成一个list集合,并且利用反射做到按照表的字段类型自动把数据转化为对应的java数据类型,例如mybatis
/**
* 获取数据库结果集信息
* 用法:比如用来封装一个工具类
* @throws ClassNotFoundException
*/
@Test
public void testResultSetMetaData() throws ClassNotFoundException {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/music";
String username = "root";
String password = "002233";
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try{
conn = DriverManager.getConnection(url, username, password);
String sql = "select * from users";
st = conn.prepareStatement(sql);
rs = st.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
//列数
int columnCount = rsmd.getColumnCount();
for(int i = 1; i <= columnCount; i++){
//列名字
String columnName = rsmd.getColumnName(i);
//列的类型
String columnTypeName = rsmd.getColumnTypeName(i);
//列的长度
int precision = rsmd.getPrecision(i);
//列对应的java类型
String columnClassName = rsmd.getColumnClassName(i);
/*
*还可以获取一些其他的信息.....
*/
System.out.println(columnName);
System.out.println(columnTypeName);
System.out.println(precision);
System.out.println(columnClassName);
}
System.out.println("------------------------------");
while(rs.next()){
for(int i = 1; i <= columnCount; i++){
String columnName = rsmd.getColumnName(i);
String value = rs.getString(columnName);
System.out.println(columnName + "=" + value);
}
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
用ResultSetMetaData简单的封装工具类
将表查询的数据封装成一个简易的List集合
public ArrayList exectQuery(String sql,String[] parms) {//查询操作
ct=getConnetction();
ArrayList al=new ArrayList<>();
try {
ps=ct.prepareStatement(sql);
if(parms!=null)
for(int i=1;i<=parms.length;i++) {//注入值
ps.setString(i, parms[i-1]);
}
rs=ps.executeQuery();
//用于获取多少列
ResultSetMetaData rsmd=rs.getMetaData();
//得到多少列
int column=rsmd.getColumnCount();
//把数据封装到ArrayList中
while(rs.next()) {
Object obj[]=new Object[column];
for(int i=0;i<obj.length;i++) {
obj[i]=rs.getString(i+1);
}
al.add(obj);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
this.close(ct, ps, rs);
}
return al;
}
存储过程调用(CallableStatement 的使用)
利用CallableStatement 可以对存储过程进行调用操作
/**
* 调用存储过程
* @throws ClassNotFoundException
* @throws SQLException
*/
@Test
public void testCallableStatement() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/music", "root", "002233");
CallableStatement cstmt = (CallableStatement) conn.prepareCall("{call save(?, ?, ?, ?)}");//执行存储过程的方法
cstmt.registerOutParameter(3, Types.INTEGER);//输出参数
cstmt.registerOutParameter(4, Types.INTEGER);
cstmt.setInt(1, 3);//输入参数
cstmt.setInt(2, 4);
cstmt.setInt(4, 5);
cstmt.execute();//执行存储过程
System.out.println(cstmt.getInt(3));//获取输出参数的值
System.out.println(cstmt.getInt(4));
cstmt.close();//关闭资源
conn.close();//关闭资源
}