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. 2016级算法第五次上机-E.AlvinZH的学霸养成记IV

    1039 AlvinZH的学霸养成记IV 思路 难题,最大二分图匹配. 难点在于如何转化问题,n对n,一个只能攻击一个,判断是否存在一种攻击方案我方不死团灭对方.可以想到把所有随从看作点,对于可攻击的 ...

  2. Eclipse Alt + / 快捷键失效

    需要重新设置快捷键.按快捷键ctrl+shirt+L,然后在按一下L.设置快捷键的对话框就出来了,然你将Word Completion移除,在将Content Assist 这个设置为alt+/.就可 ...

  3. Linux Mint下FireFox安装Adobe Flash Player

    最近在为自己的家里一台很老的机子(由于微软不再支持windows,windows10什么的不是这个老机子可以带的起来的233)选择一个合适的linux系统安装.看来看去,最终选择了排行很靠前,感觉也不 ...

  4. PyCharm 通过Github和Git上管理代码

    1.最近希望通过github来管理代码,记录下pycharm上的设置,以下是针对windows版本.mac版本略有却别 如图所示 file-settings-Version Control-GitHu ...

  5. Linux C代码 获取IP地址

    Ubuntu 16.04下,可编译通过: #include <stdio.h> #include <ifaddrs.h> #include <arpa/inet.h> ...

  6. proxy的作用

    get() get方法用于拦截某个属性的读取操作,可以接受三个参数,依次为目标对象.属性名和 proxy 实例本身(严格地说,是操作行为所针对的对象),其中最后一个参数可选. get方法的用法,上文已 ...

  7. 【Nginx】关于域名转发proxy_pass

    在配置nginx的时候,有一个需求,访问m.XXX.com的时候,需要实际访问www.YYY.com/m,并且域名不能发生变化. 达成这个需求有两种做法: 第一种就是301跳转,使用rewrite来跳 ...

  8. MySQL按照月进行统计

    MySQL按照月进行统计 今天需要后台提供一个按月统计的API.所以查了一下SQL语句的实现方法. 按月统计SQL select date_format(createtime, '%Y-%m') as ...

  9. uwsgi错误invalid request block size

    uwsgi错误invalid request block size 今天使用uwsgi启动django代码,然后打开浏览器输入http://localhost:8000/admin.后台出现下面错误 ...

  10. GridView 基本使用

    项目中实例一 <asp:GridView ID="gvBatchReceive" runat="server" AutoGenerateColumns=& ...