java深入探究07-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", );
// 总结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下的更多相关文章
- Java JDBC下执行SQL的不同方式、参数化预编译防御
相关学习资料 http://zh.wikipedia.org/wiki/Java数据库连接 http://lavasoft.blog.51cto.com/62575/20588 http://blog ...
- java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver 错误的解决办法
java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver 错误的解决办法 (2011-05-05 16:08:05) 转载▼ ...
- 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 ...
- Java中的事务——JDBC事务和JTA事务
Java中的事务——JDBC事务和JTA事务 转载:http://www.hollischuang.com/archives/1658 之前的事务介绍基本都是数据库层面的事务,本文来介绍一下J2EE中 ...
- Java面试题全集(下)转载
Java面试题全集(下) 这部分主要是开源Java EE框架方面的内容,包括hibernate.MyBatis.spring.Spring MVC等,由于Struts 2已经是明日黄花,在这里就不 ...
- java.lang.ClassNotFoundException:oracle.jdbc.OracleDriver
在使用JDBC时经常碰到java.lang.ClassNotFoundException:oracle.jdbc.OracleDriver问题 这是jvm找不到驱动类文件,可能是以下原因: 没有导入驱 ...
- Java基础-面向接口编程-JDBC详解
Java基础-面向接口编程-JDBC详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.JDBC概念和数据库驱动程序 JDBC(Java Data Base Connectiv ...
- Java数据库操作(JDBC)
JDBC Java数据库连接(Java DataBase Connectivity,JDBC)用于在Java程序中实现数据库操作功能,它提供了执行SQL语句.访问各种数据库的方法,并为各种不同的数据库 ...
- Java应用程序连接数据库--JDBC基础
Java应用程序连接数据库--JDBC基础 Java应用程序连接数据库–JDBC基础 <!-- MySQL驱动,连接数据库用,由数据库厂商提供 --> <dependency&g ...
- java深入探究07-jsp
RequestDispatcher是web资源包装类<jsp:include>只能实现固定jsp文件名他可以翻译为:RequestDispatcher(filename).include( ...
随机推荐
- 搭建nginx服务器和直播流媒体服务器
1.nginx简单说明 ① Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.其特点是占有内存少,并发能力强. ...
- python常见面试题(二)
1. 到底什么是Python?你可以在回答中与其他技术进行对比(也鼓励这样做). 下面是一些关键点: Python是一种解释型语言.这就是说,与C语言和C的衍生语言不同,Python代码在运行之前不需 ...
- ros之串口通信---imu
1.sudo apt-get install ros-kinetic-rosserial 或者sudo git clonegit://github.com/wjwwood/serial.git (开 ...
- jsp页面用java代码取随机数
<%int seconds = (int) (System.currentTimeMillis() / 1000); %> 然后在需要随机数的地方加上下面的代码: <input na ...
- ubuntu环境 rake aborted!
错误: rake aborted! Gem::LoadError: You have already activated rake 10.3.2, but your Gemfile requires ...
- 基于JT/T 1078协议设计和开发部标视频服务器
交通部与2016年10月份推出了JT/T 1078-2016标准,全称是<道路运输车辆卫星定位系统视频通信协议>.该标准将改变以往两客一危车辆的视频监控设备通信协议都是设备厂商私有协议的局 ...
- 第1章列表处理——1.1 Lisp列表
Lisp是啥? Lots of Isolated Silly Parentheses (大量分离的愚蠢的括号) Lisp指的是"LISt Processing"(列表处理),通过把 ...
- 探究 Redis 4 的 stream 类型
redis 2 10 月初,Redis 搞了个大新闻.别紧张,是个好消息:Redis 引入了名为 stream 的新数据类型和对应的命令,大概会在年底正式发布到 4.x 版本中.像引入新数据类型这样的 ...
- Android ijkplayer 强大的视频播放器框架教程 -- 导入demo运行(一)
首先介绍下这个开源项目,这个开源项目是BiliBli 开源的,首先感谢他们的团队. 这是开源的地址: https://github.com/Bilibili/ijkplayer 首先我为什么要选这个, ...
- java学习日历输出(一)
import java.text.DateFormatSymbols; import java.util.Calendar; import java.util.GregorianCalendar; i ...