做JAVA的人玩JDBC肯定已经很熟练了,像DriverManager、Connection、ResultSet、Statement这些基本类大家肯定很常用啦,我不赘述那些诸如注册JDBC驱动、创建连接、获取数据集的API了,在这我介绍一些写框架时常用的API,大家共同学习吧。
- ResultSetMetaData获取ResultSet对象的元数据信息
以Hibernate的Session.get(class,id)为例,该api是根据主键id获取class映射表的一条数据,这里只要class参数传入不同,则获取的表也不同,然而数据库那么多表,不同表的字段个数又不同,如何准确把表字段映射到class就是关键了,这里ResultSetMetaData就可以办到。
下面是如何获取ResultSetMetaData并且使用该对象内的一些常用方法:
- ResultSet rs = ...... //获取数据集合
- ResultSetMetaData meta= rs .getMetaData();//获取ResultSetMetaData对象
- int columnCount = meta.getColumnCount();//获取ResultSet总共返回了多少个列
- for(int columnIndex=1;columnIndex<=columnCount;columnIndex++){
- resultData.getColumnName(columnIndex);//列名
- resultData.getColumnType(columnIndex);//列数据类型(INT之类的)
- resultData.getColumnTypeName(columnIndex);//列数据类型名
- resultData.getColumnClassName(columnIndex);//列java类型名
- resultData.getColumnDisplaySize(columnIndex);列大小
- }
从上面的代码可以看出,ResultSetMetaData能获取查询返回的数据集的内置信息,使用ResultSetMetaData能做很多事,
比如可以获取指定表的所有列信息并且可以通过IO创建对应的JAVABean;可以用反射给JAVABean自动赋数据表中的值等等。
- DatabaseMetaData获取数据库元数据信息
如果要想获取当前连接的数据库的版本、驱动号和JDBC连接信息就可以使用DatabaseMetaData了,看下面的代码即可明白:
- Connection conn = ......
- DatabaseMetaData metaData = conn.getMetaData();
- try {
- System.out.println("数据库产品名:"+metaData.getDatabaseProductName());
- System.out.println("数据库版本号:"+metaData.getDatabaseProductVersion());
- System.out.println("数据库驱动名:"+metaData.getDriverName());
- System.out.println("数据库驱动版本号:"+metaData.getDriverVersion());
- System.out.println("当前连接的URL:"+metaData.getURL());
- System.out.println("当前连接的用户名:"+metaData.getUserName());
- } catch (Exception e) {
- e.printStackTrace();
- }
还可以通过DatabaseMetaData获取指定数据库的所有表名,下面是获取MYSQL数据库表的代码,其它数据库代码实现有出入:
- public static final List<String> getMySQLTableNames(Connection conn,String dataBaseName){
- DatabaseMetaData metaData = ......
- ResultSet tableResult = null;
- try {
- tableResult = metaData.getTables(dataBaseName, null, null, null);
- } catch (SQLException e) {
- }
- List<String> lstTableNames = null;
- try {
- while(tableResult.next()){
- if(lstTableNames==null){
- lstTableNames = new ArrayList<String>();
- }
- lstTableNames.add(tableResult.getString("TABLE_NAME"));
- }
- } catch (SQLException e1) {
- }
- return lstTableNames;
- }
其实如果ResultSetMetaData和DatabaseMetaData配合就能自动将数据库的表、列信息映射到Javabean中,首先通过DatabaseMetaData获取当前数据库的所有表信息,然后通过ResultSetMetaData查询每张表的所有列信息即可,下面是生成POJO的一个主方法,具体IO相关代码就不贴了大家看看就行了。
- public void generatePojo(){
- Connection conn = JDBCConnectionUtil.getConnection(url, user, password);
- List<String> lstTable = JDBCMetaDataUtil.getMySQLTableNames(conn, JDBCMetaDataUtil.getDatabaseName(conn));
- String srcName = "src";
- String packageName = "com.bless.commons.jdbc.demo";
- String className = null;
- for (String string : lstTable) {
- className = string;
- JavaBeanUtil.createClass(srcName, packageName, className.substring(0, 1).toUpperCase()+className.substring(1));
- List<DatabaseColumnBean> lstColumn = JDBCMetaDataUtil.getMySQLColumnsByTableName(conn, JDBCMetaDataUtil.getDatabaseName(conn), className);
- for (DatabaseColumnBean databaseColumnBean : lstColumn) {
- JavaBeanUtil.createField(srcName, packageName, className, databaseColumnBean.getColumnName(), databaseColumnBean.getJavaTypeName(), "private", true);
- }
- }
- }
- Connection.getCatalog()获取当前连接的数据库名
- public static final String getDatabaseName(Connection conn){
- try {
- return conn.getCatalog();
- } catch (SQLException e) {
- }
- }
- PreparedStatement.RETURN_GENERATED_KEYS获取保存操作自动生成的主键
- public static final PreparedStatement getPreparedStatementWithAutoGenerateKeys(Connection conn,String sql){
- try {
- return conn.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);
- } catch (SQLException e) {
- }
- }
- public void inserDemo(){
- String sql = "INSERT INTO jeesys.accounts (delete_flag, CODE, PASSWORD, role_flag) VALUES (3, 'code', 'password', 3)";
- PreparedStatement pstm = JDBCConnectionUtil.getPreparedStatementWithAutoGenerateKeys(JDBCConnectionUtil.getConnection(url, user, password), sql);
- try {
- pstm.executeUpdate();
- ResultSet resultSet = pstm.getGeneratedKeys();
- while(resultSet.next()){
- System.out.println(resultSet.getObject(1)); //打印出返回的主键值
- }
- } catch (SQLException e) {
- }
- }