前言
先說一下原生JDBC的弊端:
1、數據庫連接對象、sql語句操作對象、封裝結果集對象,重複定義
2、封裝數據的代碼重複,而且操作複雜,代碼量大
3、釋放資源的代碼重複。
總結:開發的時候有大量重複勞動,開發週期長,效率低
在涉及mybatis框架之前,先學習一下輕量方便的dbutils框架也是很有必要的,比如小型的管理系統之類的,不需要java代碼和sql語句分離,sql語句也不復雜的情況下dbutils就派上用場了。
dbutils是什麼
Commons DbUtils是Apache組織提供的一個對JDBC進行簡單封裝的開源工具類庫,使用它能夠簡化JDBC應用程序的開發,同時也不會影響程序的性能。 (採自百度百科)
說白了dbutils就是一個封裝了原生jdbc很多操作(增刪改查)的工具類。
比如原生jdbc查詢數據需要將結果集ResultSet遍歷、取數據、封裝成bean等等繁瑣的工作, 而dbutils直接一個query()方法就可以將數據集封裝到指定對象的List<>中。
實例
CRUD都主要通過一個類QueryRunner,主要用到的方法就是query()以及update()。
下面直接上代碼,代碼裏面的註釋已經很清晰明白了。
數據源來自c3p0:
<named-config name="user">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/mydata</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="acquireIncrement">5</property><!-- 如果池中數據連接不夠時一次增長多少個 -->
<property name="initialPoolSize">100</property>
<property name="maxPoolSize">1000</property>
</named-config>
獲得數據源的方法就一行代碼:
private static DataSource dataSource=new ComboPooledDataSource("user");//數據源:C3P0連接池
查詢稍微複雜點,分爲三種:查詢一條數據、查詢數據集、查詢指定字段某一個數據。
查詢一條數據:
@Test
public void queryBean() throws SQLException{
QueryRunner queryRunner=new QueryRunner(dataSource);
User user=queryRunner.query("select * from user where id=5",new BeanHandler<User>(User.class));
System.out.println(user);
}
注:BeanHandler實現類返回一個bean對象。
運行截圖:
查詢數據集:
@Test
public void dbUtilsQuery() throws SQLException {
QueryRunner queryRunner=new QueryRunner(dataSource);//這裏可以不寫數據源,這樣在下面query()|update()方法中加上
//Connection參數
String sql="select * from user";
List<User> users=queryRunner.query(sql,new BeanListHandler<User>(User.class));//將查詢出來的數據轉換爲User實體列表
for(User u:users){
System.out.println(u);
}
}
注:BeanListHandler實現類返回Bean對象的List。
運行截圖:
查詢某一個數據:
//使用new ScalarHandler()實現類查詢單個數據,比如這裏查詢有多少條數據count(*)
public Long querySize() throws SQLException{
QueryRunner queryRunner=new QueryRunner(dataSource);
Long size=queryRunner.query("select count(*) from user",new ScalarHandler<Long>());
//System.out.println(size);
return size;
}
注:ScalarHandler 實現類返回某個數據。
由於此方法後面要調用,所以把@Test註解去掉了,運行結果截圖就省略了。
修改:
@Test
public void modify() throws SQLException{
QueryRunner queryRunner=new QueryRunner(dataSource);
int i=queryRunner.update("update user set age=35 where name=?","chen");//和preparedStatement同樣的操作
//update(sql,參數1,參數2...)
if(i>=1) {
queryBean();
}
}
運行截圖:
插入:
@Test
public void insert() throws SQLException{//批量插入數據
QueryRunner queryRunner=new QueryRunner(dataSource);
Object [][]params=new String[5][3];//這裏的5表示插入5條數據,3表示3個字段(id,name,age)
int size=querySize().intValue();
System.out.println(size);
for(int i=1;i<=5;i++){//之所以要[i-1]是因爲i=1開始的,i=5過後要下標越界
params[i-1][0]=size+i+" ";
params[i-1][1]="dbutil"+(size+i);
params[i-1][2]= (int)(Math.floor(Math.random()*10+20))+" ";//隨機生成年紀20-30歲
}
int result[]=queryRunner.batch("insert into user(id,name,age) values(?,?,?)",params);
if(result!=null){
System.out.println("插入成功~");
}
}
運行截圖:
刪除的操作同修改,只是改一下sql語句就行了。
所以說dbutils用起來還是很方便的。
原創:https://blog.csdn.net/qq_37094660/article/details/95206941