Java DbUtils 操作數據庫


 

示例

1、新建項目,把數據庫驅動、DbUtils的jar包添加到項目中

 

2、新建文件夾resource,標識為資源根目錄,下面新建數據庫連接的配置文件mysql.properties

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/my_db?serverTimezone=GMT
user=chy
password=abcd
?serverTimezone=GMT是為了解決時區問題,GMT、UTC均可。

 

3、新建實體類bean.Student

 1 package bean;
 2 
 3 public class Student {
 4     private int id;
 5     private String name;
 6     private int age;
 7     private int score;
 8 
 9     public Student() {
10     }
11 
12     public Student(int id, String name, int age, int score) {
13         this.id = id;
14         this.name = name;
15         this.age = age;
16         this.score = score;
17     }
18 
19     public int getId() {
20         return id;
21     }
22 
23     public void setId(int id) {
24         this.id = id;
25     }
26 
27     public String getName() {
28         return name;
29     }
30 
31     public void setName(String name) {
32         this.name = name;
33     }
34 
35     public int getAge() {
36         return age;
37     }
38 
39     public void setAge(int age) {
40         this.age = age;
41     }
42 
43     public int getScore() {
44         return score;
45     }
46 
47     public void setScore(int score) {
48         this.score = score;
49     }
50 
51     @Override
52     public String toString() {
53         return "Student{" +
54                 "id=" + id +
55                 ", name='" + name + '\'' +
56                 ", age=" + age +
57                 ", score=" + score +
58                 '}';
59     }
60 }

DbUtils將結果集中的記錄映射到JavaBean中時,采用的方式和Spring的設值注入一樣:先調用空參的構造器,再調用setter()方法進行初始化。

所以一定要有空參的構造器、setter()方法,要么不寫構造器,調用默認的空參構造器;如果寫了帶參的構造器,就必須顯示寫空參的構造器。

 

4、新建測試類test.Test

 1 public class Test {
 2     public static void main(String[] args) throws ClassNotFoundException, IOException, SQLException {
 3         //從properties文件中加載數據庫配置
 4         Properties properties = new Properties();
 5         InputStream fis = Class.forName("test.Test").getResourceAsStream("/mysql.properties");
 6         properties.load(fis);
 7         String driver = properties.getProperty("driver");
 8         String url = properties.getProperty("url");
 9         String user = properties.getProperty("user");
10         String password = properties.getProperty("password");
11 
12         DbUtils.loadDriver(driver);   //靜態方法加載驅動
13         Connection connection = DriverManager.getConnection(url, user, password);  //獲取連接
14         QueryRunner queryRunner = new QueryRunner();  //創建QueryRunner對象,增刪查改都要通過QueryRunner對象來完成
15 
16         //查詢
17         String sql = "select * from student_tb where id=?";
18         BeanHandler<Student> studentBeanHandler = new BeanHandler<>(Student.class); //結果集處理器,將結果集中的記錄映射到指定的類中
19         Student student = queryRunner.query(connection, sql, studentBeanHandler, 1);  //執行查詢,將結果集中的記錄映射到JavaBean中,返回的就是目標類型,不必強轉
20         System.out.println(student);   //可通過getter()方法獲取屬性值(對應表中的字段值)
21 
22         DbUtils.close(connection);  //靜態方法關閉連接
23     }
24 }

 

 

 

ResultSetHandler

結果集處理器ResultSetHandler是一個接口,不能直接使用。

(1)使用ResultSetHandler的實現類ScalarHandler

ScalarHandler適合只有一條記錄的結果集,獲取的是該條記錄某個字段的值。

 

(2)ResultSetHandler有一個抽象子類BaseResultSetHandler,BaseResultSetHandler有3個實現類

  • BeanHandler   將結果集中的記錄映射為一個JavaBean,適合結果集中只有一條記錄的情況
  • BeanListHandler   將結果集中的所有記錄映射為一個JavaBean的List集合,一條記錄就是一個元素,就是一個JavaBean。
  • BeanMapHandler  將結果集映射為JavaBean的Map集合

 

增刪查改都是通過QueryRunner對象來實現的:

  • 查:QueryRunner對象.query(數據庫連接,sql語句,結果集處理器,sql語句中的?部分的參數值)
  • 增、刪、改:QueryRunner對象.update(數據庫連接,sql語句,sql語句中?部分的參數值)

說明:

  • 最后一個是個數不確定的參數,可以沒有,也可以有多個,有多個時逗號隔開即可,也可以寫成數組的形式。
  • 如果使用了數據源,可缺省第一個參數數據庫連接。
  • QueryRunner並非像名字中的query一樣只能用於查詢,QueryRunner提供的insert()方法不常用、不方便,插入也要用update()。

 

 

 

查詢

1 //查詢,結果集中只有一條記錄的情況
2         String sql = "select * from student_tb where id=?";
3         BeanHandler<Student> studentBeanHandler = new BeanHandler<>(Student.class); //<>中指定目標類型,()中指定目標類型的class
4         Student student = queryRunner.query(connection, sql, studentBeanHandler,1);  //執行查詢,,返回的就是目標類型,不必強轉
5         System.out.println(student);   //可通過getter()方法獲取屬性值(對應表中的字段值)

 

 

1 //查詢,結果集中只有一條記錄,直接獲取某個字段的值
2         String sql = "select name from student_tb where id=?";
3         ScalarHandler<String> scalarHandler = new ScalarHandler<>();
4         String name = queryRunner.query(connection, sql, scalarHandler,1);  //獲取的是某個字段的值
5         System.out.println(name);

使用BeanHandler封裝為Bean,再使用getter()獲取也行。

 

 

1 //查詢,結果集中有多條記錄的情況
2         String sql = "select * from student_tb";
3         BeanListHandler<Student> studentBeanListHandler = new BeanListHandler<>(Student.class); //要用List
4         List<Student> list = queryRunner.query(connection, sql, studentBeanListHandler);  //返回值的類型是List<目標JavaBean>
5         //遍歷這個list就是遍歷結果集

 

 

 

增、刪、改

1   //插入
2         String sql = "insert into student_tb (name,age,score) values (?,?,?)";
3         //queryRunner.update(connection, sql, "曹操",20,90);  //返回值是int,受影響的記錄數
4         Object[] values = {"曹操",20,90};
5         queryRunner.update(connection, sql,values );  //?部分的參數值也可以寫成數組形式

增、刪、改的用法都差不多,不再一一列舉。

 

 

 

批量操作

語法:QueryRunner對象.batch(數據庫連接,sql語句,Object[][]) ;

最后一個參數是二維數組,一行對應一個sql語句?部分的參數值。

如果使用的是連接池,可缺省第一個參數數據庫連接。

1 //批量插入
2         String sql = "insert into student_tb (name,age,score) values (?,?,?)";
3         Object[][] values = {{"曹操", 20, 90}, {"劉備", 20, 90}, {"孫權", 18, 88}};
4         queryRunner.batch(connection, sql,values);  //批量執行,返回的是int[],一個值對應一個sql語句影響的記錄數

DbUtils的批量操作是批量執行相似的sql語句(只有?部分的值不同)。

 

 

 

使用數據源

 1 //從properties文件中加載數據源配置
 2         Properties properties = new Properties();
 3         InputStream fis = Class.forName("test.Test").getResourceAsStream("/mysqlDataSource.properties");
 4         properties.load(fis);
 5         //String driver = properties.getProperty("driver");  //不必使用driver
 6         String url = properties.getProperty("url");
 7         String user = properties.getProperty("user");
 8         String password = properties.getProperty("password");
 9 
10         //配置數據源
11         MysqlDataSource dataSource=new MysqlDataSource();
12         dataSource.setURL(url);
13         dataSource.setUser(user);
14         dataSource.setPassword(password);
15 
16         //DbUtils.loadDriver(driver);   //數據庫驅動提供的數據源自帶驅動,不用再加載驅動
17         QueryRunner queryRunner = new QueryRunner(dataSource);  //需傳入一個數據源,操作數據庫時會自動獲取連接,不必手動獲取連接
18         String sql = "insert into student_tb (name,age,score) values (?,?,?)";
19         queryRunner.update(sql,"曹操", 20, 90);  //不必傳入連接,會自動從數據源獲取連接

不必手動獲取連接、關閉連接,很方便。

數據庫驅動自帶的數據源、C3P0、DBCP的操作方式差不多,此處不再一一寫出。

 

 

 

Hibernate也是將結果集中的記錄映射為實體對象,相比之下,DbUtils體積極小(只有一個jar包),沒有hql一樣復雜的操作,操作十分簡便。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM