亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring中操作JDBC的方法

發布時間:2021-02-02 14:29:49 來源:億速云 閱讀:170 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關Spring中操作JDBC的方法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

事實上,在Spring中使用JDBC和傳統的JDBC或者一些JDBC框架,如:DBUtils的使用沒有什么區別,所以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的方法”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

太康县| 东源县| 彭山县| 双桥区| 新泰市| 紫阳县| 甘孜县| 喀喇沁旗| 龙川县| 平阳县| 乐至县| 密山市| 崇州市| 乌恰县| 汉川市| 陆川县| 老河口市| 泾川县| 墨玉县| 呼和浩特市| 云梦县| 滕州市| 调兵山市| 石狮市| 霍林郭勒市| 兰考县| 萝北县| 延庆县| 绥德县| 昌邑市| 梁平县| 黄山市| 阿图什市| 郁南县| 廊坊市| 石嘴山市| 琼海市| 邵武市| 望谟县| 阿克陶县| 雷波县|