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", ); // 总结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", );
// 注意: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 = "";
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 = "";
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=; i<count; i++) {
// 得到列的名称
String columnName = rs_metaData.getColumnName(i + );
// 获取每一行的每一列的值
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;
} }, ); // 测试
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), ); 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, ); // 关闭
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",""},{"jack2",""} }); // 关闭
conn.close();
}

          

java深入探究07-jdbc下的更多相关文章

  1. Java JDBC下执行SQL的不同方式、参数化预编译防御

    相关学习资料 http://zh.wikipedia.org/wiki/Java数据库连接 http://lavasoft.blog.51cto.com/62575/20588 http://blog ...

  2. java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver 错误的解决办法

    java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver 错误的解决办法 (2011-05-05 16:08:05) 转载▼ ...

  3. myeclipe eclipse 常遇问题:Some projects cannot be imported 、java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver、The file connot be validate

    1.Some projects cannot be imported because they already exist in the workspace 2.Some projects were ...

  4. Java中的事务——JDBC事务和JTA事务

    Java中的事务——JDBC事务和JTA事务 转载:http://www.hollischuang.com/archives/1658 之前的事务介绍基本都是数据库层面的事务,本文来介绍一下J2EE中 ...

  5. Java面试题全集(下)转载

    Java面试题全集(下)   这部分主要是开源Java EE框架方面的内容,包括hibernate.MyBatis.spring.Spring MVC等,由于Struts 2已经是明日黄花,在这里就不 ...

  6. java.lang.ClassNotFoundException:oracle.jdbc.OracleDriver

    在使用JDBC时经常碰到java.lang.ClassNotFoundException:oracle.jdbc.OracleDriver问题 这是jvm找不到驱动类文件,可能是以下原因: 没有导入驱 ...

  7. Java基础-面向接口编程-JDBC详解

    Java基础-面向接口编程-JDBC详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.JDBC概念和数据库驱动程序 JDBC(Java Data Base Connectiv ...

  8. Java数据库操作(JDBC)

    JDBC Java数据库连接(Java DataBase Connectivity,JDBC)用于在Java程序中实现数据库操作功能,它提供了执行SQL语句.访问各种数据库的方法,并为各种不同的数据库 ...

  9. Java应用程序连接数据库--JDBC基础

    Java应用程序连接数据库--JDBC基础   Java应用程序连接数据库–JDBC基础 <!-- MySQL驱动,连接数据库用,由数据库厂商提供 --> <dependency&g ...

  10. java深入探究07-jsp

    RequestDispatcher是web资源包装类<jsp:include>只能实现固定jsp文件名他可以翻译为:RequestDispatcher(filename).include( ...

随机推荐

  1. Android studio中正确引入so文件的方法

    相信很多朋友在使用Android studio开发中,遇到过如何引入第三方so文件的问题,然而第三方官方仅仅给出了ADT环境下的集成方式. Android studio中默认使用的是gradle编译方 ...

  2. jsp 页面导出excel时字符串数字变成科学计数法的解决方法

    web导出excel数据格式化 原文地址:http://www.cnblogs.com/myaspnet/archive/2011/05/06/2038490.html   当我们把web页面上的数据 ...

  3. 51系列xdata、idata、data的用法

    从数据存储类型来说,8051系列有片内.片外程序存储器,片内.片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code.data.xdata.idata以及根据51系列特点而设定的 ...

  4. Hibernate3中generator标签使用

    在XXX.hbm.xml映射配置文件中定义<generator class="native"/>标签是为了告诉Hibernate框架使用什么方式去生成主键class对应 ...

  5. Java 异常介绍

    Java标准库内建了一些通用的异常,这些类以 Throwable 为顶层父类.Throwable又派生出 Error 类和 Exception 类. 错误:Error类以及他的子类的实例,代表了JVM ...

  6. publish over ssh 实现 Jenkins 远程部署

    Jenkins远程部署,一开始没有任何头绪,想了很多方案. 因为两台机器都是windows系统,所以想到publish over cifs, 但是这个网上资料太少,貌似只能内网使用.又想到了Jenki ...

  7. java代码实现目录结构

    今天用java代码来实现.像我们电脑盘符那样的目录结构.在代码开始之前首先.介绍一下.用.java代码实现目录的思想. 第一步:完成基础的.大家想.我们是如何获取文件的.是不是用File类,直接就获取 ...

  8. 初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)

    由于感觉上一次写的篇幅过长,所以新开一贴,继续介绍Modbus TCP/IP的初步认识, 书接上回 3).03(0x03)功能码--------读保持寄存器 请求与响应格式 这是一个请求读寄存器108 ...

  9. 【HTML5开发系列】meta元素详解

    meta元素可以用来定义文档的各种元数据.他有很多种用法,一个HTML文档可以包含多个meta元素. meta元素在HTML5中的变化 charset属性是HTML5中新增的.在HTML4中,http ...

  10. 关于logback

    1 logback是一个日志框架 2 logback的构成 LogBack被分为3个组件,logback-core, logback-classic 和 logback-access. 其中logba ...