MetaData元数据

一、基础

定义:数据库、表、列相关信息的描述。
    何时使用:想取得对数据库的信息时使用。
    一】数据库元数据——通过DataBaseMetaData
            DataBaseMetaData dbmd = conn.getDataBaseMetaData();
        code:

           Connection conn = C3P0Utils.getMySqlConnection();
            //取得数据库元数据 ———— DatabaseMetaData
            DatabaseMetaData dbmd = conn.getMetaData();
            String driver = dbmd.getDriverName();
            System.out.println("driverName : " + driver);//MySQL-AB JDBC Driver
            String url = dbmd.getURL();
            System.out.println("url : " + url);//jdbc:mysql://127.0.0.1:3306/jdbc
            int level = dbmd.getDefaultTransactionIsolation();//得到事务级别,值所对应的级别可有Connectin类的字段值来查看
            System.out.println("level : " + level);//2
            String productName = dbmd.getDatabaseProductName();
            System.out.println("productName : " + productName);//MySQL    

二】参数元数据——通过ParameterMetaData
            ParameterMetaData pmd = pstmt.getParameterMetaData;
        code:

           Connection conn = C3P0Utils.getMySqlConnection();
            PreparedStatement pstmt = conn.prepareStatement(SqlMapping.QUERY_INF);//SELECT * FROM jdbc.test_batch WHERE id = ?
            //得到参数元数据
            ParameterMetaData pmd = pstmt.getParameterMetaData();
            int cnt = pmd.getParameterCount();
            System.out.println("共有" + cnt + "个参数");//公有的参数,即为SQL语句中的 ?  的个数,这里为1个

三】结果集数据元——通过ResultSetMetaData
            ResultSetMetaData rsmd = rs.getMetaData();
        code:

            String SQL = " SELECT * FROM jdbc.test_batch ";
            Connection conn = C3P0Utils.getMySqlConnection();
            PreparedStatement pstmt = conn.prepareStatement(SQL);
            ResultSet rs = pstmt.executeQuery();
            ResultSetMetaData rsmd = rs.getMetaData();
            int cnt = rsmd.getColumnCount();// 结果集的个数
            for (int i = 1; i <= cnt; i++) {
                String colName = rsmd.getColumnName(i);//取得每列的名字
                System.out.println("colName = " + colName);//colName = id colName = name colName = age
            }

总结:
        核心规律如下:
         ResultSetMetaData ResultSet.getMetaData();
         ParameterMetaData psmt.getMetaData();
         DataBaseMetaData conn.getMetaData();

二、使用MetaData元数据优化CUD操作和R操作(封装成工具方便使用)
    一】CUD操作
        code:

        // CUD操作
        public static int update(String sql, Object[] params) throws SQLException {
            Connection conn = C3P0Utils.getMySqlConnection();
            PreparedStatement pstmt = conn.prepareStatement(sql);// INSERT INTO meta.user(username,salary) VALUES(?, ?)
            // 取得参数元数据
            ParameterMetaData pmd = pstmt.getParameterMetaData();
            // 取得参数个数
            int size = pmd.getParameterCount();
            // 循环绑定对象的值
            for (int i = 0; i < size; i++) {
                pstmt.setObject(i + 1, params[i]);
            }
            int rows = pstmt.executeUpdate();
            C3P0Utils.close(conn);
            return rows;
        }    

二】R操作
        code:

        //R操作(要求:javaBean的名称必须要和数据库字段的名称相同)
        public static <T> List<T> query(String sql, Object[] params, Class clazz) throws SQLException, InstantiationException, IllegalAccessException, InvocationTargetException {
            Connection conn = C3P0Utils.getMySqlConnection();
            List<T> list = new ArrayList<T>();

            PreparedStatement pstmt = conn.prepareStatement(sql);//SELECT * FROM meta.user WHERE id = ?
            ParameterMetaData pmd = pstmt.getParameterMetaData();
            int cnt = pmd.getParameterCount();
            for(int i = 0; i < cnt; i++) {
                pstmt.setObject(i+1, params[i]);
            }
            ResultSet rs = pstmt.executeQuery();

            while (rs.next()) {
                ResultSetMetaData rsmd = rs.getMetaData();
                int column = rsmd.getColumnCount();
                T t = (T) clazz.newInstance();
                for (int i = 0; i < column; i++) {
                    String colName = rsmd.getColumnName(i+1);
                    BeanUtils.setProperty(t, colName, rs.getObject(colName));
                }
                list.add(t);
            }                  C3P0Utils.closeAll(conn, pstmt, rs);                        return list;        }
时间: 2024-10-18 12:30:10

MetaData元数据的相关文章

MySQL存储过程之函数及元数据

1.创建函数 1 CREATE FUNCTION factorial (n DECIMAL(3,0))       2 RETURNS DECIMAL(20,0) 3     DETERMINISTIC 4 BEGIN   5     DECLARE factorial DECIMAL(20,0) DEFAULT 1; 6     DECLARE counter DECIMAL(3,0); 7     SET counter = n;   8     factorial_loop: REPEAT

理解git

为了真正了解git,我们从底部.底层开始,了解git核心,知其然并知其所以然. 为什么要进行版本控制呢? 因为编写文件不可能一次到位,文件总是有不同的状态需要保存下来,方便以后出错回滚. git 是目前最先进的版本控制软件(VCS,version control system),它是linux之父Linus Torvalds的第二个作品. 正如git所命名的那样,是“愚蠢或不开心的人”,Linus评价“git is a British English slang for a stupid or

『ENGLISH』

以A字母开头的词汇 英文 中文 abstract module 抽象模组 access 访问.存取 access control 存取控制 access control information 存取控制资讯 access mechanism 存取机制 access rights 存取权限 accessibility 无障碍性 accessibility information 无障碍网页资讯 accessibility problem 无障碍网页问题 accessible 无障碍的 access

免费视频播放器videojs中文教程

Video.js是一款web视频播放器,支持html5和flash两种播放方式.更多关于video.js的介绍,可以访问官方网站介绍,我之前也写过一篇关于video.js的使用心得,有兴趣的可以点这里 , 阅读的人数还蛮多的,有些热心的读者甚至还给过我小额打赏,钱虽不多,但是很感动.最几天又收到几位网友的私信,问一些关于videojs使用方面的问题.我自己都不记得videojs长什么模样了,出于别人对我的信任,又回头看了一遍上一篇文章,还是2014年的时候写的,如今videojs的版本已经更新到

NET Core

[.net 面向对象程序设计深入](8)认识.NET Core  1,概述          .NET 经历14年,在Windows平台上的表现已经相当优秀,但是"跨平台.开源"却是其痛点,从16年开始.NET Core的出现将迎来.NET的真正意义上的跨平台和开源序幕.     .NET Core是一个开源通用的开发框架,支持跨平台,即支持在Window,macOS,Linux等系统上的开发和部署,并且可以在硬件设备,云服务,和嵌入式/物联网方案中进行使用.     .NET Cor

IT软件开发中常用的英语词汇

Aabstract 抽象的abstract base class (ABC)抽象基类abstract class 抽象类abstraction 抽象.抽象物.抽象性access 存取.访问access function 访问函数access level访问级别account 账户action 动作activate 激活active 活动的actual parameter 实参adapter 适配器add-in 插件address 地址address space 地址空间ADO(ActiveX D

PHP(14)使用mysqli操作MySQL

1.连接MySQL数据库 <?php $mysqli = new mysqli("localhost", "root", "123456", "mydb"); if ($mysqli->connect_errno) {     echo "Failed to connect to MySQL: " . $mysqli->connect_error; }else{     echo &quo

菜鸟学Linux 第003篇笔记 Linux操作系统和常用命令1

认证:Authentication 授权:Authorization 审计:Audition (log日志) magic number:魔数 pwd:Print Working directory  显示当前路径 list: ls  用来列出当前目录或指定目录下的文件默认显示当前目录 选项 -l 显示文件属性 文件属性 第1位所显示字符的含义 -:普通文件 d:目录文件 b:块设备文件(block) c:字符设备文件(character) l:符号链接文件(symbolic link file)

kubernetes学习笔记

docker实现了更便捷的单机容器虚拟化的管理, docker的位置处于操作系统层与应用层之间; 相对传统虚拟化(KVM,XEN): docker可以更加灵活的去实现一些应用层功能, 同时对资源的利用率也更高 相对应用: docker可以把应用更操作系统(镜像)做更好的结合, 降低部署与维护的的成本 处于这样一个位置在单机使用docker进行业务部署是可以感觉到质的提升; 但是针对跨机器, 大规模, 需要对业务质量进行保证的时候, docker本身又有些不足, 而传统的运维自动化工具无论是在do