• JDBC常用API之外的总结


    做JAVA的人玩JDBC肯定已经很熟练了,像DriverManager、Connection、ResultSet、Statement这些基本类大家肯定很常用啦,我不赘述那些诸如注册JDBC驱动、创建连接、获取数据集的API了,在这我介绍一些写框架时常用的API,大家共同学习吧。

     

     

    • ResultSetMetaData获取ResultSet对象的元数据信息

     

    以Hibernate的Session.get(class,id)为例,该api是根据主键id获取class映射表的一条数据,这里只要class参数传入不同,则获取的表也不同,然而数据库那么多表,不同表的字段个数又不同,如何准确把表字段映射到class就是关键了,这里ResultSetMetaData就可以办到。

    下面是如何获取ResultSetMetaData并且使用该对象内的一些常用方法:

     

    Java代码  收藏代码
    1. ResultSet rs = ...... //获取数据集合  
    2. ResultSetMetaData meta= rs .getMetaData();//获取ResultSetMetaData对象  
    3. int columnCount = meta.getColumnCount();//获取ResultSet总共返回了多少个列  
    4. for(int columnIndex=1;columnIndex<=columnCount;columnIndex++){  
    5. resultData.getColumnName(columnIndex);//列名  
    6. resultData.getColumnType(columnIndex);//列数据类型(INT之类的)  
    7. resultData.getColumnTypeName(columnIndex);//列数据类型名  
    8. resultData.getColumnClassName(columnIndex);//列java类型名  
    9. resultData.getColumnDisplaySize(columnIndex);列大小  
    10. }  

    从上面的代码可以看出,ResultSetMetaData能获取查询返回的数据集的内置信息,使用ResultSetMetaData能做很多事,

    比如可以获取指定表的所有列信息并且可以通过IO创建对应的JAVABean;可以用反射给JAVABean自动赋数据表中的值等等。

     

     

    • DatabaseMetaData获取数据库元数据信息

     

    如果要想获取当前连接的数据库的版本、驱动号和JDBC连接信息就可以使用DatabaseMetaData了,看下面的代码即可明白:

     

    Java代码  收藏代码
    1. Connection conn = ......  
    2. DatabaseMetaData metaData = conn.getMetaData();  
    3. try {  
    4.     System.out.println("数据库产品名:"+metaData.getDatabaseProductName());  
    5.     System.out.println("数据库版本号:"+metaData.getDatabaseProductVersion());  
    6.     System.out.println("数据库驱动名:"+metaData.getDriverName());  
    7.     System.out.println("数据库驱动版本号:"+metaData.getDriverVersion());  
    8.     System.out.println("当前连接的URL:"+metaData.getURL());  
    9.     System.out.println("当前连接的用户名:"+metaData.getUserName());  
    10. catch (Exception e) {  
    11.     e.printStackTrace();  
    12. }  

     

      还可以通过DatabaseMetaData获取指定数据库的所有表名,下面是获取MYSQL数据库表的代码,其它数据库代码实现有出入:

     

    Java代码  收藏代码
    1. public static final List<String> getMySQLTableNames(Connection conn,String dataBaseName){  
    2.         DatabaseMetaData metaData = ......  
    3.         ResultSet tableResult = null;  
    4.         try {  
    5.             tableResult = metaData.getTables(dataBaseName, nullnullnull);  
    6.         } catch (SQLException e) {  
    7.               
    8.         }  
    9.         List<String> lstTableNames = null;  
    10.         try {  
    11.             while(tableResult.next()){  
    12.                 if(lstTableNames==null){  
    13.                     lstTableNames = new ArrayList<String>();  
    14.                 }  
    15.                 lstTableNames.add(tableResult.getString("TABLE_NAME"));  
    16.             }  
    17.         } catch (SQLException e1) {  
    18.               
    19.         }  
    20.         return lstTableNames;  
    21.     }  

      其实如果ResultSetMetaData和DatabaseMetaData配合就能自动将数据库的表、列信息映射到Javabean中,首先通过DatabaseMetaData获取当前数据库的所有表信息,然后通过ResultSetMetaData查询每张表的所有列信息即可,下面是生成POJO的一个主方法,具体IO相关代码就不贴了大家看看就行了。

     

    Java代码  收藏代码
    1. public void generatePojo(){  
    2.         Connection conn = JDBCConnectionUtil.getConnection(url, user, password);  
    3.         List<String> lstTable = JDBCMetaDataUtil.getMySQLTableNames(conn, JDBCMetaDataUtil.getDatabaseName(conn));  
    4.         String srcName = "src";  
    5.         String packageName = "com.bless.commons.jdbc.demo";  
    6.         String className = null;  
    7.         for (String string : lstTable) {  
    8.             className = string;  
    9.             JavaBeanUtil.createClass(srcName, packageName, className.substring(01).toUpperCase()+className.substring(1));  
    10.             List<DatabaseColumnBean> lstColumn = JDBCMetaDataUtil.getMySQLColumnsByTableName(conn, JDBCMetaDataUtil.getDatabaseName(conn), className);  
    11.             for (DatabaseColumnBean databaseColumnBean : lstColumn) {  
    12.                 JavaBeanUtil.createField(srcName, packageName, className, databaseColumnBean.getColumnName(), databaseColumnBean.getJavaTypeName(), "private", true);  
    13.             }  
    14.         }  
    15.     }  
    •  Connection.getCatalog()获取当前连接的数据库名
    没什么多说的,用这个方法可以获取当前连接的数据库名称
    Java代码  收藏代码
    1. public static final String getDatabaseName(Connection conn){  
    2.         try {  
    3.             return conn.getCatalog();  
    4.         } catch (SQLException e) {  
    5.               
    6.         }  
    7.     }  
     

     

    • PreparedStatement.RETURN_GENERATED_KEYS获取保存操作自动生成的主键
    Hibernate有这样一个方法:Session.save(object);用于保存Javabean到数据库,当保存之后object会自动获得数据库返回的主键,其实JDBC的PreparedStatement.RETURN_GENERATED_KEYS就可以实现,实现的方式是在创建Statesment的时候不要用最平常的那个,看下面代码:
    Java代码  收藏代码
    1. public static final PreparedStatement getPreparedStatementWithAutoGenerateKeys(Connection conn,String sql){  
    2.         try {  
    3.             return conn.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);  
    4.         } catch (SQLException e) {  
    5.               
    6.         }  
    7.     }  
     这时就获得了一个带返回主键的Statement对象,具体怎么用就看下面的代码:
    Java代码  收藏代码
    1. public void inserDemo(){  
    2.         String sql = "INSERT INTO jeesys.accounts (delete_flag, CODE, PASSWORD, role_flag) VALUES (3, 'code', 'password', 3)";  
    3.         PreparedStatement pstm = JDBCConnectionUtil.getPreparedStatementWithAutoGenerateKeys(JDBCConnectionUtil.getConnection(url, user, password), sql);  
    4.         try {  
    5.             pstm.executeUpdate();  
    6.             ResultSet resultSet = pstm.getGeneratedKeys();  
    7.             while(resultSet.next()){  
    8.                 System.out.println(resultSet.getObject(1)); //打印出返回的主键值  
    9.             }  
    10.         } catch (SQLException e) {  
    11.         }  
    12.     }  
  • 相关阅读:
    单例模式——C++实现
    单例模式——java实现
    组合模式——java实现
    桥接模式——Java实现
    桥接模式——C++实现
    适配器模式——java实现
    编写一个显示当前时间的jsp页面
    适配器模式——C++实现
    安装配置hadoop1
    Nginx使用教程
  • 原文地址:https://www.cnblogs.com/chenying99/p/2643880.html
Copyright © 2020-2023  润新知