示例 1、新建項目,把資料庫驅動、DbUtils的jar包添加到項目中 2、新建文件夾resource,標識為資源根目錄,下麵新建資料庫連接的配置文件mysql.properties 3、新建實體類bean.Student DbUtils將結果集中的記錄映射到JavaBean中時,採用的方式和Spr ...
示例
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是一個介面,查詢時處理結果集要用到這個,用來將結果集中的記錄映射到指定的實體類中(JavaBean)。
BaseResultSetHandler是一個抽象類,implements ResultSethandler。要創建結果集處理器的實例,這2個都不能直接創建實例。
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 * 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一樣複雜的操作,操作十分簡便。