jdbc升级

1.BeanUtils组件

  1)使用:导入commons-beanutils-1.8.3.jar核心包,日志支持包: commons-logging-1.1.3.jar

      缺少日志的jar文件报错:java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

  2)用法:

    1.对象属性的拷贝

      BeanUtils.copyProperty(admin, "userName", "jack");

      BeanUtils.setProperty(admin, "age", 18);

    2.对象的拷贝

      BeanUtils.copyProperties(newAdmin, admin);

    3.map数据拷到javaBean中      

      【注意:map中的key要与javabean的属性名称一致】

      BeanUtils.populate(adminMap, map);

  3)例子:

public class App {

    //1. 对javabean的基本操作
    @Test
    public void test1() throws Exception {

        // a. 基本操作
        Admin admin = new Admin();
//        admin.setUserName("Jack");
//        admin.setPwd("999");

        // b. BeanUtils组件实现对象属性的拷贝
        BeanUtils.copyProperty(admin, "userName", "jack");
        BeanUtils.setProperty(admin, "age", 18);

        // 总结1: 对于基本数据类型,会自动进行类型转换!

        // c. 对象的拷贝
        Admin newAdmin = new Admin();
        BeanUtils.copyProperties(newAdmin, admin);

        // d. map数据,拷贝到对象中
        Admin adminMap = new Admin();
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("userName", "Jerry");
        map.put("age", 29);
        // 注意:map中的key要与javabean的属性名称一致
        BeanUtils.populate(adminMap, map);

        // 测试
        System.out.println(adminMap.getUserName());
        System.out.println(adminMap.getAge());
    }

    //2. 自定义日期类型转换器
    @Test
    public void test2() throws Exception {
        // 模拟表单数据
        String name = "jack";
        String age = "20";
        String birth = "   ";

        // 对象
        Admin admin = new Admin();

        // 注册日期类型转换器:1, 自定义的方式
        ConvertUtils.register(new Converter() {
            // 转换的内部实现方法,需要重写
            @Override
            public Object convert(Class type, Object value) {

                // 判断
                if (type != Date.class) {
                    return null;
                }
                if (value == null || "".equals(value.toString().trim())) {
                    return null;
                }

                try {
                    // 字符串转换为日期
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    return sdf.parse(value.toString());
                } catch (ParseException e) {
                    throw new RuntimeException(e);
                }
            }
        },Date.class);

        // 把表单提交的数据,封装到对象中
        BeanUtils.copyProperty(admin, "userName", name);
        BeanUtils.copyProperty(admin, "age", age);
        BeanUtils.copyProperty(admin, "birth", birth);

        //------ 测试------
        System.out.println(admin);
    }

    //2. 使用提供的日期类型转换器工具类
    @Test
    public void test3() throws Exception {
        // 模拟表单数据
        String name = "jack";
        String age = "20";
        String birth = null;

        // 对象
        Admin admin = new Admin();

        // 注册日期类型转换器:2, 使用组件提供的转换器工具类
        ConvertUtils.register(new DateLocaleConverter(), Date.class);

        // 把表单提交的数据,封装到对象中
        BeanUtils.copyProperty(admin, "userName", name);
        BeanUtils.copyProperty(admin, "age", age);
        BeanUtils.copyProperty(admin, "birth", birth);

        //------ 测试------
        System.out.println(admin);
    }
}

    注意:拷贝对象属性时,对于一般类型会自动转类型,但是遇到特殊类型,如日期类型需要自己定义日期转换器

       注册日期类型转换器:ConvertUtils.register(new DateLocaleConverter(), Date.class);

                 自定义方式:

// 注册日期类型转换器:1, 自定义的方式
        ConvertUtils.register(new Converter() {
            // 转换的内部实现方法,需要重写
            @Override
            public Object convert(Class type, Object value) {

                // 判断
                if (type != Date.class) {
                    return null;
                }
                if (value == null || "".equals(value.toString().trim())) {
                    return null;
                }

                try {
                    // 字符串转换为日期
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    return sdf.parse(value.toString());
                } catch (ParseException e) {
                    throw new RuntimeException(e);
                }
            }
        },Date.class);

2.元数据

   1)在jdbc中获得数据库的定义,例如:数据库,表,列的定义,就用到元数据

   2)在jdbc中可以用的:数据库元数据,参数元数据,结果集元数据(。。。MetaData)

      1.获得数据库元数据:conn.getMetaData();

      2.参数元数据:pstmt=conn.prepareStsatement(sql);

             pstmt.getParameterMetaData();

      3.结果集元数据:rs = pstmt.executeQuery();

              rs_metaData = rs.getMetaData();

              可以通过结果集元数据获得列的名称

例子:

//1. 数据库元数据
    @Test
    public void testDB() throws Exception {
        // 获取连接
        Connection conn = JdbcUtil.getConnection();
        // 获取数据库元数据
        DatabaseMetaData metaData = conn.getMetaData();// alt + shift + L  快速获取方法返回值

        System.out.println(metaData.getUserName());
        System.out.println(metaData.getURL());
        System.out.println(metaData.getDatabaseProductName());
    }

    //2. 参数元数据
    @Test
    public void testParams() throws Exception {
        // 获取连接
        Connection conn = JdbcUtil.getConnection();
        // SQL
        String sql = "select * from dept where deptid=? and deptName=?";
        // Object[] values = {"tom","888"};

        PreparedStatement pstmt = conn.prepareStatement(sql);
        // 参数元数据
        ParameterMetaData p_metaDate = pstmt.getParameterMetaData();
        // 获取参数的个数
        int count = p_metaDate.getParameterCount();

        // 测试
        System.out.println(count);
    }

    // 3. 结果集元数据
    @Test
    public void testRs() throws Exception {
        String sql = "select * from dept ";

        // 获取连接
        Connection conn = JdbcUtil.getConnection();
        PreparedStatement pstmt = conn.prepareStatement(sql);
        ResultSet rs = pstmt.executeQuery();
        // 得到结果集元数据(目标:通过结果集元数据,得到列的名称)
        ResultSetMetaData rs_metaData = rs.getMetaData();

        // 迭代每一行结果
        while (rs.next()) {
            // 1. 获取列的个数
            int count = rs_metaData.getColumnCount();
            // 2. 遍历,获取每一列的列的名称
            for (int i=0; i<count; i++) {
                // 得到列的名称
                String columnName = rs_metaData.getColumnName(i + 1);
                // 获取每一行的每一列的值
                Object columnValue = rs.getObject(columnName);
                // 测试
                System.out.print(columnName + "=" + columnValue + ",");
            }
            System.out.println();
        }

    }

3.DbUtils组件

  1)Apache组织提供的开源JDBC工具类,对jdbc进行了简单的封装,引入jar文件 : commons-dbutils-1.6.jar

  2)使用:

     DbUtil关闭资源、加载驱动

     核心工具类:QueryRunner,对数据库的操作都是通过他来对结果数据进行封装,处理数据

     操作更新:update(conn,sql,param);//执行更新带一个占位符的sql

          update(conn ,sql,...param);//执行更新带多个占位符的sql

            batch(conn,sql,params);批处理

         查询:query(conn,sql,ResultSetHander<T> rsh,Object...params);这个对查询结果封装为自定义的T类型

       DbUtil组件中提供了一些封装结果的对象就不需要自己去自定义封装结果了

          BeanHandler:查询返回一个单一对象;BeanListhandler:查询返回list集合,集合元素是指定的对象

          ArrayHander:结果集第一行,封装为对象数据Object[]

          ArrayListHander:结果集每一行封装为Object[]数组,再添加到list集合中去

          ScalarHandler:放回结果集的第一行第一列

          MapHandler:查询返回结果的第一条记录

查询封装结果集例子:

// 一、查询, 自定义结果集封装数据
    @Test
    public void testQuery() throws Exception {
        String sql = "select * from admin where id=?";
        // 获取连接
        conn = JdbcUtil.getConnection();
        // 创建DbUtils核心工具类对象
        QueryRunner qr = new QueryRunner();
        // 查询
        Admin admin = qr.query(conn, sql, new ResultSetHandler<Admin>() {

            // 如何封装一个Admin对象
            public Admin handle(ResultSet rs) throws SQLException {
                if (rs.next()) {
                    Admin admin = new Admin();
                    admin.setId(rs.getInt("id"));
                    admin.setUserName(rs.getString("userName"));
                    admin.setPwd(rs.getString("pwd"));
                    return admin;
                }
                return null;
            }

        }, 29);

        // 测试
        System.out.println(admin);
        // 关闭
        conn.close();

    }

    // 二、查询, 使用组件提供的结果集对象封装数据

    // 1)BeanHandler: 查询返回单个对象
    @Test
    public void testQueryOne() throws Exception {
        String sql = "select * from admin where id=?";
        // 获取连接
        conn = JdbcUtil.getConnection();
        // 创建DbUtils核心工具类对象
        QueryRunner qr = new QueryRunner();
        // 查询返回单个对象
        Admin admin =  qr.query(conn, sql, new BeanHandler<Admin>(Admin.class), 29);

        System.out.println(admin);
        conn.close();
    }

    // 2)BeanListHandler: 查询返回list集合,集合元素是指定的对象
    @Test
    public void testQueryMany() throws Exception {
        String sql = "select * from admin";
        conn = JdbcUtil.getConnection();
        QueryRunner qr = new QueryRunner();
        // 查询全部数据
        List<Admin> list = qr.query(conn, sql, new BeanListHandler<Admin>(Admin.class));

        System.out.println(list);
        conn.close();
    }
    @Test
//    3) ArrayHandler, 查询返回结果记录的第一行,封装对对象数组, 即返回:Object[]
//    4) ArrayListHandler, 把查询的每一行都封装为对象数组,再添加到list集合中
//    5) ScalarHandler 查询返回结果记录的第一行的第一列  (在聚合函数统计的时候用)
//    6) MapHandler  查询返回结果的第一条记录封装为map
    public void testArray() throws Exception {
        String sql = "select * from admin";
        conn = JdbcUtil.getConnection();
        QueryRunner qr = new QueryRunner();
        // 查询
        //Object[] obj = qr.query(conn, sql, new ArrayHandler());
        //List<Object[]> list = qr.query(conn, sql, new ArrayListHandler());
        //Long num = qr.query(conn, sql, new ScalarHandler<Long>());
        Map<String, Object> map = qr.query(conn,sql, new MapHandler());

        conn.close();
    }

更新例子

// 1. 更新
    @Test
    public void testUpdate() throws Exception {
        String sql = "delete from admin where id=?";
        // 连接对象
        conn = JdbcUtil.getConnection();

        // 创建DbUtils核心工具类对象
        QueryRunner qr = new QueryRunner();
        qr.update(conn, sql, 26);

        // 关闭
        DbUtils.close(conn);
    }

    // 2. 批处理
    @Test
    public void testBatch() throws Exception {
        String sql = "insert into admin (userName, pwd) values(?,?)";
        conn = JdbcUtil.getConnection();
        QueryRunner qr = new QueryRunner();
        // 批量删除
        qr.batch(conn, sql, new Object[][]{ {"jack1","888"},{"jack2","999"}  });

        // 关闭
        conn.close();
    }

          

时间: 2024-07-29 17:55:19

jdbc升级的相关文章

JDBC (未)

基础JDBC 导入数据包 . 需要包括含有需要进行数据库编程的JDBC类的包.大多数情况下,使用 import java.sql.* 就可以了. 注册JDBC驱动程序. 需要初始化驱动程序,可以与数据库打开一个通信通道. 打开连接. 需要使用DriverManager.getConnection() 方法创建一个Connection对象,它代表与数据库的物理连接. 执行查询 . 需要使用类型声明的对象建立并提交一个SQL语句到数据库. 从结果集中提取数据 . 要求使用适当的关于ResultSet

MySql的时区(serverTimezone)引发的血案

前言 mysql8.x的jdbc升级了,增加了时区(serverTimezone)属性,并且不允许为空. 血案现场 配置jdbc的URL:jdbc:mysql://[IP]:[PORT]/[DB]?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true 应用运行一段时间后,发现数据库中登记的时间和正常的时间不一致. 查询表字段值: 而现在电脑的时间是: 问题排查 1.服

关于MySql升级JDBC架包导致时区问题报错(The server time zone value &#39;?й???????&#39; is unrecognized or represents more than one time zone)

报错信息: The server time zone value '?й???????' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want

SonarQube升级

1.阅读SonarQube更新日志: http://docs.codehaus.org/display/SONAR/Upgrading#Upgrading-ReleaseUpgradeNotes 2.停止SonarQube服务: bin/<SYSTEM>/sonar stop 3.下载新版本号的SonarQube及SonarQube Runner,并解压至新的文件夹NEW_SONARQUBE_HOME http://www.sonarqube.org/downloads/ 4.更新NEW_SO

JDBC学习小结

一.JDBC基础 连接数据的步骤: 1.注册驱动 :Class.forName(“com.mysql.jdbc.Driver”) 推荐这种方式,不会对具体的驱动类产生依赖:DriverManager.registerDriver(com.mysql.jdbc.Driver) 会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖:System.setProperty(“jdbc.drivers”, “driver1:driver2”) 虽然不会对具体的驱动类产生依赖:但

JDBC 2

使用 JDBC 驱动程序处理元数据 Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表,表中的各个列,数据类型,触发器,存储过程等各方面的信息.根据这些信息,JDBC可以访问一个实现事先并不了解的数据库. 获取这些信息的方法都是在DatabaseMetaData类的对象上实现的,而DataBaseMetaData对象是在Connection对象上获得的. DatabaseMetaData类 Database

hive客户端升级

文章来自:http://blog.csdn.net/lili72 背景: 旧版本的hive 在用的过程中,经常出现一些bug,无法解决,比如无法找到表们无法找到分区等.由于并发比较大,常见如下异常: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'hive.DELETEME1414791576856' doesn't exist FAILED: SemanticException [Error 10006]: L

探索Oracle之数据库升级十 12c(12.1.0.2)CPU 19774304

探索Oracle之数据库升级十 12c(12.1.0.2)CPU 19774304 一.   补丁描述 参考metalink doc: (Doc ID 19774304.8) Bug19774304 - 12.1.0.2 Bundle Patch 2 for Engineered Systems and DB In-Memory (Nov2014) (Doc ID 19774304.8) 二.   补丁包含 19649591 DATABASE BUNDLE PATCH 12.1.0.2.2 (O

记weblogic JDBC &#39;No operations allowed after statement closed&#39; 缘由

平台应用开发人员向我们平台报了一个issue,说在测试他们应用的时候遇到一个奇怪的问题,系统报了undefinedexception(开发人员自定义的exception,捕捉了jpa exception之后发现无法处理的情况下就抛出未定义异常),他们贴出了weblogic里面报出的异常栈信息: <Sep 17, 2014 7:56:45 AM SAST> <Error> <org.hibernate.transaction.JDBCTransaction> <BE