您好,登錄后才能下訂單哦!
Spring中怎么操作JDBC,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
獲取數據庫連接
在這之前,我們首先通過Spring獲得對數據庫的連接,創建一個Java項目,導入Spring、c3p0、數據庫驅動的jar包即可,然后創建一個數據表做測試:
create table user( id integer primary key auto_increment, name varchar(20), password varchar(20) );
接下來創建Spring的配置文件并作如下配置:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 導入資源文件 --> <context:property-placeholder location="classpath:db.properties" /> <!-- 配置C3P0數據源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="${jdbc.user}"></property> <property name="password" value="${jdbc.password}"></property> <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> <property name="driverClass" value="${jdbc.driverClass}"></property> </bean></beans>
測試數據庫連接是否能夠成功獲取:
public class SpringJDBCTest { private ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); @Test public void testConnection() throws SQLException { DataSource dataSource = ctx.getBean(DataSource.class); System.out.println(dataSource.getConnection()); }}
運行結果:
com.mchange.v2.c3p0.impl.NewProxyConnection@5d47c63f
能夠成功獲取到數據庫連接。
對數據表進行更新操作
傳統的JDBC用法相信大家都很熟悉,在Spring中并沒有什么特別的,無非是將Bean的生命周期交給了IOC容器管理,而Spring框架獨立出了一套API用于數據庫操作(JDBCTemplate)。接下來分別測試一下常見的數據庫操作,先將JDBCTemplate類放入容器:
<!-- 將JDBCTemplate放入容器 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean>
該類需要一個參數,參數值指向剛才配置的dataSource即可,這樣我們就能夠使用JDBCTemplate類了,先測試一下插入操作:
@Test public void testInsert() { JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate"); String sql = "insert into user(name,password) values(?,?)"; Object[] args = {"zhangsan","12345"}; jdbcTemplate.update(sql,args); }
執行代碼,查詢表結果,插入成功。
mysql> select * from user;+----+----------+----------+| id | name | password |+----+----------+----------+| 1 | zhangsan | 12345 |+----+----------+----------+1 row in set (0.00 sec)
接著測試一下數據表的修改操作:
@Test public void testUpdate() { JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate"); String sql = "update user set password = ? where id = ?"; Object[] args = {"admin","1"}; jdbcTemplate.update(sql,args); }
執行代碼,查詢表結果,修改成功。
mysql> select * from user;+----+----------+----------+| id | name | password |+----+----------+----------+| 1 | zhangsan | admin |+----+----------+----------+1 row in set (0.00 sec)
數據表的刪除操作與其類似,不做重復測試,接下來我們測試一下批量操作:
@Test public void testBatchInsert() { JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate"); String sql = "insert into user(name,password) values(?,?)"; List<Object[]> batchArgs = new ArrayList(); batchArgs.add(new Object[]{"lisi","123"}); batchArgs.add(new Object[]{"wangwu","1234"}); batchArgs.add(new Object[]{"zhaoliu","12345"}); jdbcTemplate.batchUpdate(sql, batchArgs); }
此時的一個對象數組即為一條記錄,批量操作則需要泛型為Object數組的集合。
執行代碼,查詢表結果,批量插入成功。
mysql> select * from user;+----+----------+----------+| id | name | password |+----+----------+----------+| 1 | zhangsan | admin || 2 | lisi | 123 || 3 | wangwu | 1234 || 4 | zhaoliu | 12345 |+----+----------+----------+4 rows in set (0.00 sec)
最后是數據表的查詢操作,首先創建數據表對應的User類:
package com.wwj.spring.jdbc;public class User { private Integer id; private String name; private String password; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", password=" + password + "]"; }}
編寫測試代碼:
@Test public void testGet() { JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate"); String sql = "select id,name,password from user where id = ?"; RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class); User user = jdbcTemplate.queryForObject(sql, rowMapper,1); System.out.println(user); }
運行結果如下:
User [id=1, name=zhangsan, password=admin]
在Spring中,查詢的結果是交給了RowMapper來處理的,RowMapper用來指定映射結果集行數據的方式,相對于傳統的ResultSet來說,RowMapper省去了遍歷結果集的重復操作,從而使查詢變得更簡單。
而查詢多條數據的方式如下:
@Test public void testGetMore() { JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate"); String sql = "select id,name,password from user where id > ?"; RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class); List<User> userList = jdbcTemplate.query(sql, rowMapper,2); System.out.println(userList); }
運行結果:
[User [id=3, name=wangwu, password=1234], User [id=4, name=zhaoliu, password=12345]]
有些同學可能會想當然地認為,查詢多條數據要調用queryForList()方法,事實上,調用的是query()方法。需要注意的是,JDBCTemplate提供的API不支持級聯屬性。
獲取數據表單列的值:
@Test public void testSingleValue() { JdbcTemplate jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate"); String sql = "select name from user where id = ?"; String name = jdbcTemplate.queryForObject(sql, String.class,1); System.out.println(name); }
運行結果如下:
zhangsan
整個增刪改查的過程其實都沒有任何難度,這和之前學的數據庫操作API區別并不大,所以也沒有特別需要講解的地方,通過一些測試代碼應該就能夠理解了。
使用具名參數
在經典的JDBC用法中,sql參數是用占位符"?"表示,并且受到位置的限制,定位參數的問題在于,一旦改變參數的順序,就必須改變參數的綁定方式。
為了解決這個問題,Spring為我們提供了另一種選擇:使用具名參數。
使用具名參數后,sql將按名稱而不是位置進行指定,具名參數更易于后期維護,也提升了代碼的可讀性,具名參數只在NamedParameterJdbcTemplate類中得到支持。
要想使用具名參數,首先將NamedParameterJdbcTemplate放入容器:
<!-- 將namedParameterJdbcTemplate放入容器 --> <bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"> <constructor-arg ref="dataSource"></constructor-arg> </bean>
該類沒有無參的構造器,通常使用參數為DataSource類型的構造器。
這里以插入數據舉例具名參數的使用:
@Test public void testNamedParameterJdbcTemplate() { NamedParameterJdbcTemplate namedParameterJdbcTemplate = (NamedParameterJdbcTemplate) ctx.getBean("namedParameterJdbcTemplate"); String sql = "insert into user(name,password) values(:name,:psd)"; Map<String, Object> map = new HashMap<String, Object>(); map.put("name", "wangweijun"); map.put("psd", "112233"); namedParameterJdbcTemplate.update(sql,map); }
執行代碼,查詢表結果,插入成功。
mysql> select * from user;+----+------------+----------+| id | name | password |+----+------------+----------+| 1 | zhangsan | admin || 2 | lisi | 123 || 3 | wangwu | 1234 || 4 | zhaoliu | 12345 || 5 | wangweijun | 112233 |+----+------------+----------+5 rows in set (0.00 sec)
雖然具名參數有很多好處,但無形中也增加了很多代碼,可以說比之前的方式更加復雜。
當然,它還有更簡單的實現方式:
@Test public void testSimpleNamedParameterJdbcTemplate() { NamedParameterJdbcTemplate namedParameterJdbcTemplate = (NamedParameterJdbcTemplate) ctx.getBean("namedParameterJdbcTemplate"); String sql = "insert into user(name,password) values(:name,:password)"; User user = new User(); user.setName("zhaoliu"); user.setPassword("223344"); SqlParameterSource paramSource = new BeanPropertySqlParameterSource(user); namedParameterJdbcTemplate.update(sql, paramSource); }
執行代碼,查詢表結果,插入成功。
mysql> select * from user;+----+------------+----------+| id | name | password |+----+------------+----------+| 1 | zhangsan | admin || 2 | lisi | 123 || 3 | wangwu | 1234 || 4 | zhaoliu | 12345 || 5 | wangweijun | 112233 || 6 | zhaoliu | 223344 |+----+------------+----------+6 rows in set (0.00 sec)
這種方式實現了通過對象自動匹配具名參數,前提是具名參數的參數名要和類中的屬性名相同,該方式相對于第一種方式要更合理一些,因為從前臺傳遞過來的就是對象,這樣就可以直接通過對象進行處理而無需其它操作。
看完上述內容,你們掌握Spring中怎么操作JDBC的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。