JDBC细节

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();//关闭资源
	}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值