理解dbutils对jdbc的封装

        我们知道jdbc是一种使用java代码发送sql语句的技术,虽然近些年来,随着像hibernate,mybatis等优秀方便程序员开发的ORM框架的出现,jdbc技术逐渐淡出人们的视野,但是由于jdbc能给予最高能动性于程序员,能够发挥最高的性能等特点,一些需要定制优化性能的场景常常需要jdbc,毕竟ORM框架是面对对象的,性能,定制性不如jdbc。jdbc虽好,但由于很底层,发送sql语句进行操作数据时很是繁琐,例如如果要查询数据,必须要将查询在Resultset的字段数据逐一遍历,再封装到类对象中。这时候,dbutils的出现就是要减轻这种繁琐,而又保留了jdbc高性能的特点。下面是结合jdbc核心API谈谈dbutils的实现,帮助大家更好地理解jdbc和dbutils

        下面是jdbc能够向数据库发送sql语句的步骤:

1:注册驱动,并连接上数据库

Driver driver = new com.mysql.jdbc.Driver();

DriverManager.registerDriver(driver);

2.连接到具体的数据库

private String url = "jdbc:mysql://localhost:3306/day17";  // jdbc协议:数据库子协议:主机:端口/连接的数据库

private String user = "root";//用户名

private String password = "root";//密码

Connection conn = DriverManager.getConnection(urluserpassword);

3.查询数据

Statement stmt = conn.createStatement();

//准备sql

String sql = "SELECT * FROM student";

//执行sql

ResultSet rs = stmt.executeQuery(sql);

//遍历结果

while(rs.next()){

int id = rs.getInt("id");

String name = rs.getString("name");

String gender = rs.getString("gender");

System.out.println(id+","+name+","+gender);

}

4.关闭连接

 

if(stmt!=null)

try {

stmt.close();

} catch (SQLException e) {

e.printStackTrace();

throw new RuntimeException(e);

}

if(conn!=null)

try {

conn.close();

} catch (SQLException e) {

e.printStackTrace();

throw new RuntimeException(e);

}


          我们可以看到,jdbc整个过程还是挺繁琐的,下面我们看看dbutils的使用(结合c3p0 jdbc连接池)

1.加载src目录下的c3p0-config.xml文件(此过程和jdbc建立和数据库的连接过程相类似,不过这种加载xml的方式更加灵活,方便)

    c3p0-config.xml 内容

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/project</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">5</property>
<property name="minPoolSize">1</property>
<property name="acquireIncrement">2</property>
</default-config>
</c3p0-config>

      加载内容(默认加载src目录下的c3p0-config.xml文件)

             private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
/**
* 获取数据源 
* @return 数据源
*/
public static ComboPooledDataSource getDataSource() {
return dataSource;
}

2.利用数据源进行查询数据(Course)

try {
QueryRunner queryRunner=new QueryRunner(JdbcUtil.getDataSource());
String sql="select * from course where cID=?";
Course course = queryRunner.query(sql,new BeanHandler<Course>(Course.class),cID);
return course;
} catch (SQLException e) {
e.printStackTrace();
}
return null;

}


    好了,jdbc和dbutils两个查询例子相类似,明显dbutils的更简洁,更加面向对象。那我们现在主要分析dbutils例子中每一步的作用,首先是加载配置文件,在这一步,是c3p0连接池的API起到了加载的作用,这样就建立起和数据库的连接了,里面的参数大家看上去也一目了然的,就不必多说了,此步骤后,不仅和数据库建立起了连接,而且c3p0还帮助我们管理连接到数据库的线程,很是方便。然后QueryRunner queryRunner=new QueryRunner(JdbcUtil.getDataSourse)这一步可以理解为把与数据库的连接赋予了QueryRunner这个API,QueryRunner实例就可以利用这能力胡作非为了,queryRunner.query(sql,new BeanHandler<Course>(Coure.class),cID)这句就是把course字段数据从数据库查询出来,而且自动封装成course对象,超级方便的是不?但前提是数据库的course字段名字和程序中字段变量名字要一一对应。说回用jdbc实现这类查询功能时,很是麻烦,dbutils直接一步到位,其实底层还是要jdbc帮忙的!大概的原理就是,通过查询出来的字段数据和反射技术的结合实现的!

     其实任何的所谓框架,都是离不开像jdbc这样底层的技术的,我们不能因为框架的好用,方便,易学而忽视最基础的东西,这恰恰是一种阻碍你精通某一技术的障碍。而且框架也不是万能的,有很多像性能,拓展性的弱点,我们需要做的就是在学高度封装的技术时也不忘其底层的实现




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值