目錄
- 一、Spring JDBC概述
- 1、Spring JDBC需要配置的依賴
- 2、Spring配置項文件配置
- 二、Spring JDBC的使用
- 1、Spring JDBC的增加操作
- 2、Spring JDBC的修改操作
- 3、Spring JDBC的刪除操作
- 4、Spring JDBC的查詢操作
- 三、Spring JDBC的事務
- 1、xml的形式進行事務
- 2、@Transactional注解
一、Spring JDBC概述
Spring Data JDBC 是 Spring Data 項目的一部分,它提供了一種簡化的數據訪問方式,用于與關系型數據庫進行交互。與傳統的 ORM 框架相比,Spring Data JDBC 更加輕量級,并且更注重直接映射數據庫表結構和 SQL 查詢的控制。它基于 JDBC 驅動程序,提供了一套簡潔的 API 和注解,使開發人員能夠通過簡單的 Java 對象來表示數據庫表,并通過自動生成的 SQL 語句執行常見的 CRUD 操作。Spring Data JDBC 還支持復雜的關聯關系、查詢方法的定義和自定義 SQL 查詢等功能,使開發人員能夠更靈活地操作數據庫。
1、Spring JDBC需要配置的依賴
我們創建好maven項目之后,需要對maven項目添加相對應的依賴,在本文章當中如果我們想要使用Spring JDBC的時候需要添加如下的依賴 :
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.21</version></dependency><!--mysql驅動包--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!--AOP聯盟--><dependency><groupId>aopalliance</groupId><artifactId>aopalliance</artifactId><version>1.0</version></dependency><!--Spring Aspects--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.0.2.RELEASE</version></dependency><!--aspectj--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.3</version></dependency>
其中使用jdbc的核心依賴是:
<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.21</version></dependency><!--mysql驅動包--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version></dependency>
使用AOP的依賴是:
<!--AOP聯盟--><dependency><groupId>aopalliance</groupId><artifactId>aopalliance</artifactId><version>1.0</version></dependency><!--Spring Aspects--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.0.2.RELEASE</version></dependency><!--aspectj--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.3</version></dependency>
2、Spring配置項文件配置
我們使用Spring AOP、SpringIoC、Spring JDBC的情況下,我們需要在maven項目中的resources文件下創建Spring的配置項文件,并且進行配置。
Spring.xml的配置如下:
<?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:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 配置數據源 --><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/springjdbc"/><property name="username" value="root"/><property name="password" value="12171032"/></bean><!-- 配置 JdbcTemplate --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean>
</beans>
其中: xmlns:tx="http://www.springframework.org/schema/tx"
是為了防止事務爆紅把必須添加的,不添加使用事務的時候會爆紅。
需要在Spring配置自己的數據庫,以及配置jdbcTemplate,需要將這兩部分交給IoC容器管理。
二、Spring JDBC的使用
該項目的目錄如下創建:
entity目錄中查詢返回來的結果。
dao層用來存放執行和數據庫交互的文件的目錄。
User類創建如下:
package com.example.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private Integer id;private String username;private Date birthday;private String sex;private String address;}
如果想要使用lombok的情況下,就得按照上面情況引入lombok依賴:
建立的數據庫可執行代碼如下(需要自己建立好數據庫,這里只提供創建表的sql語句):
CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(32) NOT NULL COMMENT '用戶名稱',
`birthday` datetime default NULL COMMENT '生日',
`sex` char(1) default NULL COMMENT '性別',
`address` varchar(256) default NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (1,'老王','2018-02-27
17:47:08','男','北京'),(2,'熊大','2018-03-02 15:09:37','女','上海'),(3,'熊二','2018-03-04
11:34:34','女','深圳'),(4,'光頭強','2018-03-04 12:04:06','男','廣州');
Test測試文件:
public class Test1 {private ApplicationContext applicationContext = new ClassPathXmlApplicationContext("Spring.xml");private JdbcTemplate jdbcTemplate = (JdbcTemplate) applicationContext.getBean(JdbcTemplate.class);}
測試文件得利用DI將jdbcTemplate加載到當前文件當中
1、Spring JDBC的增加操作
jdbc中的新增操作:
@Testpublic void add(){String sql = "insert into user(username,sex,address) values('as','男','上海')";jdbcTemplate.execute(sql);}
2、Spring JDBC的修改操作
@Testpublic void update(){String sql = "update user set username ='劉純亞' where id = 1";jdbcTemplate.update(sql);}
3、Spring JDBC的刪除操作
@Testpublic void delete(){String sql = "delete from user where id = ?";jdbcTemplate.update(sql,1);}
4、Spring JDBC的查詢操作
@Testpublic void searchAll(){String sql = "select * from user";List<User> userList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<User>(User.class));for(User user:userList){System.out.println(user);}}
三、Spring JDBC的事務
案列A對B轉賬,A的錢少100,B的錢多100,兩者具有原子性,要不同時成功,要不同時失敗。數據庫中的數據如下:
1、xml的形式進行事務
對Spring.xml進行修改:
<bean id="txtManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><bean id="adaoImpl" class="com.example.dao.impl.AdaoImpl"><property name="jdbcTemplate" ref="jdbcTemplate"></property></bean><tx:advice id="txAdvice" transaction-manager="txtManager"><tx:attributes><tx:method name="transfer" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/></tx:attributes></tx:advice><aop:config><aop:pointcut id="pc" expression="execution(* com.example.dao.impl.AdaoImpl.transfer(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/></aop:config>
<bean id="txtManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean>
用來加載DataSourceTransactionManager,上面的操作是通過AOP對原本的事務進行增強,而不是通過修改原本的代碼。
AOP操作:
<aop:config><aop:pointcut id="pc" expression="execution(* com.example.dao.impl.AdaoImpl.transfer(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/></aop:config>
Adao和Adaoimpl中的代碼如下:
package com.example.dao.impl;import com.example.dao.Adao;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.jdbc.core.JdbcTemplate;
@NoArgsConstructor
@Data
@AllArgsConstructor
public class AdaoImpl implements Adao {private JdbcTemplate jdbcTemplate;@Overridepublic void transfer(String A, String B, int money) {String sql1 = "update peoplemoney set money = money-? where id = ?";String sql2 = "update peoplemoney set money = money+? where id = ?";jdbcTemplate.update(sql1,money,A);jdbcTemplate.update(sql2,money,B);}
}
package com.example.dao;public interface Adao {public void transfer(String A,String B,int money);
}
測試類中的代碼:
@Testpublic void m1(){Adao adaoImpl = (Adao) applicationContext.getBean("adaoImpl");adaoImpl.transfer("1","2",100);System.out.println(adaoImpl);}
當事務沒有回滾的時候,可以實現A減少100,B增加100。
自動添加錯誤之后;
測試結果:
數據庫中的數據沒有發生改變出現了事務回滾。
2、@Transactional注解
AdaoImpl中的代碼修改如下:
package com.example.dao.impl;import com.example.dao.Adao;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@NoArgsConstructor
@Data
@AllArgsConstructorpublic class AdaoImpl implements Adao {private JdbcTemplate jdbcTemplate;@Override@Transactional(rollbackFor = Exception.class)public void transfer(String A, String B, int money) {String sql1 = "update peoplemoney set money = money-? where id = ?";String sql2 = "update peoplemoney set money = money+? where id = ?";jdbcTemplate.update(sql1,money,A);System.out.println(1/0);jdbcTemplate.update(sql2,money,B);}
}
Spring.xml中的代碼修改如下:
<!-- <tx:advice id="txAdvice" transaction-manager="txtManager">-->
<!-- <tx:attributes>-->
<!-- <tx:method name="transfer" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>-->
<!-- </tx:attributes>-->
<!-- </tx:advice>-->
<!-- <aop:config>-->
<!-- <aop:pointcut id="pc" expression="execution(* com.example.dao.impl.AdaoImpl.transfer(..))"/>-->
<!-- <aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>-->
<!-- </aop:config>--><tx:annotation-driven transaction-manager="txtManager"></tx:annotation-driven><context:component-scan base-package="com.example"></context:component-scan>
注釋掉AOP等保留DataSourceTransactionManager,配合@Transactional使用就可以完成事務。