Spring知識點總結(五)Spring整合JDBC
1. 回顧JDBC
a. java操作關係型資料的API。匯入相關資料庫的驅動包後可以通過JDBC提供的介面來操作資料庫。
b. 實現JDBC的六個步驟
註冊資料庫驅動
獲取資料庫連線
獲取傳輸器物件
傳輸sql執行獲取結果集物件
遍歷結果集獲取資訊
關閉資源
c. 資料庫連線池(資料來源)
C3P0連線池
2.Spring整合JDBC
a. 匯入相關開發包
b. 將資料來源交於Spring管理
3.Spring中的JDBC模板類
使用模板類,能夠極大的簡化原有JDBC的程式設計過程,讓資料庫操作變得簡單.
a. 在Spring中配置JDBC模板類
b. 使用JDBC模板類實現增刪改查
1 @Test 2 public void test02() throws SQLException{ 3 DataSource source = (DataSource) context.getBean("dataSource"); 4 Connection conn = source.getConnection(); 5 PreparedStatement ps = conn.prepareStatement("select * from users"); 6 ResultSet rs = ps.executeQuery(); 7 while(rs.next()){ 8 int id = rs.getInt("id"); 9 String name = rs.getString("name"); 10 int age = rs.getInt("age"); 11 User user = new User(id,name,age); 12 System.out.println(user); 13 } 14 } 15 16 @Test 17 public void test03() throws SQLException{ 18 JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate"); 19 List<Map<String,Object>> list = jdbcTemplate.queryForList("select * from users"); 20 System.out.println(list); 21 } 22 @Test 23 public void test04() throws SQLException{ 24 JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate"); 25 SqlRowSet srs = jdbcTemplate.queryForRowSet("select * from users where id = ?",2); 26 srs.next(); 27 System.out.println(srs.getString("name")); 28 } 29 @Test 30 public void test05() throws SQLException{ 31 JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate"); 32 int n = jdbcTemplate.update("insert into users values (null,?,?)", "ddd",23); 33 System.out.println("修改成功,影響到的行數為:"+n); 34 } 35 @Test 36 public void test06() throws SQLException{ 37 JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate"); 38 int n = jdbcTemplate.update("update users set age = ? where id = ?", 33,4); 39 System.out.println("修改成功,影響到的行數為:"+n); 40 } 41 @Test 42 public void test07() throws SQLException{ 43 JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate"); 44 int n = jdbcTemplate.update("delete from users where id = ?", 4); 45 System.out.println("修改成功,影響到的行數為:"+n); 46 }
c. 使用RowMapper封裝bean
RowMapper介面定義了物件到列的對映關係,可以幫助我們在查詢時自動封裝bean。
1 public class UserRowMapper implements RowMapper<User> { 2 3 @Override 4 public User mapRow(ResultSet rs, int i) throws SQLException { 5 User user = new User(); 6 user.setId(rs.getInt("id")); 7 user.setName(rs.getString("name")); 8 user.setAge(rs.getInt("age")); 9 return user; 10 } 11 12 } 13 14 /** 15 * 使用RowMap封裝bean 16 */ 17 @Test 18 public void test08(){ 19 JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate"); 20 List<User> list = jdbcTemplate.query("select * from users",new UserRowMapper()); 21 System.out.println(list); 22 } 23 /** 24 * 使用RowMap封裝bean 25 */ 26 @Test 27 public void test09(){ 28 JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate"); 29 User user = jdbcTemplate.queryForObject("select * from users where id = ?",new UserRowMapper(),2); 30 System.out.println(user); 31 }
d. 使用BeanPropertyRowMapper自動進行對映
BeanPropertyRowMapper內部可以使用指定類進行反射(內省)來獲知類內部的屬性資訊,自動對映到表的列。使用它一定要注意,類的屬性名要和對應表的列名必須對應的上,否則屬性無法自動對映。BeanPropertyRowMapper底層通過反射(內省)來實現,相對於之前自己寫的RowMapper效率比較低。
1 /** 2 * 通過BeanPropertyRowMapper實現自動封裝bean 3 */ 4 @Test 5 public void test10(){ 6 JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate"); 7 List<User> list = jdbcTemplate.query("select * from users", new BeanPropertyRowMapper(User.class)); 8 System.out.println(list); 9 } 10 /** 11 * 通過BeanPropertyRowMapper實現自動封裝bean 12 */ 13 @Test 14 public void test11(){ 15 JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate"); 16 User user = jdbcTemplate.queryForObject("select * from users where id = ?", new BeanPropertyRowMapper(User.class),2); 17 System.out.println(user); 18 }