请各位高手给我详细说下DButil 。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请各位高手给我详细说下DButil 。相关的知识,希望对你有一定的参考价值。

首先嘛,DBUTIL顾名思义就是DB的一个帮助。它的出现是因为在程序中有过多的JDBC重复代码。DBUTIL就是将这些重复代码抽取出来。简单的来说,就是对JDBC的一个简单封装。
DBUTIL的优点就是:简洁,简单;而他的缺点则是没有对事务提交进行封装。
使用时,先要重写DataSoure,继承BasicDataSource类,这个类主要是用来得到数据库连接。然后使用QueryRunner来关联。
DBUTIL中会需要实现ResultSetHandler接口,他的子类有很多,列如BeanList,Bean,List...这样就能满足客户端的不同需求。
这里用BeanListHandler来举例。
DBUTIL中使用元数据与Bean实现动态赋值。将元数据实现动态匹配。并根据所传过来的handler来对Result进行封装。例如这里用BeanList来举例,它会将Result利用反射机制封装成BeanList返回。
DBUTIL是对JDBC的一种简单的封装,他比JDBC更简洁,简单。使用起来只需要写好语句不用在意繁琐的代码实现。
从DBUTIL中你应该能体验到元数据,反射,泛型,变长参数的应用。还有代码尽量精简。
呵呵,纯手打。请采纳。
参考技术A Apache 的Dbutil是一个非常好用的工具,尤其在它可以很方便的把JDBC中SELECT语句的结果集rs转化为任何我们想要的数据类型。
以下为示例:

public XsModel getByID(String xh)throws SQLException
XsModel model=null;
ResultSet rs=null;
StringBuffer sql=new StringBuffer();
try
//获取SQL
sql.append("select * from xsxxb where xh='");
sql.append(xh);
sql.append("'");

rs = bean.excutequery(sql.toString());
if(rs.next())


model=(XsModel) this.getModelBySql(sql.toString(),XsModel.class);//通过Dbutil把r
s变为Model


catch(SQLException e)
e.printStackTrace();

finally
if(rs!=null)
rs.close();
rs=null;


return model;


/*通过Apache dbutil直接得到model
注意参数中的beanClass是你想要转换的类型名
注意query的参数中有个ResultsetHandler,ResultsetHandler是个接口,实现此接口的方法很多(详见commons DbUtils 1.2 API)在调用时用其中一种即可
在以下函数中使用了BeanHandler
在getByID函数中调用了此函数
*/
public Object getModelBySql(String sql,Class beanClass) throws SQLException

Object model=null;
QueryRunner qr = new QueryRunner();
model=qr.query(bean.getConnection(),sql,new BeanHandler(beanClass));
//model=qr.query(bean.getConnection(),sql,new ArrayHandler());
return model;


程序中全部代码:
本例中用的是oracle数据库,数据库中有表xxssb,所含字段Xmodel.java中有。
1、dbutil出现的原因:
a、大量的重复代码
b、jdbc的简单封装
c、使用策略模式可以生成不同的返回类型

2、技术要点:
a、反射
b、泛型
c、元数据
d、可变参数

3、流程:
1、客户端调用query方法,进入该方法首先使用工厂模式创建一个数据库连接对象,这样的好处是隐藏了new的关键字,
并且代码的扩展性很强,改变了具体的实现类不影响系统的构架,

2、通过适配器模式(adaper)来兼容了一些查询的功能,这样可以使客户调用起来更方便,然后又通过一个工厂模式
得到了一个预处理对象,得到对象之后把这个预处理对象填充条件(问号),如果可变参数没有值的话则直接返回,
否则把可变参数的值一一设置到预处理对象中。

3、这里又使用了策略模式来解决了返回类型,它可以取决与客户需要的是set还是list、或者是map类型,然后创建了一
个集合。通过反射技术来得到属性类的所有信息,像set、get方法和字段,之后通过结果集的元数据来得到表中的列信息,
把属性和数据库中的列一一对应,这样是防止了表中的列和属性类中的属性顺序不一样而判断的。

4、最后才创建bean,首先使用了反射机制来生成一个对象,然后处理的数据的类型,处理完之后调用了属性类中的set方
法把相应的值设置的属性中,然后把每一个对象都设置好封装成一个bean,最后把这些bean存放到集合(set、list),
或者map中返回。

它呢就相当与jquery和js的关系,这里是dbutil和的jdbc,如果要进一步了解就加Q296307031
参考技术B DBUtil是做JDBC连接数据库的时候, 开发人员为了避免重写取得和关闭 connection 等于数据库操作又关的代码,自己写的一个工具类。 参考技术C 是自己写的类,从名字上看应该是负责连接数据库用的 参考技术D 如果你不想用DButil的话,可以试试直接用JDBC,当你直接用JDBC后,很多时候,会有不少的重复代码,

到那个时候,你就发现DButil是有用的,相对而言,也是设计良好的。

请解说下CompareTo()与Compare()详细工作原理

下面是我编写参照学习资料编写的一个程序,请详细说下CompareTo()它是点样进行排序的,还有Compare()详细工作原理,已经没什么分可给了,麻烦各位可以为我解答,小弟在此谢过!

class Person:IComparable

public string Name;
public int Age;
public Person(string name, int age)

Name = name;
Age = age;

public int CompareTo(object obj)

Person otherPerson = obj as Person;
return this.Age - otherPerson.Age;



class PersonComparerName : IComparer

public static IComparer Default = new PersonComparerName();
public int Compare(object x, object y)

return Comparer.Default.Compare(((Person)x).Name, ((Person)y).Name);



class Program

static void Main(string[] args)

ArrayList list = new ArrayList();
list.Add(new Person("abc", 22));
list.Add(new Person("aad", 21));
list.Add(new Person("aba", 23));
list.Add(new Person("bcg", 27));

list.Sort();//我知道这里对list按age大小进行了排序,请解释这是点样进行的
//这里进行了list按字母进行排序,也请详细解释下,就它两工作原理我不太明白
list.Sort(PersonComparerName.Default);
for (int i = 0; i <= list.Count - 1; i++)

Console.Write("0 1 ", ((Person)list[i]).Name, (list[i] as Person).Age);

Console.ReadKey();

1.其内部排序算法你不用管,如果你真想知道,请自己google“七大排序算法”,微软内部算法也不会超过7个范围

2.有关Compare的解释是不管是使用那个排序算法,你都需要比较规则,你这里就是给的比较规则,实际你自己想一下就明白了,不管算法上怎么排序,但是我总需要给出两个物品的比较的结果“大于,小于,等于”,知道这个结果了,你哪怕用最原始的冒泡排序也可以排出来
参考技术A

    compareTo(Object o)方法是java.lang.Comparable<T>接口中的方法,当需要对某个类的对象进行排序时,该类需要实现Comparable<T>接口的,必须重写public int compareTo(T o)方法,比如MapReduce中Map函数和Reduce函数处理的 <key,value>,其中需要根据key对键值对进行排序,所以,key实现了WritableComparable<T>接口,实现这个接口可同时用于序列化和反序列化。WritableComparable<T>接口(用于序列化和反序列化)是Writable接口和Comparable<T>接口的组合;

    compare(Object o1,Object o2)方法是java.util.Comparator<T>接口的方法,它实际上用的是待比较对象的compareTo(Object o)方法。

以上是关于请各位高手给我详细说下DButil 。的主要内容,如果未能解决你的问题,请参考以下文章

DbUtil

python的dbutil

DBUtil

如何从 h2 数据库中获取字符串(Java、DBUtil)

DBUtil简单代码实现

DBUtil以及对static的理解