1. BeanUtils组件

1.1 简介

程序中对javabean的操作很频繁, 所以apache提供了一套开源的api,方便对javabean的操作!即BeanUtils组件。

BeanUtils组件,  作用是简化javabean的操作!

用户可以从www.apache.org下载BeanUtils组件,然后再在项目中引入jar文件!

使用BenUtils组件:

1. 引入commons-beanutils-1.8.3.jar核心包

2. 引入日志支持包: commons-logging-1.1.3.jar

如果缺少日志jar文件,报错:

java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

at org.apache.commons.beanutils.ConvertUtilsBean.<init>(ConvertUtilsBean.java:157)

at org.apache.commons.beanutils.BeanUtilsBean.<init>(BeanUtilsBean.java:117)

at org.apache.commons.beanutils.BeanUtilsBean$1.initialValue(BeanUtilsBean.java:68)

at

1.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);

//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());

}

1.3 实例, 日期类型的拷贝

需要注册日期类型转换器,2种方式参见下面代码:

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);

}

}

1.4 应用

public class WebUtils {

@Deprecated

public static <T> T copyToBean_old(HttpServletRequest request, Class<T> clazz) {

try {

// 创建对象

T t = clazz.newInstance();

// 获取所有的表单元素的名称

Enumeration<String> enums = request.getParameterNames();

// 遍历

while (enums.hasMoreElements()) {

// 获取表单元素的名称:<input type="password" name="pwd"/>

String name = enums.nextElement();  // pwd

// 获取名称对应的值

String value = request.getParameter(name);

// 把指定属性名称对应的值进行拷贝

BeanUtils.copyProperty(t, name, value);

}

return t;

} catch (Exception e) {

throw new RuntimeException(e);

}

}

/**

* 处理请求数据的封装

*/

public static <T> T copyToBean(HttpServletRequest request, Class<T> clazz) {

try {

// (注册日期类型转换器)

// 创建对象

T t = clazz.newInstance();

BeanUtils.populate(t, request.getParameterMap());

return t;

} catch (Exception e) {

throw new RuntimeException(e);

}

}

}

2. 元数据

l 在jdbc中获取数据库的定义,例如:数据库、表、列的定义信息。就用到元数据。

l 在jdbc中可以使用: 数据库元数据、参数元数据、结果集元数据

l (元数据定义相关api,  ..MetaData)

public class App {

//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. Dao操作的抽取,  BaseDao

Dao操作通用的步骤:

0. 写SQL语句

1. 获取连接

2. 创建stmt

3. 执行sql

a) 更新

b) 查询

4. 关闭/异常

通过的dao,

1. 更新

String sql = “select * from admin”;

String sql = “select * from admin  where  id=?  And pwd =?”;

public void update(String sql, Object[]  paramValues);

2. 查询

String sql = “select * from admin”;

String sql = “select * from admin  where  id=?  And pwd =?”;

// 传入的什么类型的对象,就封装为什么类型

// 要求: 列的名称,要与指定类型的对象的属性名称一样

Public    List<T>    query  (String sql , Object[] paramValues ,  Class<T> clazz);

T  t;  // 对象赋值

/**

* 通用的dao,自己写的所有的dao都继承此类;

* 此类定义了2个通用的方法:

* 1. 更新

*  2. 查询

* @author Jie.Yuan

*

*/

public class BaseDao {

// 初始化参数

private Connection con;

private PreparedStatement pstmt;

private ResultSet rs;

/**

* 更新的通用方法

* @param sql   更新的sql语句(update/insert/delete)

* @param paramsValue  sql语句中占位符对应的值(如果没有占位符,传入null)

*/

public void update(String sql,Object[] paramsValue){

try {

// 获取连接

con = JdbcUtil.getConnection();

// 创建执行命令的stmt对象

pstmt = con.prepareStatement(sql);

// 参数元数据: 得到占位符参数的个数

int count = pstmt.getParameterMetaData().getParameterCount();

// 设置占位符参数的值

if (paramsValue != null && paramsValue.length > 0) {

// 循环给参数赋值

for(int i=0;i<count;i++) {

pstmt.setObject(i+1, paramsValue[i]);

}

}

// 执行更新

pstmt.executeUpdate();

} catch (Exception e) {

throw new RuntimeException(e);

} finally {

JdbcUtil.closeAll(con, pstmt, null);

}

}

/**

* 查询的通用方法

* @param sql

* @param paramsValue

*/

public <T> List<T> query(String sql, Object[] paramsValue,Class<T> clazz){

try {

// 返回的集合

List<T> list = new ArrayList<T>();

// 对象

T t = null;

// 1. 获取连接

con = JdbcUtil.getConnection();

// 2. 创建stmt对象

pstmt = con.prepareStatement(sql);

// 3. 获取占位符参数的个数, 并设置每个参数的值

int count = pstmt.getParameterMetaData().getParameterCount();

if (paramsValue != null && paramsValue.length > 0) {

for (int i=0; i<paramsValue.length; i++) {

pstmt.setObject(i+1, paramsValue[i]);

}

}

// 4. 执行查询

rs = pstmt.executeQuery();

// 5. 获取结果集元数据

ResultSetMetaData rsmd = rs.getMetaData();

// ---> 获取列的个数

int columnCount = rsmd.getColumnCount();

// 6. 遍历rs

while (rs.next()) {

// 要封装的对象

t = clazz.newInstance();

// 7. 遍历每一行的每一列, 封装数据

for (int i=0; i<columnCount; i++) {

// 获取每一列的列名称

String columnName = rsmd.getColumnName(i + 1);

// 获取每一列的列名称, 对应的值

Object value = rs.getObject(columnName);

// 封装: 设置到t对象的属性中  【BeanUtils组件】

BeanUtils.copyProperty(t, columnName, value);

}

// 把封装完毕的对象,添加到list集合中

list.add(t);

}

return list;

} catch (Exception e) {

throw new RuntimeException(e);

} finally {

JdbcUtil.closeAll(con, pstmt, rs);

}

}

}

public class AdminDao extends BaseDao {

// 删除

public void delete(int id) {

String sql = "delete from admin where id=?";

Object[] paramsValue = {id};

super.update(sql, paramsValue);

}

// 插入

public void save(Admin admin) {

String sql = "insert into admin (userName,pwd) values (?,?)";

Object[] paramsValue = {admin.getUserName(),admin.getPwd()};

super.update(sql, paramsValue);

}

// 查询全部

public List<Admin> getAll(){

String sql = "select * from admin";

List<Admin> list = super.query(sql, null, Admin.class);

return list;

}

// 根据条件查询(主键)

public Admin findById(int id){

String sql = "select * from admin where id=?";

List<Admin> list = super.query(sql, new Object[]{id}, Admin.class);

return  (list!=null&&list.size()>0) ? list.get(0) : null;

}

}

4. DbUtils组件

l commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。

DbUtils组件,

1. 简化jdbc操作

2. 下载组件,引入jar文件 : commons-dbutils-1.6.jar

Java BeanUtils 组件 使用的更多相关文章

  1. java jdbc的优化之BeanUtils组件

    1. BeanUtils组件 1.1 简介 程序中对javabean的操作很频繁, 所以apache提供了一套开源的api,方便对javabean的操作!即BeanUtils组件. BeanUtils ...

  2. 15、Jdbc的优化(BeanUtils组件)

    Jdbc的优化! BeanUtils组件 自定义一个持久层的框架 DbUtils组件 案例优化 1. BeanUtils组件 1.1    简介 程序中对javabean的操作很频繁, 所以apach ...

  3. BeanUtils组件

    引入jar包(需要引入依赖的日志jar包) Person p = new Person(); p.setName("Daisy"); p.setAge(12); //对象的copy ...

  4. 在 Java EE 组件中使用 Camel Routes

    摘要:你可以通过集成 Camel 和 WildFly 应用服务器(使用 WildFly-Camel 子系统)在 Java EE 组件中开始使用 Apache Camel Routes. [编者按]作者 ...

  5. 使用BeanUtils组件

    使用BeanUtils组件 前提 1:导入commons-beanutils-1.8.3.jar        //根据  本人使用的是1.8.3的版本 2:导入日志包      //就是loggin ...

  6. Java日志组件logback使用:加载非类路径下的配置文件并设置定时更新

    Java日志组件logback使用:加载非类路径下的配置文件并设置定时更新 摘自: https://blog.csdn.net/johnson_moon/article/details/7887449 ...

  7. BeanUtils组件的使用

    BeanUtils能够使我们更方便的进行javabean的赋值操作,它的底层是反射的原理 主要方法有 copyProperties(Object object,String name,String v ...

  8. Java基础组件快速入门

    最近需要上线很多新的JAVA项目,然而很多JAVA的相关库都不太熟悉,项目实现起来遇到了不小阻力,熬了好几天夜.现在手头的工作基本完成了,因此打算好好来归纳下java的相关工具库,将来需要借助你们,好 ...

  9. java日志组件介绍(common-logging,log4j,slf4j,logback )

    转自:http://www.blogjava.net/daiyongzhi/archive/2014/04/13/412364.html common-logging是apache提供的一个通用的日志 ...

随机推荐

  1. css ie6双倍margin现象

    IE6双倍margin bug 当出现连续浮动的元素,携带和浮动方向相同的margin时,队首的元素,会双倍marign. 解决方案: 1)使浮动的方向和margin的方向,相反. 所以,你就会发现, ...

  2. Machine learning吴恩达第三周 Logistic Regression

    1. Sigmoid function function g = sigmoid(z) %SIGMOID Compute sigmoid function % g = SIGMOID(z) compu ...

  3. 吃奶酪 状压dp

    题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入输出格式 输入格式: 第一行一个数n (n<=15) 接下来每行2个实数,表示第i块 ...

  4. JVM架构和GC垃圾回收机制

    深入理解系列之JDK8下JVM虚拟机(1)——JVM内存组成 https://blog.csdn.net/u011552404/article/details/80306316 JVM架构和GC垃圾回 ...

  5. 问题诊断神器arthas

    https://github.com/alibaba/arthas 镜像地址 https://gitee.com/arthas/arthas OGNL https://commons.apache.o ...

  6. oracle--等待事件

    1. Buffer busy waits 从本质上讲,这个等待事件的产生仅说明了一个会话在等待一个Buffer(数据块),但是导致这个现象的原因却有很多种,常见的两种是:当一个会话试图修改一个数据块, ...

  7. btn按钮事件

    1.用Delegate 和 Event 来定义一个通用类来处理事件 (观察者模式) using System.Collections; using System.Collections.Generic ...

  8. Asp.Net webconfig中使用configSections的用法

    最近闲来无事,研究研究公司的框架,无意中打开了webconfig页面,发现了一个我不认识的节点<configSections></configSections>,于是百度之,大 ...

  9. flyway-Maven插件-configuration节点配置详解

    <configuration> <driver>org.hsqldb.jdbcDriver</driver> <url>jdbc:hsqldb:file ...

  10. SVG介绍

    SVG介绍 SVG是指可缩放矢量图(Scalable Vector Graphics).SVG使用XML格式来定义图形.SVG可以直接嵌入到HTML页面中. 位图和矢量图 位图(Bitmap)是由很多 ...