DBUtils和BeanUtils

1. BeanUtils组件
什么是Javabean?
Javabean,是一个对象(cn.itcat.entity 包下所有的类都是 !
Javabean作用:封装数据/业务

Javabean要满足下面特点:
1.必须有无参数构造函数
2. get或者set方法
如何操作javabean?
方式1:
User user  = new User();
User.setId(…);  设置值
User.getId();   获取值

方式2:反射
操作麻烦!

方式3:
程序中操作javabean,比较频繁! 无处不在!
可以使用apache提供的开源组件: BeanUtils操作javabean!

BeanUtils使用 Apache提供简化javabean操作的组件!

组件使用步骤:
1.下载组件,项目中引入组件(jar)
commons-beanutils-1.8.3.jar
commons-logging-1.1.3.jar
2. (配置)
3. Api  (如何使用)

组件使用:
1.对象属性的拷贝
BeanUtils.copyProperty(user, "id" ,id);
2.对象的拷贝
BeanUtils.copyProperties(newUser,user);
3. map数据拷贝到对象中
BeanUtils.populate(user, map);
注意:如果项目缺少jar文件,会报错:
java.lang.NoClassDefFoundError:org/apache/commons/logging/LogFactory
//BeanUtils组件
public class App{

// 1.对象属性的拷贝
@Test
public voidtest_copyProperties() throws Exception{
//模拟:从表单中获取的数据
int id=100;   //模拟request.getParameter("id");
String name ="Jack";
double salary =5000;
//新操作方式:使用组件
User user = newUser();
BeanUtils.copyProperty(user, "id" ,id);
BeanUtils.setProperty(user, "name" ,name);
BeanUtils.copyProperty(user, "salary" ,salary);
System.out.println(user);
}
// 2.对象的拷贝
@Test
public voidtest_copyBean() throws Exception{
int id=100;   //模拟request.getParameter("id");
String name ="Jack";
double salary =5000;
//对象
User user = newUser();
user.setId(id);
user.setName(name);
user.setSalary(salary);
//新对象
User newUser =new User();
BeanUtils.copyProperties(newUser,user);
System.out.println(newUser);
}
// 3. map数据拷贝到对象中
@Test
public voidtest_copyMap2Bean() throws Exception{
// map对象  【Map map =request.getParameterMap();】
Map map = newHashMap();
map.put("id",1000);
map.put("name","Jack");
map.put("salary", 1000);
//map拷贝到对象中
User user = newUser();
BeanUtils.populate(user, map);
//测试
System.out.println(user);
}
}
日期类型转换器:

//BeanUtils组件
public classApp2 {

//1.使用提供的日期类型转换器完成日期转换
@Test
public voidtest_copyProperties() throws Exception{
int id=100;   
String name ="Jack";
double salary =5000;
String birth ="1990-09-09";
User user = newUser();
BeanUtils.copyProperty(user, "id","100");
// 拷贝生日字段:(String 能否自动转换为日期类型?)   不能
//BeanUtils.copyProperty(user, "birth",birth);
//解决:注册日期类型转换器
ConvertUtils.register(new DateLocaleConverter(),Date.class);
//再实现String拷贝到Date中
BeanUtils.copyProperty(user, "birth",birth);
System.out.println(user);
}
//2:自定义日期类型转换器
@Test
public voidtest_copyProperties2() throws Exception{
int id=100;   
String name ="Jack";
double salary =5000;
// String birth= "1990-09-09";  //OK
String birth = "   ";    //NOK
// String birth= null;    //OK
User user = newUser();
BeanUtils.copyProperty(user, "id","100");
//解决1:注册日期类型转换器
//ConvertUtils.register(new DateLocaleConverter(),Date.class);
//解决2:自定义日期类型转换器
ConvertUtils.register(new Converter(){
public Objectconvert(Class type, Object value) {
// 什么类型的属性需要转换?  日期
if (type !=Date.class) {
returnnull;
}
//数值判断
if (value ==null || "".equals(value.toString().trim())) {
returnnull;
}
try{
//转换
SimpleDateFormatsdf = new SimpleDateFormat("yyyy-MM-dd");
returnsdf.parse(value.toString());
} catch(ParseException e) {
throw newRuntimeException(e);
}
}
},Date.class);
BeanUtils.copyProperty(user, "birth",birth);
System.out.println(user);
}
}
2.JDBC中元数据类型
元数据:数据库、表、列的定义信息。
数据库元数据
DatabaseMetaDatametaData = con.getMetaData();
参数元数据库
ParameterMetaData pmd =pstmt.getParameterMetaData();
结果集元数据
  ResultSetMetaData rmd = rs.getMetaData();
注意:
通过结果集元数据,就可以获取当前执行的sql中的列个数、列名称!


3.通用操作封装

//工具类
public classJdbcUtils {
//数据库连接参数
private staticString driverClass = "com.mysql.jdbc.Driver";
private staticString url = "jdbc:mysql://localhost:3306/day16";
private staticString user = "root";
private staticString password = "root";
// 初始化参数 (alt + shift +a )
private staticConnection con = null;                 
private staticPreparedStatement pstmt = null;          
private staticResultSet rs = null;                   
                                             
public staticConnection getConnection(){
try{
Class.forName(driverClass);
returnDriverManager.getConnection(url, user, password);
} catch(Exception e) {
throw newRuntimeException(e);
}
}
// 2.释放资源 
public staticvoid closeAll(Connection con, Statement stmt, ResultSet rs){
try{
if (rs != null){
rs.close();
rs =null;
}
if (stmt !=null) {
stmt.close();
stmt = null; //优先会被回收
}
if (con != null){
con.close();
con =null;
}
} catch(Exception e) {
throw newRuntimeException(e);
}
}
public staticList query(String sql,Classclazz,Object...paramValues){
//返回的集合
List list = newArrayList();
try{
//1.获取连接
con =JdbcUtils.getConnection();
//2.创建执行命令的对象
pstmt =con.prepareStatement(sql);
//设置sql中占位符对应的值
if (paramValues!= null && paramValues.length >0) {
//占位符参数个数
int paramCount =pstmt.getParameterMetaData().getParameterCount();
//设置每一个参数值
for (inti=0;i
pstmt.setObject(i+1,paramValues[i]);
}
}
//3.执行查询,得到结果集
rs =pstmt.executeQuery();
//获取结果集元数据
ResultSetMetaData rmd =rs.getMetaData();
//列个数
int columnCount= rmd.getColumnCount();
//4.遍历结果集
while(rs.next()) {
//创建对象
T obj =clazz.newInstance();
//遍历结果集中每一行的,每一列
for (int i=0;i
//获取列名称
StringcolumnName = rmd.getColumnName(i+1); 
//获取列值
ObjectcolumnValue = rs.getObject(columnName);
//把列名称对应的值,设置到对象的属性中! (要求:列名称,要与属性名一样!)
BeanUtils.copyProperty(obj, columnName,columnValue);// 列名称作为属性名称!
}
// 当前对象封装结束,添加到list中
list.add(obj);
}
returnlist;
} catch(Exception e) {
throw newRuntimeException(e);
} finally{
closeAll(con,pstmt, rs);
}
}
}
 


public classWebUtils {

public staticvoid copyToBean_back(HttpServletRequest request, User user){
try{
//获取请求参数名称
Enumerationenums = request.getParameterNames();
ConvertUtils.register(new DateLocaleConverter(),Date.class);
//遍历
while(enums.hasMoreElements()) {
//获取每一个表单元素名称(
String name =enums.nextElement();  // 作为user的属性名称
//获取对应的值
String value =request.getParameter(name);
//设置到对象中
BeanUtils.copyProperty(user, name,value);
}
} catch(Exception e) {
throw newRuntimeException(e);
}
}
public static TcopyToBean(HttpServletRequest request, Class clazz){
try{
//创建需要封装的对象
T t =clazz.newInstance();
//日期类型转换器
ConvertUtils.register(new DateLocaleConverter(),Date.class);
//把请求数据的map,直接拷贝到对象中
BeanUtils.populate(t,request.getParameterMap());
returnt;
} catch(Exception e) {
throw newRuntimeException(e);
}
}

}



public classUserServlet extends HttpServlet {

public voiddoPost(HttpServletRequest request, HttpServletResponseresponse)
throwsServletException, IOException {
//方式1: 
//把请求数据,自动封装到javabean中
// User user =new User();
//WebUtils.copyToBean(request,user);
//方式2:使用泛型优化,便于调用
User user =WebUtils.copyToBean(request,User.class);
//测试
System.out.println(user);
}

}

Jdbc操作,代码重复比较多!固定步骤!
Apache也提供对jdbc操作简化的组件,DbUtils组件!

4.DbUtils组件
DbUtils,简化jdbc操作!   (JdbcUtils.
Apache提供的开源产品!

使用步骤:
1.下载组件引入jar文件
commons-dbutils-1.6.jar
2.Api
DbUtils   定义了加载驱动、关闭资源的一些方法
QueryRunner 封装jdbc对数据库的常用操作


|-- QueryRunner   
创建方式:
QueryRunner()
Constructor forQueryRunner.

QueryRunner(DataSource ds)

注意:
创建的时候可以传入DataSource对象,如果传入这个对象,使用其下所有方法操作数据库的时候,就不用传入Connection对象; 否则,就需要传入Connection对象!



更新方法:
intupdate(Connection conn, String sql)  更新,适合于sql语句没有参数的情况
intupdate(Connection conn, String sql, Object... params)
更新,可以传入多个参数
intupdate(Connection conn, String sql, Object param)
更新,传入一个参数

注意:
如果创建QueryRunner是通过无参数构造器创建,必须传入Connection对象!

int[]batch(Connection conn, String sql, Object[][] params)
批处理操作




查询方法:
Tquery(Connection conn, String sql, ResultSetHandlerrsh)
查询
Tquery(Connection conn, String sql, ResultSetHandler rsh, Object...params)
查询,带参数查询


|-- interface ResultSetHandler   结果集处理器
Thandle(ResultSet rs)     处理方法

1. 自己写结果集处理器, 自己封装结果
关键点:
Class MyClass  implements ResultSetHandler




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值