我们知道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(url, user, password);
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 内容
加载内容(默认加载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
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
其实任何的所谓框架,都是离不开像jdbc这样底层的技术的,我们不能因为框架的好用,方便,易学而忽视最基础的东西,这恰恰是一种阻碍你精通某一技术的障碍。而且框架也不是万能的,有很多像性能,拓展性的弱点,我们需要做的就是在学高度封装的技术时也不忘其底层的实现