理解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 内容




com.mysql.jdbc.Driver
jdbc:mysql://127.0.0.1:3306/project
root
root
5
5
1
2


      加载内容(默认加载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.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(Coure.class),cID)这句就是把course字段数据从数据库查询出来,而且自动封装成course对象,超级方便的是不?但前提是数据库的course字段名字和程序中字段变量名字要一一对应。说回用jdbc实现这类查询功能时,很是麻烦,dbutils直接一步到位,其实底层还是要jdbc帮忙的!大概的原理就是,通过查询出来的字段数据和反射技术的结合实现的!

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




你可能感兴趣的:(理解dbutils对jdbc的封装)